使用Ramdisk作為根文件系統,也就是INITRD
一, Ramdisk
Ram Disk 就是將內存中的一塊區域作為物理磁盤來使用的一種技術。
使用時內核配置:兩個選項:第一個設定Ramdisk個數,默認16個;第二個是設定Ramdisk的大小,設定16M
Device Drivers --->
[*] Block devices --->
<*> RAM block device support
(16) Default number of RAM disks
(16384) Default RAM disk size (kbytes)
另外:設置RAM disk 支持
General setup --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
二, initrd
initrd全稱是 initial RAM disk ,它提供一種讓核心可以簡單使用Ramdisk的能力,簡單的說,這些能力包括:
格式化一個 Ramdisk;
加載文件系統內容到Ramdisk;
將Ramdisk作為根文件系統;
而Linux啟動階段的Ramdisk相當於一個未格式化的硬盤分區,核心可以直接將initrd的內容釋放到一個未初始化的Ramdisk里,這個過程與Ghost恢復一個分區的過程十分相似。於是,相應的內容被加載到相應的Ramdisk中,同時,這個Ramdisk也被格式化成某種由initrd格式所表達的分區格式。
initrd支持的格式
· Romfs文件系統;
· Ext2文件系統;
· cramfs文件系統;
· minix文件系統;
三, Gzip支持
如果核心選擇了Gzip支持(通常這是默認的,在init/do_mounts_rd.c中定義的BUILD_CRAMDISK宏)還可以使用Gzip壓縮的initrd。相關的代碼可以在核心源碼 drivers/block/rd.c:identify_ramdisk_image 中找到。
四, 制作initrd
initrd有兩種格式,initrd-image和initrd-cpio。
辦法一
通過ramdisk來制作的方法比較簡單(以ext2文件系統為例):
redice # mkfs.ext2 /dev/ram0
redice # mount /dev/ram0 /mnt/rd
redice # cp _what_you_like_ /mnt/rd # 把需要的文件復制過去
redice # dd if=/dev/ram0 of=/tmp/initrd
redice # gzip -9 /tmp/initrd
這個過程也最能夠解釋initrd的本質,對於Linux來說,Ramdisk的一個塊設備,而initrd是這個塊設備上所有內容的“克隆”(由
命令dd來完成)而生成的文件。核心中加載initrd相關的代碼則用於完成將相反的過程,即將這一個文件恢復到Ramdisk中去。
辦法二
通過loop設備來制作initrd的過程:
redice # dd if=/dev/zero of=/tmp/initrd bs=1024 count=4096 # 制作一個4M的空白文件
redice # losetup /dev/loop0 /tmp/initrd # 映射到loop設備上;
redice # mkfs.ext2 /dev/loop0 # 創建文件系統;
redice # mount /dev/loop0 /mnt/rd
redice # cp _what_you_like_ /mnt/rd # 復制需要的文件;
redice # umount /mnt/rd
redice # losetup -d /dev/loop0
redice # gzip -9 /tmp/initrd
辦法三
bash# dd if=/dev/zero of=../initrd.img bs=512k count=5
bash# mkfs.ext2 -F -m0 ../initrd.img
bash# mount -t ext2 -o loop ../initrd.img /mnt
bash# cp -r * /mnt
bash# umount /mnt
bash# gzip -9 ../initrd.img
辦法四(新式INITRD:cpio-initrd的制作)
# find . | cpio -c -o > ../initrd.img
# gzip ../initrd.img
解壓initrd
gunzip initrd.img.gz
即使您的 initrd 映像文件不是以 .gz 結尾,它也可能是一個壓縮文件,
可以給這個文件添加上 .gz后綴,然后再使用 gunzip 對其進行解壓。
cpio 歸檔文件
# mkdir temp ; cd temp
# cp /boot/initrd-2.6.14.2.img initrd-2.6.14.2.img.gz
# gunzip initrd-2.6.14.2.img.gz
#cpio -ivmd < initrd-2.6.14.2.img
五, 啟動:
Redboot啟動。
下載initrd
0x01000000-0x01258831
下載zImage
0x00100000-0x002f82f7
啟動命令
exec -r 0x1000000 -s 0x258831 -c "root=/dev/ram rw console=ttymxc0,115200"
六, 結果:
辦法三制作,也就是initrd-image可以成功啟動:
Kernel command line: root=/dev/ram rw console=ttymxc0,115200
checking if image is initramfs...it isn't (no cpio magic); looks like an initrd
Freeing initrd memory: 2402K
RAMDISK: Compressed image found at block 0
RAMDISK: ran out of compressed data
out of input data
VFS: Mounted root (ext2 filesystem).
Freeing init memory: 140K
Mounting /proc and /sys
Starting the hotplug events dispatcher udevd
Synthesizing initial hotplug events
Setting the hostname to aigo_R&D
Mounting filesystems
initrd-cpio無法啟動:
Kernel command line: root=/dev/ram rw console=ttymxc0,115200
checking if image is initramfs...it isn't (out of input data); looks like an initrd
Freeing initrd memory: 2376K
RAMDISK: Compressed image found at block 0
RAMDISK: ran out of compressed data
out of input data
List of all partitions:
1f00 2048 mtdblock0 (driver?)
1f01 4096 mtdblock1 (driver?)
1f02 2048 mtdblock2 (driver?)
1f03 16384 mtdblock3 (driver?)
1f04 8192 mtdblock4 (driver?)
1f05 4096 mtdblock5 (driver?)
1f06 786432 mtdblock6 (driver?)
1f07 3371008 mtdblock7 (driver?)
No filesystem could mount root, tried: ext2 cramfs vfat msdos
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0)
參考資料:
Linux文檔中關於ramdisk的介紹,核心目錄里 Documentation/ramdisk.txt;
Linux文檔中關於initrd的介紹,核心目錄 Documentation/initrd.txt;
Linux文檔中關於tmpfs的介紹,核心目錄 Documentation/filesystems/tmpfs.txt;