我想在熱插拔驅動器(特定驅動器或任何驅動器)時自動運行特定命令。我正在運行一個無頭 Debian 系統。
更具體地說,我想自動安裝驅動器。我可以使用 AutoFS 來完成此操作,但這是一個 Truecrypt 驅動器,據我所知,AutoFS 無法與此驅動器一起使用。因此,每當連接驅動器時,我都需要執行某種腳本,這將檢測驅動器並運行必要的命令。
如何在連接驅動器時自動執行某些操作?話又說回來,我該如何做其他事情來回應驅動器被刪除的情況呢?
答案1
這實際上很簡單:您需要編寫一個自訂 udev 規則,您可以將其放入
/etc/udev/rules.d/10-local.rules
這樣做的優點是您的自訂規則將在其他規則之前被讀取。
該文件將包含這種形式的單行
<conditions to be met> KERNEL=="sd?1", NAME="my_usb_adapter", RUN+="/home/my_name/bin/my_program"
這句話的意思是:
- 「要滿足的條件」是特定於您的磁碟的許多條件,它們唯一地標識它,以便在插入不同的 HDD 時不會執行任何操作;
- KERNEL=="sd?1" 告訴 udev 只有在偵測到新分割區 /dev/sda1、/dev/sdb1,... 時才開始檢查此規則。如果需要,您可以不使用分區而是使用裝置執行相同的操作,在這種情況下 KERNEL==“sd?”是適當的陳述。
- NAME="my_usb_adapter" 將在 /dev/my_usb_adapter 處建立持久節點,以便您知道在哪裡可以找到要安裝的 dev(如果您需要掛載它)。
- RUN規則是不言而喻的。請記住使
my_program可執行檔無需終端輸入或輸出。
您可以透過以下命令取得執行配對所需的資訊:
udevadm info -a -p $(udevadm info -q path -n /dev/sdb)
如果您的磁碟是 /dev/sdb,則根據您的需求進行修改。這將提供大量資訊。我會尋找
ATTRS{idVendor}=="18a5"
ATTRS{idProduct}=="0302"
ATTRS{serial}=="TT0E4E008XW3DT9H"
(這些值適用於我的 USB 加密狗之一,您的值會有所不同)。一個重要的警告:匹配規則必須來自同一父設備,不能混合使用它們。
現在我們可以將最終規則寫成:
ATTRS{idVendor}=="18a5", ATTRS{idProduct}=="0302", ATTRS{serial}=="TT0E4E008XW3DT9H", KERNEL=="sd?1", NAME="my_usb_adapter", RUN+="/home/my_name/bin/my_program"
請記住,udev 檔案不能斷行:如果這樣做,udev 會將斷行視為兩個單獨的規則。您的終端不會有任何輸出。另外,我在區分=、==和:時非常小心,+=請確保您在這方面沒有引入任何錯誤。


