来源于http://blog.itpub.net/14184018/viewspace-1364944/
关于RHEL 5 下scsi_id 无返回值的问题解决(2) 完全解析 2014-12-11 20:08:02
分类: Linux
使用 udev 高效、动态地管理 Linux 设备文件
http://blog.itpub.net/14184018/viewspace-701677/
关于RHEL 5 下scsi_id 无返回值的问题解决(1)
http://blog.itpub.net/14184018/viewspace-701675/
一号方案
在"关于RHEL 5 下scsi_id 无返回值的问题解决"一问中,已经给出了scsi_id命令常见的一些错误和问题的解决办法,但是常有网友咨询:“不知道为什么就是无返回值”这个问题,以前工作的同学也遇到过这个问题;遗憾的是我始终没有接触过有问题的机器,在本地尝试多次又无法重现故障,导致没办法解决这个很困扰人的问题。幸运的是,网友Solomon 遇到了这个问题,同时也允许我远程连接操作,解决故障。
简单检查后,发现scsi_id命令确实无返回,如下图
因为是虚拟机,可能产生的原因太多,而且考虑到大家的环境都不一样,有没有更方便一些的替代方法呢?
从udev的运行过程来想办法!
大家可能都知道udevtest这个命令,它会模拟udev的工作流程,测试一下udev绑定是不是正确。在它工作时,会读取wwid,并且在结果输出时print出来,如下图
我们发现了什么?给一张scsi_id输出正常的对比一下,见下图:
这张图红箭头部分是wwid,再仔细看,run_program后面不一样啊,突然明白了~大家注意看2张图的区别:
BUS==“***”的部分:
scsi_id 命令 无返回值的是ata,有返回值的scsi;
run_program:部分:
无返回值的是 /lib/udev/ata_id /dev/hda ,有返回值的是 /lib/udev/scsi_id -g -x -s
看到这里,大家明白了吗?
原来ata总线的wwid和scsi总线的wwid要用不同的命令!
换正确命令试试:
/lib/udev/ata_id /dev/hda (注意:ata_id命令要使用 /dev/hda 这样的磁盘路径!使用/block/hda这种路径是无效的!)
ok,wwid出来了~问题完美解决了!需要额外注意的是,udev规则里的PROGRAM部分要想应更改!如下:
scsi总线的应该不会遇到问题,udev规则不用更改
KERNEL=="sd*", PROGRAM=="/lib/udev/scsi_id -g -s %p", \ RESULT=="35000c50xxxa7ef67", NAME +="root_disk%n" |
ata总线的要改 规则:
KERNEL=="hd*", PROGRAM=="/lib/udev/ata_id /dev/%k", \ RESULT=="35000c50xxxa7ef67", NAME +="root_disk%n" |
P.S. 如果规则里有“BUS==“***””的规则,要注意,hd*的设备的bus不是ata,而是ide (小写)! 2014年12月12日勘误。)
我估计大部分人遇到scsi_id无返回问题的应该都是用虚拟机做实验的,磁盘方面可能没注意选成了ata(IDE)模式,导致这个问题的出现。
二号方案(有可能出问题,不建议生产环境使用)
如果发现一号方案中所说的原因也无法解决你的问题,scsi_id和ata_id都无返回值,这时有2个方法,1个就是按1号方案的思路看看能不能自己解决,第2个就是二号方案了:不使用wwid作为唯一标识!
在 udevinfo 命令获取的信息中,有这2项信息 SYSFS{start}=="xx"和SYSFS{size}=="xxxxxx ",如下图(用scsi做的测试,ata一样):
注意, SYSFS{start} 只有在分区信息里才有(hda1、hda2......),也就是说,命令要是下面这样:
udevinfo -a -p /sys/block/sda/sda1
而不能是: udevinfo -a -p /sys/block/sda
我们用这2个参数来 标识设备,但这样就会带来一个问题,这2个参数有几率重复,出现不唯一的情况,这时udev的目的就无效了,所以, 使用2号方案 ,要提前做好规划, 确保同一环境(本机、 集群、共享磁盘、划分的LUN 等 ) 每个磁盘或LUN的size不一致! 这样才能起到唯一标识的作用!
udev rules文件内容如下:
KERNEL=="sd*[0-9]", SUBSYSTEM=="block", SYSFS{size}=="208782", SYSFS{start}=="63" , NAME="asmdisk-crs1", OWNER="grid", GROUP="asmadmin", MODE="0660"
或
KERNEL=="hd*", SUBSYSTEM=="block", SYSFS{size}=="208782", SYSFS{start}=="63", \ RESULT=="35000c50xxxa7ef67", NAME ="root_disk1" |
udev rules规则部分根据需要大家自己编写,上面只是例子,不适用于所有人,我在有些rac生产库就会使用如下的规则,更严谨一些:
(请详细阅读“使用 udev 高效、动态地管理 Linux 设备文件”中udev匹配规则部分,这样能保证你的匹配规则文件更适用于你的环境。2014年12月12日勘误)
本博客原创内容仅代表本人观点,因技术水平有限,难免有错漏之处,如发现有错漏问题,请不吝赐教,留言站短均可,谢谢。
大家如有疑问也请留言,不定期回复。
话说回来,网上关于wwid、uuid、scsi_id、ata_id、udev相关的资料在真的很难找到,大家有推荐的资料地址或书籍名称请给我留言,谢谢。