关于 UDEV 的介绍,网上的资料很多,这里就不啰嗦了。英文好的同学也可以用 man udev 来查看系统自带的帮助文档。
- 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 中的参数,如下:
%E{key} | 一个环境变量的值,即通过 udevadm 命令查询出的设备属性 |
%c | PROGRAM 返回的结果 |
%n | 设备的内核号码,例如:sda3 的内核号码是 3 |
上述规则中,iSCSI 设备的 SYMLINK 为 /dev/iscsi/<target name>/part<n>。其中,<n> 为设备的内核号码;<target name> 通过 PROGRAM 指定的脚本获得。
- UDEV 脚本
#!/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 查询到:
# udevadm info --query=property --name=/dev/sdb
脚本解析传入的参数,解析出 Target 的名字,然后组成 LUN 对应设备的符号链接,并返回。
现在,可以登入 iSCSI Target,然后再 /dev/iscsi/ 下查看对应的符号链接了。