用 UDEV 固定 iSCSI 設備名稱

用 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 查詢到: 

eae770df-3aa5-3755-b33f-044897a74b30.png


腳本解析傳入的參數,解析出 Target 的名字,然後組成 LUN 對應設備的符號鏈接,並返回。 
    現在,可以登入 iSCSI Target,然後再 /dev/iscsi/ 下查看對應的符號鏈接了。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章