2025-12-15

Linux Ubuntu 利用滑鼠側鍵

#安裝工具
 sudo apt install xbindkeys xdotool

#點擊滑鼠側鍵,通常是button 8 或 button 9
xev | grep button

#產生設定檔
xbindkeys --defaults > ~/.xbindkeysrc

#編輯.xbindkeysrc,範例如下:

#button 8 模擬中鍵
"xte 'mouseclick 2'"
b:8 + Release

#button 9 輸出字串
"xdotool type 123456"
b:9 + Release

#button 9 模擬 ctrl+c
"xdotool key ctrl+c"
b:9 + Release

#button  8 模擬 ctrl+v
"xdotool key ctrl+v"
b:8 + Release

#重啟 xbindkeys 載入設定,記得將xbindkeys加到開機啟動
killall xbindkeys && xbindkeys

2025-12-07

Nvidia 顯卡在 Linux Mint / Ubuntu 的 ucsi_ccg_init failed 問題

 dmesg -H -l err 出現以下訊息:

nvidia-gpu 0000:01:00.3: i2c timeout error e0000000
ucsi_ccg 1-0008: i2c_transfer failed -110
ucsi_ccg 1-0008: ucsi_ccg_init failed - -110

這是因為NVIDIA 驅動想透過 I2C 去跟 Type-C 控制晶片(CCG)溝通,但怎麼叫都沒反應,導致一直噴錯誤到 dmesg,這通常 不會影響顯示卡正常運作,只是 log 很醜、偶爾會吵醒系統(影響待機功耗),如果你根本不用 Type-C 充電(或卡上也沒vlink / usb-c DP),可以直接禁掉ucsi_cgg模組/aux i2c/i2c bus:

#方法一,直接關掉ucsi_ccg模組
echo "blacklist ucsi_ccg" | sudo tee /etc/modprobe.d/blacklist-ucsi_ccg.conf

#方法二,關掉aux i2c
echo 'options nvidia NVreg_EnableGpuAuxI2c=0' | sudo tee /etc/modprobe.d/nvidia-fix-i2c-timeout.conf

#方法三,關掉特定 bus
dmesg | grep -i ucsi_ccg #找出哪條噴錯,通常是i2c-10 或 i2c-8
echo 'options nvidia NVreg_RegistryDwords="RMDisableAuxBus=0x10"' | sudo tee /etc/modprobe.d/nvidia-fix-i2c-timeout.conf 

#ramfs update
sudo update-initramfs -u


2025-12-06

Macbook 2012 15" (A1286) 安裝Linux Mint 22 / Ubuntu 24.04

 要解決的問題跟以下這篇差不多:
https://duckfly-tw.blogspot.com/2023/09/macbook-13-2014-ubuntu.html

但還有其它問題:

1.因Macbook 2012 (A1286)有獨顯GT650M,需手動安裝nvidia-470驅動(支援GT650M的最後一版驅動),因上游驅動都變5XX系列了,ubuntu-drivers因顯卡太舊無法安裝驅動,沒安裝nvidia閉源驅動就只能用kernel內建的nouveau開源驅動,效率肯定低。

另外要特別注意的是,nvidia-driver-470只能支援到kernel 6.8.x,再上去dkms driver會無法被新的kernel載入!因此千萬別安裝6.8以上的kernel,即使裝了沒使用也不行(因為會破壞dkms tree造成其它kernel也無法正常運作),如果裝了6.8以上的kernel,務必要移除掉,並重建dkms tree:
sudo dkms autoinstall --all

# 先完全移除 nouveau(黑名單)
sudo rmmod nouveau (若出現無法缷載dkms,略過沒關係)
sudo bash -c "echo blacklist nouveau > /etc/modprobe.d/blacklist-nouveau.conf"
sudo bash -c "echo options nouveau modeset=0 >> /etc/modprobe.d/blacklist-nouveau.conf"
sudo update-initramfs -u

# 加 graphics-drivers PPA(專門放舊版驅動)
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt install nvidia-driver-470

#加裝nvidia-prime nvidia-prime-applet,這樣tool panel才會有nvidia optimus面版可以調整
sudo apt install nvidia-prime nvidia-prime-applet

# 重開機
sudo reboot

# 正確結果會顯示:NVIDIA GeForce GT 650M/PCIe/SSE2  (不再是 NVE7)
glxinfo | grep "OpenGL renderer"


2. 電源管理,安裝下面這個applesmc-next dkms,以便能設定macbook的充電上限:https://github.com/c---/applesmc-next?tab=readme-ov-file
直接複製其bash script以sudo執行後,再複製45-apple的tlp script並重開機:
sudo cp /usr/src/applesmc-next-0.1.6/45-apple /usr/share/tlp/bat.d/

