各位大佬,最近遇到一件自己无法独立解决的问题,所以来请教大家,希望能够得到答案!服务器上使用两张硬盘组了1个raid0,剩下几块盘都是和raid控制器直连的,反复重启后会出现盘符乱序的情况:
比如原本是sda的硬盘变成了sdd。针对这个问题我尝试使用了udev进行盘符绑定:
KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/%k", RESULT=="3600508e00000000016154eee56eab00e", NAME="asm-disk1", MODE="0660"
KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/%k", RESULT=="35000c5005616feeb", NAME="asm-disk2", MODE="0660"结果提示NAME不能用于修改内核模块名称。查阅资料后得知与2.6内核不同,3.10内核中NAME赋值键目前只能用于网口名的命名,已经无法对硬盘进行命名。
查阅3.10内核下udev手册:man udev,了解到内核提供了新的方法:创建symlink。
于是通过修改rules文件,设置匹配方式为scsi_id,已经成功为每个硬盘创建了symlink链接:
KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/%k", RESULT=="3600508e00000000016154eee56eab00e", SYMLINK+="asm-disk1", MODE="0660"
KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/%k", RESULT=="35000c5005616feeb", SYMLINK+="asm-disk2", MODE="0660"但是现在还是不知道如何实现盘符的绑定!!查了很多资料发现没有一个讲symlink具体是什么、对盘符命名有什么作用的,所以想要请教大家
1、symlink到底能干嘛?
2、如何实现盘符的绑定、固定?

解决方案 »

  1.   

    目前来说,LSI/Broadcom的RAID卡是不保证盘序的,因为RAID信息可能需要从硬盘中获取,无法确保RAID组哪一个先准备好,基本上是谁先响应了test unit ready,谁盘序在前。HBA卡是可以保证排序的,但是需要修改启动参数。
    你试一下scsi_mod.scan=sync这个启动参数,看看能不能让直连盘保证顺序。
    RAID盘的一般规则是排在直连后面,除非设置成了启动盘。用UDEV可以保证固定盘符,但是在大规模数据中心中又会涉及到不时会有硬盘损坏,这样你的UDEV规则就得随着盘损坏而修改的麻烦。
      

  2.   


    您好,感谢您回复!
    scsi_mod.scan=sync我之前已经设置过,同步扫描方式对于板载SATA控制器是可以实现reboot测试100圈以上盘符不乱序的,然而对于3008控制器IR模式,仍然会出现盘符乱序问题。所以我才决定使用udev绑定的方法进行盘符固定。如您所说,UDEV可以保证固定盘符,那具体应该怎么实现呢?
    网上很多相关文章,有的在rhel6系统下,直接使用NAME=**在rules文件中进行命名,但2.6到3.10内核的变化导致NAME=  这一赋值键不能再对块设备进行命名,所以该方法对用rhel7的我来讲是无效的。  
    还有的文章生成了symlink符号链接,就说实现了盘符绑定,针对这个说法我存在很大的不解与怀疑:
    如果盘符名称发生变化,symlink确实不会改变,因为我的rules文件进行匹配时没有用盘符明进行匹配,而是使用scsi_id,所以无论盘符怎么变化,symlink的指向都是不会变的。但是,symlink只是sda/sdb等设备的快捷方式,怎么就实现了盘符固定的呢?盘符的分配和symlink是无关的呀