用 open-iscsi 連上 Target 之後,iSCSI 設備的名稱在系統裏總是變來變去,無法固定,這給應用帶來了諸多不便。爲了固定系統中 iSCSI 設備的名稱,可以考慮使用Linux 2.6 內核引入的 UDEV 機制。
關於 UDEV 的介紹,網上的資料很多,這裏就不囉嗦了。英文好的同學也可以用 man udev 來查看系統自帶的幫助文檔。
UDEV 規則文件
UDEV 相關的配置文件、規則文件和腳本等的位置在不同系統上不盡相同,可以通過 man udev 查到。在 CentOS 上,這些文件均位於 /etc/udev 目錄下。
UDEV 規則文件必須以 .rules 結尾,開始的數字代表規則執行的優先級,數字越小,優先級越高。當然,也可以不指定數字。
好了,廢話不多說,直接上規則:
KERNEL=="sd*", BUS=="scsi", ENV{ID_PATH}=="ip-*", PROGRAM="/etc/udev/scripts/iscsidev.sh %E{ID_PATH}", SYMLINK+="iscsi/%c/part%n"
注意:規則文件中的一條規則必須在同一行內,不允許跨行。
上述規則中,"==" 爲條件判斷,"KERNEL"、"BUS"、"ENV{ID_PATH}"爲規則必須滿足的條件。這3個條件可以確認一個 iSCSI 設備或分區。其中,"ENV{ID_PATH}"表示設備的 ID_PATH 屬性,該屬性在 CentOS 中爲 "ip-" 開頭的字符串。
PROGRAM 指定滿足規則後執行的腳本程序,SYMLINK 表示滿足規則後創建指定該設備的符號鏈接。SYMLINK 默認創建在 /dev 目錄下,所以這裏只給出了相對路徑。
規則中以"%"開始的是 UDEV 中的參數,如下:
細的參數說明,可以查看 UDEV 的系統幫助(man udev),也可以參考簡述udev的自定義規則。
上述規則中,iSCSI 設備的 SYMLINK 爲 /dev/iscsi/<target name>/part<n>。其中,<n> 爲設備的內核號碼;<target name> 通過 PROGRAM 指定的腳本獲得。
UDEV 腳本
iscsidev.sh 腳本的內容如下:
#!/bin/sh
# File: /etc/udev/scripts/iscsidev.sh
TARGET_NAME=`/bin/echo $1 | /bin/awk -F"-iscsi-" '{print $2}' | /bin/awk -F"-lun-" '{print $1"/lun"$2}'`
/bin/echo ${TARGET_NAME}
腳本的傳入參數爲設備的 ID_PATH 屬性,其格式爲 ip-<server ip>:<port>-iscsi-<target name>-lun-<lun id>,可以通過udevadm 查詢到:
腳本解析傳入的參數,解析出 Target 的名字,然後組成 LUN 對應設備的符號鏈接,並返回。
現在,可以登入 iSCSI Target,然後再 /dev/iscsi/ 下查看對應的符號鏈接了。