並修改/etc/tlp.conf:
START_CHARGE_THRESH_BAT0=30 #何時開始充電,可能無效
STOP_CHARGE_THRESH_BAT0=80 #何時停止充電

也可以修改以下檔案,設定何時開始充電
sudo echo 80 > /sys/class/power_supply/BAT0/charge_control_end_threshold

再用 tlp-stat -b 檢查設定狀態

或可安裝如Battery Health Charging(使用gnome桌面時)或Slimbook Battery來設定電池的充電上限。

3.原來有多接了一顆hfs+格式的sata硬碟,懶得重新格式化又想在linux上繼續用(預設read only,加force,rw變可讀寫)的話,使用以下選項在fstab掛載:
/dev/disk/by-uuid/<disk-uuid> /mnt/<mount-dir> auto nosuid,nodev,nofail,x-gvfs-show,force,rw 0 0

但如果有不正常關機,導致末正確卸載,檔案系統會標記為「dirty」,下次重新掛載時會強制掛載為唯讀(使用 dmesg | grep -i hfs 檢查),解決方法:

sudo apt install hfsprogs
sudo umount /dev/sdXX (先umount)
sudo fsck.hfsplus -f /dev/sdXX   # -f 強制檢查,即使是 journaled,有提示是否修復按y

4.dmesg出開以下錯誤訊息:
DMAR-IR: [Firmware Bug]: ioapic 2 has no mapping iommu, interrupt remapping will be disabled

#修改/etc/default/grub,修改開機選項
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash irqpoll intremap=off"

5.bcm4311 wifi網卡,如果消失不見、速度很慢或是抓不到5G等問題:
方法一:使用驅動程式管理員,先裝專有驅動看看:
sudo modprobe -r b43 #移除b43開源驅動
sudo apt install broadcom-sta-dkms #或直接裝專有驅動,會自動blacklist b43開源驅動

方法二:移除專有驅動,改裝b43開源驅動及韌體(但可能會無法使用5Ghz)
sudo apt purge broadcom-sta-dkms 
sudo apt install b43-fwcutter
wget https://github.com/minios-linux/b43-firmware/releases/download/b43-firmware/broadcom-wl-6.30.163.46.tar.bz2
tar jxvf broadcom-wl-6.30.163.46.tar.bz2
sudo b43-fwcutter -w /lib/firmware broadcom-wl-6.30.163.46.wl_apsta.o
sudo modprobe -r b43
sudo modprobe b43

只是用開源驅動,查看支援頻段,5Ghz可能會不見:
iwlist freq

可試著修改 /etc/modprobe.d/blacklist.conf 啟用bcm43xx,並停用b43試試:
#blacklist bcm43xx
blacklist b43

方法三:新的6.17 kernel安裝broadcom-sta-dkms專有驅動會出問題,
可改用noble-proposed修正過的deb:
https://archive.ubuntu.com/ubuntu/pool/restricted/b/broadcom-sta/broadcom-sta-dkms_6.30.223.271-23ubuntu1.2_all.deb

https://blog.abysm.org/2026/02/fixing-broadcom-sta-dkms-on-ubuntu-noble/
https://github.com/n-s-kiselev/macbook-linux-bcm4331-wifi-fix
https://github.com/minios-linux/b43-firmware/releases
https://wiki.archlinux.org/title/Broadcom_wireless#b43

ref:
https://wiki.archlinux.org/title/MacBookPro8,x
https://askubuntu.com/questions/767850/firmware-bug-ioapic-2-has-no-mapping-iomm-after-kernel-update

2025-03-26

bind9使用nsupdate+acme.sh申請免費憑證

1.首先要讓bind有ddns的功能,即允許外部使用key來動態更新A或TXT等record ,

先建立key:
=====================================
b=$(dnssec-keygen -a hmac-sha512 -b 512 -n USER -K /tmp foo)

cat > /etc/named/keys/update.key <<EOF
key "mykey" {
    algorithm hmac-sha512;
    secret "$(awk '/^Key/{print $2}' /tmp/$b.private)";
};
EOF
rm -f /tmp/$b.{private,key}

===把key檔路徑include進named的設定中==
include "/etc/named/keys/update.key";
=====================================
然後把domain獨立切出一個zone(範例是只允許TXT紀錄,因為只是要用來申請免費憑證):

