linux initrd 製作及使用

2021-09-24 19:30:34 字數 4692 閱讀 9606

使用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啟動。

0x01000000-0x01258831

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)

Python TensorFlow安裝及使用說明

python tensorflow安裝及使用說明 1 安裝 python 直譯器 anaconda。不需額外安裝,安裝時切記勾選 add anaconda to my path environment variable 檢驗安裝是否成功 anaconda v 或 conda list 2 安裝 cu...

view製作及切換

目的 學習view製作及切換的幾種方式 環境mac os x 10.7.2 xcode4.2 詳解在storyboard中建立另乙個viewcontroller並使用segue切換 在storyboard中再增加乙個viewcontroller。在兩個viewcontroller中各增加乙個按鈕。右...

int,long,long long的範圍及使用

unsigned int 0 4294967295 int 2147483648 2147483647 10位 unsigned long 0 4294967295 long 2147483648 2147483647 long long的最大值 9223372036854775807 19位 lo...