|
发表于 2012-6-8 02:02:36
|
显示全部楼层
我拆解过好几个的initrd,好像光盘上用的initrd文件是跟磁盘上的一样的文件。
对于几个不同系统的initrd我说一下各自特点
magiclinux的initrd,应该是用mkinitrd生成的,,挂载的分区直接写到了initrd,连dev设备也是通过脚本进行装载。
ubuntu大体过程是先把proc,sys,dev先挂到内存,然后挂接驱动设备,用udev管理设备,接着解释内核参数,获得磁盘名称,再做一些对挂载磁盘做初始化,把日志文件拷贝到目标磁盘,最后挂载系统分区chroot,由于内核启动后只能由initrd执行chroot,init根据内核参数导入不同的文件脚本函数完成不同的启动过程。
fc15已经开始使用systemd,所以分析fc的initrd也相当有必要,不过大部分也跟utuntu的差不多,也是用udev管理设备,只是代码风格不一样,导入变量和函数的文件较少。
slax就比较另类,initrd使用busybox的mdev装载dev目录的设备,转到aufs的根目录后再使用udev管理。
cdlinux的就更加迷惑人了,initrd文件使用squashfs的格式,启动后必须先加载aufs后才可以做设备文件的加载,否则报只读文件系统,启动后没有chroot,直接在aufs做root,没有提供运行级别,只是在启动时判断内存容量启动图形还是控制台。
通过拆解这些initrd文件发现可以直接使用内核参数控制initrd的启动过程,如果说设备驱动问题,现在流行发行版的initrd文件容量如此之大,几乎是把所有模块都塞进initrd镜像了,只是需要通过udev进行管理就可以了。 |
|