系统装在软raid上

前一阵遇到一个系统装到软raid上后设备名对不上的问题。正常用kickstart安装rhel或centos时,可以创建软raid设备,例如/dev/md1,然后把系统装到md1里,装好重启后可以看到根目录就在/dev/md1设备上。但是,同事用无盘环境装的,重启后设备名字变成了md127,系统是自动把软raid设备找到了,但是给它的名字不是安装时的名字。试着在/etc/mdadm.conf里把/dev/md1加上,重启还是无效。
后来才想明白,mdadm.conf配置文件自己就放在软raid上,在识别软raid以前,上哪儿去找这个文件啊。不是修改系统的,而是修改dracut里的mdadm.conf,这个修改也不麻烦,改好/etc/mdadm.conf后重新mkinitrd一下,新的mdadm.conf就带到新initrd里去了。这次重启,设备名正确了,是/dev/md1。

那md127是咋来的?
再翻了代码,原来,dracut里的sbin/mdadm_auto脚本里有一句:

/sbin/mdadm -As --auto=yes --run 2>&1 | vinfo

如果找不到etc/mdadm.conf,就会用mdadm工具来自动寻找并组装旧有的软raid设备,“-A”表示Assemble,看看mdadm的源码:

(Assemble.c)
create_mddev()
    ----> find_free_devnm()

char *find_free_devnm(int use_partitions)                         
{                       
        static char devnm[32]; 
        int devnum;                                                
        for (devnum = 127; devnum != 128;                
             devnum = devnum ? devnum-1 : (1<<20)-1) {
             ......

就是从127往下递减来作为设备名称的。

感谢君瑞同学提的问题,我也学到了很多。

dracut内核模块加载顺序的调整

服务器上有多块盘,有的是插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,重启即可