1. 程式人生 > >從讀手冊開始讓zynq板卡跑起linux(二)----利用initrd和initramfs分別製作根檔案系統

從讀手冊開始讓zynq板卡跑起linux(二)----利用initrd和initramfs分別製作根檔案系統

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.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
實驗結果:


3.initramfs 根檔案系統的製作

主要步驟:

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 格式不對的錯誤”。