Linux

如何將 udev 規則應用於未分區的本地磁碟?

  • June 26, 2022

我在udev中做了這個配置:

KERNEL=="sdd", SYMLINK+="QUORUML", OWNER="test", GROUP="gtest", MODE="0660"
KERNEL=="sde", SYMLINK+="QUORUMR", OWNER="test", GROUP="gtest", MODE="0660"

之後,我添加了其他磁碟,新磁碟變成了舊/dev/sde磁碟,因此上面的 udev 規則變得錯誤,因為名稱已更改為. 如何確保正確的磁碟?有其他的身份證嗎?我試過類似的東西,但由於沒有分區,它不會返回任何 id。/dev/sde``/dev/sdf``sde``sdf``blkid

[root@dbnode1 rules.d]# blkid /dev/sdd
[root@dbnode1 rules.d]#

當有 iscsi 磁碟時,我會尋找類似的東西,我們可以使用 iscsi id 來做到這一點:

KERNEL=="sd?1", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/$parent", RESULT=="360014054187384e668f45e58d036f19a", SYMLINK+="disk4", OWNER="xxxx", GROUP="xxxx", MODE="0660"

無論如何,您應該匹配SUBSYSTEM=="block", ENV{ID_SERIAL}=="xxx"(品牌/型號和序列號)。或ENV{ID_SERIAL_SHORT}(僅序列號)。或ENV{ID_WWN}(驅動器的全域唯一標識符)。或者也許ENV{ID_PART_TABLE_UUID}

我傾向於使用它,ID_SERIAL_SHORT因為它的獨特性足以滿足我的需求(驅動器製造商往往不會重複使用序列號,並且不同製造商的序列號有不同的樣式),而且它是我列印在粘性標籤上的,因此我可以輕鬆辨識我的驅動器熱插拔托架。我不使用 WWN,因為 IMO 它們看起來太相似了,很難相互區分。

明確不保證設備名稱在重新啟動後仍然存在 - 它們通常會保持數月甚至數年不變,但依賴它是不安全的。核心開發人員多次記錄並聲明,不能保證下次啟動時它們不會更改。為什麼?因為驅動器可能會死掉(或者當核心掃描設備時只需要更長的時間來啟動或響應),您可能會添加或刪除驅動器,新的核心版本可能會以不同的順序檢測設備,或者任何數量的其他原因。這就是為什麼多年來的建議不要在 . 中使用 /dev/sdX 名稱/etc/fstab。使用 UUID 或 LABEL”。使用唯一標識符的相同建議適用於 udev 規則。

您可以使用 .找到任何給定驅動器的屬性udevadm info /dev/sdX。那裡有很多有趣和有用的屬性/屬性,但現在我只對序列號感興趣。

例如,我的系統上有一個 8TB 希捷硬碟,目前是/dev/sda. 我可以通過以下方式找到它的短序列號:

$ udevadm info -q property --property=ID_SERIAL_SHORT /dev/sda 
ID_SERIAL_SHORT=ZA9EL9YL

將它與 udev 規則一起使用如下所示:

SUBSYTEM=="block", ENV{ID_SERIAL_SHORT}=="ZA9EL9YL", SYMLINK+="QUORUML", OWNER="test", GROUP="gtest", MODE="0660"

注意==前兩個屬性,它們是比較而不是賦值(參見man 7 udev,尤其是Operators小節)。

如果我想要帶有型號等的完整序列號,我可以使用以下程式碼:

$ udevadm info -q property --property=ID_SERIAL /dev/sda 
ID_SERIAL=ST8000VN0022-2EL112_ZA9EL9YL

udev 規則是這樣的:

SUBSYTEM=="block", ENV{ID_SERIAL}=="ST8000VN0022-2EL112_ZA9EL9YL", SYMLINK+="QUORUML", OWNER="test", GROUP="gtest", MODE="0660"

如果我正在為一個特定設備(或設備類型)制定 udev 規則,我發現udevadm info /dev/name在規則文件中添加註釋掉的輸出版本很有用,以防我需要它以供將來參考。用於#評論。


順便說一句,如果需要,您可以使用以下工具單獨提取值(沒有屬性名稱)awkcut

$ udevadm info -q property --property=ID_SERIAL_SHORT /dev/sda | awk -F= '{print $2}'
ZA9EL9YL

$ udevadm info -q property --property=ID_SERIAL_SHORT /dev/sda | cut -d= -f2
ZA9EL9YL

引用自:https://unix.stackexchange.com/questions/707567