服务器上有多块盘,有的是插ahci接口,有的是插scu接口,安装系统的时候,系统装在/dev/sda(ahci)上,但是升级到新内核后,系统先识别scu接口,再识别ahci接口,结果系统盘变成了/dev/sdi,看上去很别扭。
看了一下dmesg,是isci内核模块先加载,ahci内核模块后加载,所以心想试试调整一下内核模块的加载顺序。打电话问了一下coly,说是硬盘类的驱动都是在initrd阶段就加载了的,而rhel6已经用dracut取代了mkinitrd。于是我试着把initramfsXX.img文件解压出来,奇怪,etc/modprobe.conf里没什么内容,难道是在 lib/modules/xxx/modules.order里?dracut的详细资料不多啊,找了一圈,终于还是在网上找到了一个相当靠谱的bug
这人遇到了一样的内核模块加载顺序的问题,里面提到的解决方法有两个:

A. 在grub启动菜单,kernel那一行后面加“rdloaddriver=ahci”,重启

B. 创建文件/etc/modprobe.d/ahci-first.conf,里面的内容写"install isci /sbin/modprobe ahci; /sbin/modprobe --ignore-install isci",然后运行 dracut --force (重新生成initrd文件),重启

上机测试了一番,两个方法都能让ahci模块先被加载,然后,插在ahci接口的盘先被识别,系统盘顺利变为/dev/sda。看来调整kernel module的加载顺序是个办法。当然,依赖于盘符还是有风险,coly的建议是最终用uuid来做盘的标示,SUSE 13已经采用了这个办法,这样对硬件的依赖最小。
感谢色空同学提供的测试机,浪潮的机器重启还挺快,测试很迅速很顺利。

=== 2013.07.24 ===
只有rhel6才用dracut,所以,rhel5只能用这个办法:解开initrd-2.6.18-xx.img,修改里面的init文件,在

echo "Loading raid0.ko module"
insmod /lib/raid0.ko 

之前加上

echo "Loading ahci.ko module"
insmod /lib/ahci.ko

再重新打包initrd-2.6.18-xx.img,重启即可