以前一直不清楚linux中的initrd,因为这几天学做LFS,虽然没有成功,在chroot到构建的工作目录以后就有问题。失望之下无聊,想看看livecd的启动方式,豁然开朗。其实就是把 一些系统基本的东西给集成到initrd里面。准备自己做一个在U盘上或者CD上使用的系统,包含基本的东西就可以了。当然是借助livecd的思路。这里把有关initramfs的资料记下来:
在Linux kernel v2.6.15后initramfs取代了initrd(同时devfs也被udev取代),因此这里的initrd.img只是在名字上“兼容”了旧版本。这个initrd.img实际上是用cpio打包然后压缩产生的。
如果想了解initramfs版本的initrd.img究竟包含了哪些东西,可以这样操作:
mkdir /tmp/initramfs
cd /tmp/initramfs
cp /boot/initrd.img- initrd.gz
gunzip initrd.gz
cpio -i < initrd
initrd.img在被kernel加载到RAM Disk后,从/init脚本开始运行,调用顺序如下:
init-top
init-premount: thermal, udev.
local-top or nfs-top: cryptsetup, md, lvm.
local-premount or nfs-premount: swusp.
local-bottom or nfs-bottom:
init-bottom: udev cleanup.
究竟是跑local-还是跑nfs-,由/conf/initramfs.conf中的BOOT变量决定。
init脚本最后调用/sbin/init,由/sbin/init这个真正的init守护进程接管系统的后续启动和运行。
本日記介紹製作 Linux 2.6 的 initramfs 簡易方法。假設 RFS 的目錄為 /home/rootfs,則製作 initramfs 的指令為:
cd /home/rootfs
find . | cpio -o -H newc | gzip -9 >../cramfs.gz
更明確地說,initramfs 是 “compressed” ramfs(ram filesystem),ramfs 並不等於傳統的 ramdisk;像是以 “genext2fs” 工具所製作的 initrd(ext2 格式的 image file)才是基於 ramdisk 的傳統做法,也就是說,initramfs 並不等於傳統上的 initrd,這點要請大家多留意