一、 问题:udev如何调试,如何看udev的输出日志?udev调试的坑?
二、结论:
环境centos6
启动:start_udev 调试日志,设置udev.conf 为udev_log="debug" ,日志输出在/var/log/message
(1)注意2点:rule启动有顺序的,假设你增加iscsi link,那你的必须要先加载网络,70网络之后,你再执行你添加iscsi link的脚本,否则rule脚本无效
(2)假如你现在给设备添加一个link name,当你编写好rule脚本后,调用调用start_dev,你会发现,在/var/log/message 看不到脚本执行的日志。原因是如果已经有link name,udev是会忽略的。这样如果脚本编写有问题,对调试是不利的,所以需要重启,可以看到完整的udev脚本执行日志输出。
三、具体例子分析过程
用 UDEV 固定 iSCSI 设备名称
用 open-iscsi 连上 Target 之后,iSCSI 设备的名称在系统里总是变来变去,无法固定,这给应用带来了诸多不便。为了固定系统中 iSCSI 设备的名称,可以考虑使用Linux 2.6 内核引入的 UDEV 机制。
[root@rac1 rules.d]# cat 95-openiscsi.rules
KERNEL=="sd*", ENV{ID_PATH}=="ip-*", BUS=="scsi", PROGRAM="/etc/udev/scripts/iscsidev2.sh %E{ID_PATH}", SYMLINK+="iscsi/%c/part%n"
[root@rac1 rules.d]# cat /etc/udev/scripts/iscsidev2.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}
规则中以"%"开始的是 UDEV 中的参数,如下:
[table]
|%E{key}|一个环境变量的值,即通过 [color=red]udevadm[/color] 命令查询出的设备属性
|%c|PROGRAM 返回的结果
|%n|设备的内核号码,例如:sda3 的内核号码是 3
重启就会看到详细日志输出(设置log为debug),以下是正确添加link的日志:
[root@rac1 ~]# tail -5000 /var/log/messages |grep "/etc/udev/scripts/iscsidev2"
Mar 31 11:04:27 rac1 udevd-work[1656]: PROGRAM '/etc/udev/scripts/iscsidev2.sh ip-172.16.27.38:3260-iscsi-iqn.2006-01.com.openfiler:racdb.data1-lun-0' /etc/udev/rules.d/95-openiscsi.rules:2
Mar 31 11:04:27 rac1 udevd-work[1656]: '/etc/udev/scripts/iscsidev2.sh ip-172.16.27.38:3260-iscsi-iqn.2006-01.com.openfiler:racdb.data1-lun-0' started
Mar 31 11:04:27 rac1 udevd-work[1645]: '/etc/udev/scripts/iscsidev2.sh' (stdout) 'iqn.2006-01.com.openfiler:racdb.crs1/lun0'
Mar 31 11:04:27 rac1 udevd-work[1645]: '/etc/udev/scripts/iscsidev2.sh ip-172.16.27.38:3260-iscsi-iqn.2006-01.com.openfiler:racdb.crs1-lun-0' returned with exitcode 0
Mar 31 11:04:27 rac1 udevd-work[1656]: '/etc/udev/scripts/iscsidev2.sh' (stdout) 'iqn.2006-01.com.openfiler:racdb.data1/lun0'
Mar 31 11:04:27 rac1 udevd-work[1656]: '/etc/udev/scripts/iscsidev2.sh ip-172.16.27.38:3260-iscsi-iqn.2006-01.com.openfiler:racdb.data1-lun-0' returned with exitcode 0
[root@rac1 ~]# ls /dev/iscsi/
iqn.2006-01.com.openfiler:racdb.crs1 iqn.2006-01.com.openfiler:racdb.data1 iqn.2006-01.com.openfiler:racdb.data2 iqn.2006-01.com.openfiler:racdb.fra1
(1)以上是我花了4个小时调试出来的结果。假设你把95-openiscsi.rules重命名成55-openiscsi.rules,然后你会发现,你是怎么得不到上面link 结果的。
iqn.2006-01.com.openfiler:racdb.crs1 。
原因是:因为创建iscsi需要网络的支持,所以应该在70-persistent-net.rules之后执行。
(2)假设你要执行的脚本没有执行权限,会发生什么?很明显udev不能调用,日志就应该打印出错误消息。那这里有一个坑,如果你重新使用命令start_udev,message日志
里面是没有错误消息的。必须要重启。
原因是:udev 会忽略已经创建的link,这个时候就不好调试了,需要重启,才能看到错误日志 returned with exitcode 2
(3)start_udev,这个命令是重新加载一遍设备命名,有一个坑就是上面的,如果已经有了的设备命名,它是不会去重新加载,也不会在message打印日志。当发生错误的时候,
我们都不知道错误在哪里。这个是我认为调试的一个坑。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30393770/viewspace-2765904/ ,如需转载,请注明出处,否则将追究法律责任。