=====================================
zone "yourdomain.com" {
    type master;
    file "/path/to/your/zone/file"; 
    update-policy {
        grant "mykey" subdomain yourdomain.com. TXT;
    };
};
==zone file,若無dns沒a紀錄沒有關係=======================

$TTL 86400
@   IN  SOA     ns.yourdomain.com. admin.yourdomain.com. (
                2023101001 ; Serial number
                3600       ; Refresh interval (one hour)
                1800       ; Retry interval (30 minutes)
                1209600    ; Expire time (two weeks)
                86400      ; Minimum TTL (one day)
)

@  IN A 1.2.3.4
* IN A 1.2.3.4
=====================================

安裝acme.sh(一般使用者即可,當然用root會更方便些):
curl https://get.acme.sh | sh -s email=my@yourdomain.com

wget -O -  https://get.acme.sh | sh -s email=my@yourdomain.com

建立帳號並決定使用哪個免費憑證服務(預設zerossl):
acme.sh  --register-account  -m myemail@yourdomain.com --server zerossl
如要用letsencrypt的話:
acme.sh --set-default-ca  --server letsencrypt
acme.sh  --register-account  -m myemail@yourdomain.com --server letsencrypt

設定讓acme.sh自動更新:
acme.sh --upgrade --auto-upgrade

開始申請憑證(此範例為申請wildcard憑證),此處的key格式要與named include的一樣就可以了:
export NSUPDATE_SERVER="dns.yourdomain.com"
export NSUPDATE_KEY="/path/to/your/update.key"
export NSUPDATE_ZONE="yourdomain.com"

~/.acme.sh/acme.sh --issue --dns dns_nsupdate -d yourdomain.com -d *.yourdomain.com --renew-hook "/path/to/install_cert.sh"

上面指令中的install_cert.sh即憑證renew成功後要執行的動作(複製憑證+重啟web):
憑證申請成功後,先手動複製憑證+重啟web(做第一次即可)
~/.acme.sh/acme.sh --install-cert -d yourdomain.com --key-file /certs/path/yourdomain.com/key.pem --fullchain-file /certs/path/yourdomain.com/fullchain.pem --reloadcmd "sudo systemctl restart nginx.service"

因為要讓一般使用者可以重新啟動web server,需加上sudoer:
#/etc/sudoers.d/acme_install_cert
username ALL=(ALL) NOPASSWD: /bin/systemctl restart nginx.service

或者不用sudoers,改用systemd最新的run0也行(systemd v256才開始支援):
1. 建立一個 Polkit (PolicyKit)規則檔案:/etc/polkit-1/rules.d/10-manage-nginx.rules
2.貼上以下內容:

polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.systemd1.manage-units" &&
        action.lookup("unit") == "nginx.service" &&
        action.lookup("verb") == "restart" &&
        subject.user == "username") {
        return polkit.Result.YES;
    }
});

3. --reloadcmd 參數改為 "systemctl restart nginx.service" 即可  (即把開頭sudo拿掉)

這樣以後每60天會自動renew憑證,且會自動複製憑證並重啟web server。

其它:
安裝acme.sh時,會自動在使用者的crontab加上以下指令,固定每天檢查憑證:
51 1 * * * "/home/username/.acme.sh"/acme.sh --cron --home "/home/username/.acme.sh" > /dev/null

~/.acme.sh/account.conf 在申請憑證完後,會把一開始export的環境變數儲存在這裡,其它設定也會放在這個檔

~/.acme.sh/yourdomain.com_ecc/yourdomain.com.conf 會放一些跟這個網域有關的設定,如
Le_API=使用的憑證廠商api
Le_RenewHook=renew hook
Le_RealKeyPath=key要複製的路徑
Le_RealFullChainPath=fullchain要複製的路徑
Le_ReloadCmd=重啟指令

ref:
https://github.com/acmesh-official/acme.sh/wiki/dnsapi#7-use-nsupdate-to-automatically-issue-cert
https://github.com/acmesh-official/acme.sh/wiki/Server
https://ezbox.idv.tw/180/bind-ddns-dynamic-dns/
https://cwza.github.io/my_blog/2015/12/02/Bind9%E7%9A%84Dynamic-Dns-Update%E8%A8%AD%E5%AE%9A%E7%AD%86%E8%A8%98/
https://ithelp.ithome.com.tw/articles/10062006
https://n.sfs.tw/content/index/11984?u=
https://bugs.launchpad.net/ubuntu/+source/bind9/+bug/2015176
https://www.hobrasoft.cz/en/blog/bravenec/acme-sh-renew-hook

2024-09-13

