1.initrd 与 initramfs的区别
Linux内核在初始化之后会执行init进程,而init进程会挂载我们的根文件系统,但由于init程序也是在根文件系统上的,所以这就有了悖论。Linux采用两步走的方法来解决这个问题。Linux2.6版以前的方法是:除了内核vmlinuz之外还有一个独立的initrd.img映像文件,其实它就是一个文件系统映像,linux内核在初始化后会mount initrd.img作为一个临时的根文件系统,而init进程就是在initrd.img里的,然后init进程会挂载真正的根文件系统,然后umount initrd.img。但Linux2.6内核的实现方式却不太一样,虽然完成的功能是一样的。Linux2.6采用initramfs。initramfs:init ram filesystem,它是一个cpio格式的内存文件系统。
引用:点击打开链接
2.initrd 根文件系统的制作
主要步骤:
1). Extract the initrd image from the gzip archive.
gunzip ramdisk.image.gz2). Mount the initrd image.
chmod u+rwx ramdisk.image mkdir tmp_mnt/ sudo mount -o loop ramdisk.image tmp_mnt/ cd tmp_mnt/3). Make changes in the mounted filesystem.
4). Unmount the initrd image and compress the image.
sudo umount tmp_mnt/ gzip ramdisk.image实验结果:
参考:点击打开链接
3.initramfs 根文件系统的制作
源文件:14.5-qemu-ramdisk.image.gz
主要步骤:
1). Extract the contents of the cpio.gz archive.
mkdir tmp_mnt/ gunzip -c initramfs.cpio.gz | sh -c 'cd tmp_mnt/ && cpio -i' cd tmp_mnt/2). Make changes to the filesystem.
3). Repack the filesystem into a cpio.gz archive.
sh -c 'cd tmp_mnt/ && find . | cpio -H newc -o' | gzip -9 > new_initramfs.cpio.gz实验结果:
参考:点击打开链接
4.总结:
赛灵思的wiki已经有了linux正常启动的最简文件系统,我们需要做的就是解压,添加自己的库文件和驱动等,然后再重新生成.gz,省掉了用busybox逐步建立根文件系统的过程。注意:最后别忘了
mkimage -A arm -T ramdisk -C gzip -d ramdisk.image.gz uramdisk.image.gz
否则报“ramdisk 格式不对的错误”。