前一阵遇到一个系统装到软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往下递减来作为设备名称的。

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