
我正在嘗試在 RHEL7 上配置 udev,以便為特定閃存驅動器分配特定的 /dev 名稱(即 /dev/backup1 、 /dev/backup2...) - 我意識到我無法控制 / dev/sdx 分配,但我嘗試使用udev 規則設定自動符號連結。
blkid 給了我:
/dev/sdi1: LABEL="Samsung USB" UUID="64A5-F009" TYPE="exfat"
/dev/sdj1: LABEL="Samsung USB" UUID="64A5-F009" TYPE="exfat"
/dev/sdk1: LABEL="Samsung USB" UUID="64A5-F009" TYPE="exfat"
我想做類似的事情:在我的規則文件中
KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/lib/udev/scsi_id --whitelisted --replace-whitespace --device=%N", RESULT=="64A5-F009", SYMLINK+="backupkeya%n"
但由於所有三個 USB 隨身碟都有相同的 uuid - 我希望特定的隨身碟連結到特定的虛擬裝置名稱。因此,如果我插入標有“drive2”的那個,它將連結到/dev/backupkeyb。現在我們有 3 個閃存驅動器 - 但希望擴展到大約 8 個。
udevadm 給了我一些獨特性...
[root@alpha2 mnt]# udevadm info /dev/sdg | grep "ID_SERIAL_SHORT"
E: ID_SERIAL_SHORT=0305119070014252
[root@alpha2 mnt]# udevadm info /dev/sdi | grep "ID_SERIAL_SHORT"
E: ID_SERIAL_SHORT=0330219070015017
[root@alpha2 mnt]# udevadm info /dev/sdj | grep "ID_SERIAL_SHORT"
E: ID_SERIAL_SHORT=0305119070014208
我將 udev 規則改為讀取 (/etc/udev/rules.d/99-symlink.rules)
KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/bin/udevadm info --name=%N", RESULT=="0305119070014208", SYMLINK+="backupkeyc%n"
但是,當我插入具有 ...4208 序號的金鑰時 - 沒有建立 /dev/backupkeyc 符號連結。我懷疑這是因為 udevadm 語句的輸出與我的 RESULT== 不完全匹配
我創建了一個腳本 /usr/local/udevinfo 並更改了 PROGRAM=="/usr/local/udevinfo %N" 如下,以免混淆 udev 規則...在我放入閃存驅動器後 - 沒有符號鏈接 -但更重要的是/tmp/passeddata 中沒有任何內容應該包含設備名稱- 所以看起來udev 規則從未運行過?
echo "$1" >> /tmp/passeddata
udevadm info --name=$1 | grep "ID_SERIAL_SHORT" | awk -F= '{print $2}'
我錯過了什麼嗎?有什麼更簡單的方法來完成我想做的事嗎?
答案1
是的,這不是完全匹配,因為“udevadm info”輸出大量資訊 - 不僅僅是序號。
但是,您在“udevadm info”中看到的任何內容都是透過設定udev 自行規則(通常透過呼叫 udev 內建函數)。因此序號已經可以使用,ENV{ID_SERIAL_SHORT}=="..."
無需呼叫外部程式。 (這就是「E:」前綴實際表示的意思。)
KERNEL=="sd*", SUBSYSTEM=="block", ENV{ID_SERIAL_SHORT}=="0305119070014208", SYMLINK+="backupkeyc"
(事實上,「udevadm info」可能不起作用根本不在規則處理期間。 udev 規則中的一個常見錯誤是嘗試使用本身只能從「規則完成」訊號取得資訊的工具。
答案2
我完全同意@grawity的答案,即不使用腳本來解決此類解決方案,而直接使用環境。但對於其他方面:
程式的語法是正確的,您編寫和運行的方式都是正確的。也許您的意思是文件中沒有任何內容是未建立的文件?所以它缺少 shebang 行(如您的程式碼片段所示)或執行權限?否則它應該以這種方式工作 - 並且您甚至不需要傳遞任何參數,因為 udev 知道的所有資訊都可以在環境中作為變數使用。因此,當 udev 規則 PROGRAM 語句呼叫時,腳本可以存取它們。
但採用不同的方法應該更方便和通用:
不要使用設備的序號,而是為它們分配UUID 或分區標籤(或兩者都分配,以降低插入具有相同UUID 或分區標籤的任何其他內容的可能性) )。因此,只需重新標記分割區或重新格式化它們即可設定新的“UUID”。如果您不想重新格式化,您也可以修補現有分割區中的 UUID 資訊(我不知道有什麼工具可以為您執行此操作,但編寫您自己的工具非常簡單)。
這樣您就可以在不修改系統的情況下替換目標。或例如在池中添加更多木棍。
在這種情況下,您甚至可能更喜歡使用一個小 PROGRAM 腳本,將特定格式的分割標籤轉換為特定格式的符號連結名稱。
另一種(如果可行,最標準的符合方法)可能是在裝置上使用 GPT 並為您的用例分配一些特定的分區類型和 -UUID 組合 - 可能是其他分區名稱。