关于RHEL 5 下scsi_id 无返回值的问题解决(2) 完全解析

来源:互联网 发布:知乎js游戏引擎 编辑:程序博客网 时间:2024/04/28 11:24

来源于http://blog.itpub.net/14184018/viewspace-1364944/


关于RHEL 5 下scsi_id 无返回值的问题解决(2) 完全解析2014-12-11 20:08:02

分类: Linux

本文是在前文基础上完善的解决方案,建议先浏览前文,无法解决再使用本替代方案。建议使用本方案中一号方案(依然是使用wwid),不推荐二号方案。(2014年12月12日勘误,感谢网友Solomon的测试发现了原文的错误
使用 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 %p", \ RESULT=="35000c50xxxa7ef67", NAME +="root_disk%n"(2014年12月12日勘误)    KERNEL=="hd*", PROGRAM=="/lib/udev/ata_id /dev/%k", \ RESULT=="35000c50xxxa7ef67", NAME +="root_disk%n"
(原文忽视了规则文件中%p的含义,使用"/lib/udev/ata_id %p"实际上是无返回值的,这样udev规则匹配就失败了!/lib/udev/ata_id 要使用像/dev/hd*之类的实际设备文件路径,这里就使用/dev/%k来代表,而%k是$kernel, %k:设备的内核设备名称,和前面的KERNEL=="hd*"一致,这样就能保证返回的wwid和设备是一一对应的了。
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相关的资料在真的很难找到,大家有推荐的资料地址或书籍名称请给我留言,谢谢。
0 0
原创粉丝点击