- 論壇徽章:
- 0
|
ramfs, rootfs, initrd and initramfs
-------------------------------------------------------------------------------
什么是ramfs?
ramfs是空間規(guī)模動(dòng)態(tài)變化的RAM文件系統(tǒng)。它非常簡(jiǎn)單,用來(lái)實(shí)現(xiàn)Linux緩存機(jī)制(緩存page cache and dentry cache)的文件系統(tǒng)。
通常情況下,Linux的所有文件在內(nèi)存中都有緩存。需要讀取的數(shù)據(jù)頁(yè)從支撐存儲(chǔ)設(shè)備(block device)中讀取后,緩存于內(nèi)存。在支撐存儲(chǔ)設(shè)備中的數(shù)據(jù)頁(yè)執(zhí)行marked as clean操作。當(dāng)虛擬文件系統(tǒng)需要支撐存儲(chǔ)設(shè)備中的數(shù)據(jù)頁(yè)內(nèi)存時(shí),可以釋放;谕瑯拥臋C(jī)制,支撐存儲(chǔ)設(shè)備的寫(xiě)入操作(寫(xiě)入文件然后寫(xiě)回支撐存儲(chǔ)設(shè)備,marked as clean)后,也可以釋放占用的數(shù)據(jù)頁(yè)內(nèi)存。對(duì)于文件目錄占用的緩存(dentry: directory entry),也存在同樣的機(jī)制。
但是,ramfs中不需要支撐存儲(chǔ)設(shè)備(沒(méi)有支撐緩存,但是有緩存)。也就是說(shuō),寫(xiě)入ramfs的文件可以正常的分配page cache and dentry cache,但是不能寫(xiě)入支撐存儲(chǔ)設(shè)備。這些page cache and dentry cache不能被VM釋放、回收。
由于ramfs可以基于現(xiàn)有的Linux的文件系統(tǒng)結(jié)構(gòu),用于實(shí)現(xiàn)ramfs的代碼很小。一般而言,支撐存儲(chǔ)設(shè)備的緩存被安裝為一個(gè)文件系統(tǒng)。所以,ramfs不能通過(guò)menuconfig選擇,是必然進(jìn)入內(nèi)核的。
在ramfs的下面可以一直寫(xiě)入數(shù)據(jù),直到寫(xiě)滿內(nèi)存為止。由于VM(Vitual Memory)認(rèn)為文件應(yīng)該被寫(xiě)回支撐存儲(chǔ)設(shè)備,而不是交換空間(swap space),所以VM不能釋放ramfs分配的內(nèi)存。從而,只有root用戶(or trusted user)才能進(jìn)行ramfs寫(xiě)操作。
-------------------------------------------------------------------------------
什么是ram disk?
"ram disk"是一種實(shí)現(xiàn)文件系統(tǒng)的支撐存儲(chǔ)的、過(guò)時(shí)的機(jī)制(2.6不用了),就是在RAM上面開(kāi)辟的綜合塊設(shè)備(synthetic block device)。ram disk的大小是固定的,安裝的文件系統(tǒng)大小(不是ramfs)也是固定的。ram disk的使用需要從這個(gè)假的塊設(shè)備到page cache之間拷貝內(nèi)存,生成和銷毀dentry,而且需要文件系統(tǒng)的驅(qū)動(dòng)格式化和解釋上面的數(shù)據(jù),所以ram disk的機(jī)制不再使用。
與ramfs相比,ram disk浪費(fèi)了內(nèi)存,也浪費(fèi)了內(nèi)存總線的帶寬。同時(shí),ram disk還為CPU加重了不必要的負(fù)擔(dān),污染了CPU的cache(盡管有避免污染的方法,但是非常耗費(fèi)資源)。ramfs機(jī)制非常自然,因?yàn)槲募L問(wèn)可以通過(guò)page cache and dentry cache。ram disk被棄用的另外一個(gè)原因是環(huán)回設(shè)備(loopback)引入。環(huán)回設(shè)備提供了一種更加靈活、方便的從文件而不是從內(nèi)存塊中創(chuàng)建綜合塊設(shè)備的方法。
-------------------------------------------------------------------------------
什么是tmpfs?
tmpfs是ramfs的衍生物,用來(lái)限制緩存大小、向swap空間寫(xiě)入數(shù)據(jù)。它是用來(lái)保存VM所有文件的文件系統(tǒng)。tmpfs中緩存的內(nèi)容全部是臨時(shí)的。一旦卸載,所有的內(nèi)容都會(huì)遺失。它把所有的緩存置于內(nèi)核,它的規(guī)模隨著文件的規(guī)模同步變化。但是它規(guī)模有大小限制,可以修改。它可以把當(dāng)前不再需要的頁(yè)寫(xiě)入到swap空間。
-------------------------------------------------------------------------------
什么是rootfs?
rootfs是ramfs的特殊實(shí)例,在2.6的內(nèi)核中必然存在。rootfs不能被卸載(與其添加特殊代碼用來(lái)維護(hù)空的鏈表,不如把rootfs節(jié)點(diǎn)始終加入,因此便于kernel維護(hù):簡(jiǎn)單、精煉。rootfs是ramfs的一個(gè)空實(shí)例,占用空間極小)。大部分其他的文件系統(tǒng)安裝于rootfs之上。
-------------------------------------------------------------------------------
什么是initramfs?
2.6的Linux內(nèi)核包含有g(shù)zip壓縮的cpio格式的文檔,可以在內(nèi)核引導(dǎo)的時(shí)候解壓縮為rootfs。在解壓縮后,kernel將檢查rootfs中是否包含init文件。如果init文件存在,內(nèi)核就會(huì)執(zhí)行這個(gè)文件,并且賦予PID=1的進(jìn)程號(hào)。這個(gè)init程序?qū)⒄麄(gè)系統(tǒng)引導(dǎo)起來(lái),包括定位并且安裝真正的root設(shè)備。如果在cpio文檔解壓縮后的rootfs中沒(méi)有init程序(init文件),內(nèi)核執(zhí)行舊的代碼,定位并且安裝root分區(qū),執(zhí)行/sbin/init程序。
-------------------------------------------------------------------------------
initramfs與initrd的區(qū)別
1. initrd是一個(gè)單獨(dú)的文件;initramfs和Linux內(nèi)核鏈接在一起(/usr目錄下的程序負(fù)責(zé)生成initramfs文檔)。
2. initrd是一個(gè)壓縮的文件系統(tǒng)映像(可以是ext2等,需要內(nèi)核的驅(qū)動(dòng));initramfs是類似tar的cpio壓縮文檔。內(nèi)核中的cpio解壓縮代碼很小,而且init數(shù)據(jù)在boot后可以丟棄。
3. initrd運(yùn)行的程序(initd,不是init)進(jìn)行部分setup后返回內(nèi)核;initramfs執(zhí)行的init程序不返回內(nèi)核(如果/init需要向內(nèi)核傳遞控制權(quán),可以再次安裝在/目錄下一個(gè)新的root設(shè)備并且啟動(dòng)一個(gè)新的init程序)。
4. 切換到另一個(gè)root設(shè)備時(shí),initrd執(zhí)行pivot_root后,卸載ramdisk;initramfs是rootfs,既不能pivot_root,也不能卸載。initramfs會(huì)刪掉rootfs的所有內(nèi)容(find -xdev / -exec rm '{}' ';'),再次安裝root到rootfs(cd /newmount; mount --move . /; chroot .),把stdin/sdout/stderr掛在新的/dev/console上,重新執(zhí)行init。由于這是一個(gè)相當(dāng)困難的實(shí)現(xiàn)過(guò)程(包括在使用一個(gè)命令之前把它刪除),所以klibc工具包引入一個(gè)幫助程序/utils/run_init.c來(lái)執(zhí)行上述過(guò)程。其他大部分工具包(包括busybox)把這個(gè)命令稱為"switch_root"。
-------------------------------------------------------------------------------
Populating initramfs
2.6的內(nèi)核缺省情況下總是生成一個(gè)gzipped的cpio文檔,并且和內(nèi)核鏈接在一起。這個(gè)文檔缺省是空的,在X86環(huán)境下的大小是134字節(jié)。
CONFIG_INITRAMFS_SOURCE配制參數(shù)指定initramfs文檔的源,并且自動(dòng)的嵌入到二進(jìn)制文件中。這個(gè)參數(shù)可以指向一個(gè)gzipped的cpio文檔,一個(gè)包含文件的目錄,或者文件描述的文本文件。例如文本文件:
dir /dev 755 0 0
nod /dev/console 644 0 0 c 5 1
nod /dev/loop0 644 0 0 b 7 0
dir /bin 755 1000 1000
slink /bin/sh busybox 777 0 0
file /bin/busybox initramfs/busybox 755 0 0
dir /proc 755 0 0
dir /sys 755 0 0
dir /mnt 755 0 0
file /init initramfs/init.sh 755 0 0
在內(nèi)核編譯完成后,可以執(zhí)行/usr/gen_init_cpio命令獲得cpio文檔。配置文件的一個(gè)優(yōu)勢(shì)是不需要root權(quán)限,也不需要在新的文檔中生成設(shè)備節(jié)點(diǎn)。在上述文檔中的兩個(gè)file命令用來(lái)發(fā)現(xiàn)initramfs目錄下面的init.sh文件和busybox文件。內(nèi)核不需要外部的cpio工具實(shí)現(xiàn)initramfs的cpio文檔。如果在配置時(shí)指定了一個(gè)目錄而不是一個(gè)描述文件,內(nèi)核編譯時(shí)將從這個(gè)目錄生成一個(gè)描述文件(作為/usr/gen_init_cpio.c的輸入)。內(nèi)核編譯時(shí)cpio生成代碼和內(nèi)核渾然一體,boot時(shí)解壓縮程序也和內(nèi)核渾然一體。
如果不使用配置文件或者配置目錄,而使用定制的cpio文檔時(shí),需要外部的cpio工具。例如下面的命令可以從cpio映像文件抽取包含的文件、壓縮cpio映像文件:
cpio -i -d -H newc -F initramfs_data.cpio --no-absolute-filenames
下面的shell腳本可以生成一個(gè)定制的cpio.gz文檔,可以用來(lái)代替配置文件生成的cpio文檔:
#!/bin/sh
if [ $# -ne 2 ]
then
echo "usage: mkinitramfs directory imagename.cpio.gz"
exit 1
fi
if [ -d "$1" ]
then
echo "creating $2 from $1"
(cd "$1"; find . | cpio -o -H newc | gzip) > "$2"
else
echo "First argument must be a directory"
exit 1
fi
ramfs, rootfs, initrd and initramfs — Windows Live (11 August 2009)
http://lsjandysf.spaces.live.com ... 28BDE00EA!362.entry |
|