TOMCAT設定特定目錄不得執行JSP及JSPX

如果網站允許使用者上傳檔案,通常會禁止上傳可執行檔(如jsp & jspx),

除了檢查副檔名外,也可在app的web.xml加上以下設定,讓jsp/jspx變成唯讀:

<servlet>

        <servlet-name>DefaultServlet</servlet-name>

        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>

        <init-param>

            <param-name>readonly</param-name>

            <param-value>true</param-value>

        </init-param>

        <load-on-startup>1</load-on-startup>

    </servlet>

    <servlet-mapping>

        <servlet-name>DefaultServlet</servlet-name>

        <url-pattern>/path/to/upload/*</url-pattern>

    </servlet-mapping>


但像jspx一般也很少人會去寫,建議直接在tomcat/conf/web.xml禁用:

<servlet-mapping>

        <servlet-name>jsp</servlet-name>

        <url-pattern>*.jsp</url-pattern>

        <!--<url-pattern>*.jspx</url-pattern>-->

 </servlet-mapping>

2024-07-16

letsencrypt憑證更新後,但伺服器(nginx/apache/tomcat)不會autoreload

letsencrypt更新了憑證後,web server並不會知道憑證要重新讀取, 此時可利用letsencrypt的hooks機制,

以nginx為例,在以下路徑寫一個可執行的shell script: 
/etc/letsencrypt/renewal-hooks/deploy/01-reload-nginx 
 ============================ 
#! /bin/sh 
set -e 
nginx -t
systemctl reload nginx
============================ 

2023-09-18

Ubuntu/Linux Mint在 Macbook 13" 2014 的無線網卡/麥克風/風扇/攝影機設定

0.無線網卡:
因為broadcom的網卡driver不是開源而是專有的,所以用以下指令自動安裝(如nvidia driver也是):
sudo ubuntu-drivers autoinstall

1.修正line-in麥克風:
找到 mbp 2014 13"的機型識別碼:MacBookPro11,1

再找到 driver 為 Cirrus Logic CS4208 = mbp11

修改  /etc/modprobe.d/alsa-base.conf ,新增:
options snd-hda-intel model=mbp11

2.修正風扇不正常問題:
sudo apt install mbpfan
sudo systemctl status mbpfan

避免風扇時不時狂轉,修改/etc/mbpfan.conf:
min_fan1_speed = 2000
max_fan1_speed = 3500
...
polling_interval = 5

3.修正facetime webcam:

直接使用該ppa:
https://launchpad.net/~greg-whiteley/+archive/ubuntu/facetimehd

sudo add-apt-repository ppa:greg-whiteley/facetimehd
sudo apt install facetime-dkms facetime-firmware
sudo dkms autoinstall (有更換kernel的話)
sudo reboot

===== 以下僅適用於舊的dkms及舊的kernel =======

如果是iSight鏡頭(通常是2005~2010的macbook,如果不是請略過):
下載文章附件的AppleUSBVideoSupport,解壓縮:
https://www.linux.org/threads/installing-linux-on-an-imac.26009/
sudo apt install isight-firmware-tools
指向剛剛的AppleUSBVideoSupport檔案

安裝facetime camera firmware:
sudo apt install curl xzcat cpio git
git clone https://github.com/patjak/facetimehd-firmware.git
cd facetimehd-firmware
make
sudo make install

安裝facetime camera driver:
git clone https://github.com/patjak/bcwc_pcie.git
apt install debhelper dkms
mkdir /usr/src/facetimehd-0.1
cd bcwc_pcie
cp -r * /usr/src/facetimehd-0.1/
cd /usr/src/facetimehd-0.1/
make clean
dkms add -m facetimehd -v 0.1
dkms build -m facetimehd -v 0.1
dkms mkdsc -m facetimehd -v 0.1 --source-only
dkms mkdeb -m facetimehd -v 0.1 --source-only
cp /var/lib/dkms/facetimehd/0.1/deb/facetimehd-dkms_0.1_all.deb /root/
rm -r /var/lib/dkms/facetimehd/
dpkg -i /root/facetimehd-dkms_0.1_all.deb

ref:
https://askubuntu.com/questions/1430547/webcam-not-working-in-ubuntu-22-04-on-macbook-air
https://github.com/patjak/facetimehd/wiki/Installation#get-started-on-debian
https://github.com/linux-on-mac
https://support.apple.com/zh-tw/HT201300
https://askubuntu.com/questions/984239/no-microphone-picked-up-on-ubuntu-16-04-on-macbook-pro
https://www.kernel.org/doc/html/latest/sound/hd-audio/models.html