ITPub博客

首页 > Linux操作系统 > Linux操作系统 > udev如何调试,如何看udev的输出日志?udev调试的坑?

udev如何调试,如何看udev的输出日志?udev调试的坑?

原创 Linux操作系统 作者:e71hao 时间:2021-03-31 14:09:43 0 删除 编辑

一、 问题: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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-08-05

  • 博文量
    133
  • 访问量
    235585