从读手册开始让zynq板卡跑起linux(二)----利用initrd和initramfs分别制作根文件系统

时间:2022-02-11 19:22:15

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 根文件系统的制作

源文件:arm_ramdisk.image.gz

主要步骤:

1). Extract the initrd image from the gzip archive.

gunzip ramdisk.image.gz
2). 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
实验结果:

从读手册开始让zynq板卡跑起linux(二)----利用initrd和initramfs分别制作根文件系统

参考:点击打开链接

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
实验结果:

从读手册开始让zynq板卡跑起linux(二)----利用initrd和initramfs分别制作根文件系统

参考:点击打开链接

4.总结:

 赛灵思的wiki已经有了linux正常启动的最简文件系统,我们需要做的就是解压,添加自己的库文件和驱动等,然后再重新生成.gz,省掉了用busybox逐步建立根文件系统的过程。注意:最后别忘了

mkimage -A arm -T ramdisk -C gzip -d ramdisk.image.gz uramdisk.image.gz

否则报“ramdisk 格式不对的错误”。