一,
Ram Disk就是將內(nèi)存中的一塊區(qū)域作為物理磁盤來使用的一種技術(shù)。
使用時內(nèi)核配置:兩個選項:第一個設定Ramdisk個數(shù),默認16個;第二個是設定Ramdisk的大小,設定16MDeviceDrivers
[*] Blockdevices
<*>
(16)
(16384) Default RAM disk size(kbytes)
另外:設置RAM disk支持
Generalsetup
[*] Initial RAM filesystem and RAM disk(initramfs/initrd) support
二,
initrd全稱是 initial RAMdisk,它提供一種讓核心可以簡單使用Ramdisk的能力,簡單的說,這些能力包括:
格式化一個Ramdisk;
加載文件系統(tǒng)內(nèi)容到Ramdisk;
將Ramdisk作為根文件系統(tǒng);
而Linux啟動階段的Ramdisk相當于一個未格式化的硬盤分區(qū),核心可以直接將initrd的內(nèi)容釋放到一個未初始化的Ramdisk里,這個過程與Ghost恢復一個分區(qū)的過程十分相似。于是,相應的內(nèi)容被加載到相應的Ramdisk中,同時,這個Ramdisk也被格式化成某種由initrd格式所表達的分區(qū)格式。
initrd支持的格式
·
·
·
·
三,
如果核心選擇了Gzip支持(通常這是默認的,在init/do_mounts_rd.c中定義的BUILD_CRAMDISK宏)還可以使用Gzip壓縮的initrd。相關(guān)的代碼可以在核心源碼drivers/block/rd.c:identify_ramdisk_image中找到。
四,
initrd有兩種格式,initrd-image和initrd-cpio。
辦法一
通過ramdisk來制作的方法比較簡單(以ext2文件系統(tǒng)為例):
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的本質(zhì),對于Linux來說,Ramdisk的一個塊設備,而initrd是這個塊設備上所有內(nèi)容的“克隆”(由
命令dd來完成)而生成的文件。核心中加載initrd相關(guān)的代碼則用于完成將相反的過程,即將這一個文件恢復到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 #創(chuàng)建文件系統(tǒng);
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/zeroof=../initrd.img bs=512k count=5
bash# mkfs.ext2 -F -m0 ../initrd.img
bash# mount -t ext2 -o loop../initrd.img
bash# cp -r
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 結(jié)尾,它也可能是一個壓縮文件,
可以給這個文件添加上 .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 rwconsole=ttymxc0,115200
checking if image is initramfs...itisn't (no cpio magic); looks like an initrd
Freeing initrd memory: 2402K
RAMDISK: Compressed image found at block0
RAMDISK: ran out of compresseddata
out of input data
VFS: Mounted root (ext2filesystem).
Freeing init memory: 140K
Mounting /proc and /sys
Starting the hotplug events dispatcherudevd
Synthesizing initial hotplugevents
Setting the hostname toaigo_R&D
Mounting filesystems
initrd-cpio無法啟動:
Kernel command line: root=/dev/ram rwconsole=ttymxc0,115200
checking if image is initramfs...itisn't (out of input data); looks like an initrd
Freeing initrd memory: 2376K
RAMDISK: Compressed image found at block0
RAMDISK: ran out of compresseddata
out of input data
List of all partitions:
1f00
1f01
1f02
1f03
1f04
1f05
1f06
1f07
No filesystem could mount root,tried:
Kernel panic - not syncing: VFS: Unableto mount root fs on unknown-block(1,0)
聯(lián)系客服