- 論壇徽章:
- 0
|
使用ram disk初始化(initrd)
================================
Written 1996,2000 by Werner Almesberger
werner.almesberger@epfl.ch
> and
Hans Lermen
lermen@fgan.de
>
翻譯:szs
initrd提供了在boot loader下加載ram disk的方法。該ram disk可以被作為根文件系統(tǒng)掛載進(jìn)來(lái),里面的程序也可以運(yùn)行。然后,新的根文件系統(tǒng)可以從其他設(shè)備掛載。之前的根(來(lái)自initrd)可以被轉(zhuǎn)移到一個(gè)目錄然后被卸載。
initrd主要設(shè)計(jì)用來(lái)使系統(tǒng)啟動(dòng)于兩個(gè)條件,一個(gè)是內(nèi)核來(lái)自于非常小的驅(qū)動(dòng)器,一個(gè)是額外的模塊需要從initrd中加載。
本文給出initrd的概要描述,更具體的可以參考[1]。
操作
-------
當(dāng)使用initrd,典型的系統(tǒng)啟動(dòng)順序如下:
1. boot loader加載內(nèi)核并初始化ram disk
2. 內(nèi)核把initrd轉(zhuǎn)化成正常的ram disk 并釋放initrd使用的內(nèi)存
3. initrd作為root被掛載,賦予讀寫權(quán)限。
4. /linuxrc被執(zhí)行(這可以是任何可執(zhí)行文件,如腳本,運(yùn)行在uid 0,可以做任何初始化)。
5. linuxrc掛載真正的根文件系統(tǒng)
6. linuxrc使用pivot_root系統(tǒng)調(diào)用把根文件系統(tǒng)放在根目錄。
7. 正常的啟動(dòng)序列(/sbin/init)在根文件系統(tǒng)上執(zhí)行。
8. initrd文件系統(tǒng)被移去。
注意,改變根目錄不牽扯卸載他。
掛載在initrd的文件系統(tǒng)仍然可以被訪問(wèn)。
啟動(dòng)命令選項(xiàng)
------------------------
initrd添加了如下新的選項(xiàng):
initrd= (e.g. LOADLIN)
加載特定的文件作為初始的ram disk。當(dāng)使用lilo,你應(yīng)該在/etc/lilo.conf中指定
ram disk鏡像文件位置,使用INITRD變量。
noinitrd
initrd數(shù)據(jù)被保留卻不轉(zhuǎn)化成ram disk,正常的根文件系統(tǒng)被加載。initrd的數(shù)據(jù)可以 從/dev/initrd中讀取。注意,在initrd中的數(shù)據(jù)可以是任意結(jié)構(gòu)的,不一定要是文件系統(tǒng)鏡像。該選項(xiàng)多用于調(diào)試。
注意:/dev/initrd是只讀的,而且只能被使用一次。只要最后一個(gè)進(jìn)程關(guān)閉它,所有的數(shù)據(jù)將會(huì)釋放掉,而/dev/initrd將不再被打開(kāi)。
root=/dev/ram0 (without devfs)
root=/dev/rd/0 (with devfs)
initrd作為根文件系統(tǒng)被掛載,隨后正常的啟動(dòng)順序中,ram disk 仍然作為root。
安裝
------------
首先,用于initrd文件系統(tǒng)的目錄在根文件系統(tǒng)上被創(chuàng)建:
#mkdir /initrd
名字不是很重要。更多的可以參考pivot_root(2)的man。
在啟動(dòng)過(guò)程中,如果根文件系統(tǒng)被創(chuàng)建(如果你有軟盤啟動(dòng)),那么根文件系統(tǒng)應(yīng)該創(chuàng)建/initrd目錄。
如果initrd沒(méi)有被掛載,他里面的內(nèi)容仍然可以被訪問(wèn),通過(guò)以下的方法(注意,這在使用devfs時(shí)不可用):
# mknod /dev/initrd b 1 250
# chmod 400 /dev/initrd
第二步,內(nèi)核編譯的時(shí)候必須支持ram disk并啟動(dòng)ram disk使能。所有從initrd中執(zhí)行的程序必須被編譯到內(nèi)核中。
第三步,你必須創(chuàng)建ram disk鏡像。這可以通過(guò)在塊設(shè)備上創(chuàng)建文件系統(tǒng)實(shí)現(xiàn),把所需的文件拷貝,然后把文件拷貝到initrd文件。根據(jù)最新的內(nèi)核,至少三種設(shè)備可以用:
l 軟盤(慢,卻隨處可用)
l ram disk(快,需要物理內(nèi)存)
l loopback device(最高檔)
我將介紹loopback device方法:
保證loopback device被內(nèi)核支持
創(chuàng)建一個(gè)空的文件系統(tǒng),擁有合適的大。
# dd if=/dev/zero of=initrd bs=300k count=1
# mke2fs -F -m0 initrd
如果空間不多,你可以用minix fs而不是ext2
掛載文件系統(tǒng)
# mount -t ext2 -o loop initrd /mnt
創(chuàng)建控制臺(tái)設(shè)備(如果用devfs,就沒(méi)必要)
# mkdir /mnt/dev
# mknod /mnt/dev/console c 5 1
拷貝initrd環(huán)境需要的所有文件。不要忘掉最重要的文件/linuxrc.
注意,/linuxrc必須有執(zhí)行權(quán)限。
正確的initrd環(huán)境可以不用重啟就可以通過(guò)命令行測(cè)試:
# chroot /mnt /linuxrc
卸載文件系統(tǒng)
# umount /mnt
現(xiàn)在initrd被保存在initrd文件中。還可以壓縮他。
# gzip -9 initrd
為了試驗(yàn)initrd,你可以創(chuàng)建一個(gè)急救盤,只需創(chuàng)建/linuxrc到/bin/sh的符號(hào)鏈接。
你還可以試著把initrd更小。
最后,你要啟動(dòng)內(nèi)核并加載initrd.幾乎所有的boot loader都支持initrd.
雖然啟動(dòng)進(jìn)程兼容老的機(jī)制,下面的啟動(dòng)命令行還是得給出:
root=/dev/ram0 init=/linuxrc rw
如果不使用devfs.或者
root=/dev/rd/0 init=/linuxrc rw
如果使用devfs.
使用 LOADLIN,只要執(zhí)行
LOADLIN initrd=
e.g. LOADLIN C:\LINUX\BZIMAGE initrd=C:\LINUX\INITRD.GZ root=/dev/ram0
init=/linuxrc rw
使用LILO,你添加選項(xiàng)INITRD=到/etc/lilo.conf中,使用APPEDN命令即可。
image = /bzImage
initrd = /boot/initrd.gz
append = "root=/dev/ram0 init=/linuxrc rw"
然后運(yùn)行 /sbin/lilo
對(duì)于其他的啟動(dòng)程序,請(qǐng)參考相應(yīng)的文檔。
現(xiàn)在你可以啟動(dòng)并享受使用initrd的樂(lè)趣了
如何改變根設(shè)備
------------------
當(dāng)完成他的任務(wù),linuxrc改變根設(shè)備并啟動(dòng)真正的根設(shè)備。
整個(gè)過(guò)程包括如下幾步:
1. 掛載新的根文件系統(tǒng)
2. 把他變成根文件系統(tǒng)
3. 刪除所有對(duì)舊(Initrd)文件系統(tǒng)的訪問(wèn)
4. 卸載initrd文件系統(tǒng),重定位ram disk
掛載新的根文件系統(tǒng)很容易:只需把他掛載到當(dāng)前根下。例如:
# mkdir /new-root
# mount -o ro /dev/hda1 /new-root
根的轉(zhuǎn)變伴隨著pivot_root系統(tǒng)調(diào)用。pivot_root把當(dāng)前的根轉(zhuǎn)移到新根下的一個(gè)目錄,并把新的根放到原來(lái)的地方。老根的目錄必須在調(diào)用pivot_root前退出。例如:
# cd /new-root
# mkdir initrd
# pivot_root . initrd
現(xiàn)在,linuxrc進(jìn)程可以仍然訪問(wèn)老的根。所有的這些引用可以通過(guò)如下命令釋放:
# exec chroot . what-follows dev/console 2>&1
然后執(zhí)行的就是新根下的,例如/sbin/init.
如果新的根文件系統(tǒng)使用devfs,而/dev目錄還不可用,devfs必須被掛載進(jìn)來(lái),
在使用chroot之前,只有這樣才有/dev/console設(shè)備。
注意:privot_root執(zhí)行的情況可能有所不同。為了保證兼容性,注意以下幾點(diǎn):調(diào)用pivot_root之前,調(diào)用進(jìn)程的當(dāng)前目錄應(yīng)指向新的根文件目錄使用.作為第一個(gè)參數(shù),老根的相對(duì)路徑作為第二個(gè)參數(shù)。chroot程序必須在就老的和新的根下都可以使用。最后改變根到新的根下。在執(zhí)行命令中使用dev/console的相對(duì)路徑。
注意,initrd可以被卸載,而ram disk使用的內(nèi)存可以被釋放:
# umount /initrd
# blockdev --flushbufs /dev/ram0 # /dev/rd/0 if using devfs
initrd還可以使用NFS-mounted根,參考man pivot_root(8)。
注意:如果linuxrc或者其他程序從終端執(zhí)行,老的改變根機(jī)制必須調(diào)用。
使用限制
-----------
引入initrd的主要?jiǎng)訖C(jī)是為了在系統(tǒng)安裝中可以模塊化配置內(nèi)核。過(guò)程運(yùn)行如下:
1. 一個(gè)小內(nèi)核的系統(tǒng)從軟盤或其他介質(zhì)上啟動(dòng)(支持ram disk,initrd,a.out, ext2fs),并加載initrd。
2. /linuxrc決定如何掛載真正的根文件系統(tǒng)(設(shè)備類型,設(shè)備驅(qū)動(dòng),文件系統(tǒng)),并分布媒體(CDROM,network,tape)。這些可以詢問(wèn)用戶或者自動(dòng)探測(cè),或是混合使用。
3. /linuxrc加載必須的內(nèi)核模塊
4. /linuxrc創(chuàng)建并組裝根文件系統(tǒng)(還不一定能用)。
5. /linuxrc調(diào)用pivot_root改變根文件系統(tǒng),執(zhí)行(chroot)安裝程序.
6. boot loader 安裝完畢
boot loader配置用于加載initrd,initrd中包含系統(tǒng)啟動(dòng)的必須模塊。
現(xiàn)在系統(tǒng)可以啟動(dòng)的,額外的安裝任務(wù)被執(zhí)行。
initrd的主要任務(wù)是在正常的系統(tǒng)操作中復(fù)用配置數(shù)據(jù),而不需重新編譯鏈接內(nèi)核。
第二個(gè)限制是在linux運(yùn)行在不同的硬件配置上的安裝問(wèn)題。這種情況下,只需產(chǎn)生一個(gè)小內(nèi)核,分別配置。initrd中必須含有所有需要的模塊。然后,/linuxrc或其他一個(gè)文件可能有所不同。
第三個(gè)限制更方便恢復(fù)磁盤,因?yàn)橄蟾募到y(tǒng)分區(qū)的信息在系統(tǒng)啟動(dòng)的時(shí)候要用,而在啟動(dòng)時(shí)刻是得不到的。
最后,CDROM發(fā)布使他更方便安裝。
荒廢的根改變機(jī)制
----------------
下面的機(jī)制在pivot_root之前被使用。當(dāng)前的內(nèi)核仍然支持他,但是你不要依賴他。
他在linuxrc存在的情況下,把真正的根設(shè)備作為根文件系統(tǒng)。initrd文件系統(tǒng)然后被
卸載,或者把他移動(dòng)到/initrd目錄,如果這個(gè)目錄存在于新的根文件系統(tǒng)。
為了使用這種機(jī)制,你不必設(shè)定啟動(dòng)參數(shù)root,init,rw(如果設(shè)定了,這將影響到真正的
根文件系統(tǒng))。
本文來(lái)自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u/474/showart_68582.html |
|