1. gzyueqian
      13352868059
      首頁 > 新聞中心 > > 正文

      Linux2.4內(nèi)核和2.6內(nèi)核對Initrd處理流程

      更新時間: 2008-03-28 15:59:26來源: 粵嵌教育瀏覽量:566

        Linux 的 initrd 技術(shù)是一個非常普遍使用的機制,linux2.6 內(nèi)核的 initrd 的文件格式由原來的文件系統(tǒng)鏡像文件轉(zhuǎn)變成了 cpio 格式,變化不僅反映在文件格式上, linux 內(nèi)核對這兩種格式的 initrd 的處理有著截然的不同。

        initrd 的英文含義是 boot loader initialized RAM disk,就是由 boot loader 初始化的內(nèi)存盤。在 linux內(nèi)核啟動前, boot loader 會將存儲介質(zhì)中的 initrd 文件加載到內(nèi)存,內(nèi)核啟動時會在訪問真正的根文件系統(tǒng)前先訪問該內(nèi)存中的 initrd 文件系統(tǒng)。在 boot loader 配置了 initrd 的情況下,內(nèi)核啟動被分成了兩個階段,階段先執(zhí)行 initrd 文件系統(tǒng)中的"某個文件",完成加載驅(qū)動模塊等任務(wù),第二階段才會執(zhí)行真正的根文件系統(tǒng)中的 /sbin/init 進(jìn)程。這里提到的"某個文件",Linux2.6 內(nèi)核會同以前版本內(nèi)核的不同,所以這里暫時使用了"某個文件"這個稱呼,后面會詳細(xì)講到。階段啟動的目的是為第二階段的啟動掃清一切障愛,主要的是加載根文件系統(tǒng)存儲介質(zhì)的驅(qū)動模塊。我們知道根文件系統(tǒng)可以存儲在包括IDE、SCSI、USB在內(nèi)的多種介質(zhì)上,如果將這些設(shè)備的驅(qū)動都編譯進(jìn)內(nèi)核,可以想象內(nèi)核會多么龐大、臃腫。

        Linux2.4內(nèi)核對 Initrd 的處理流程

        為了使讀者清晰的了解Linux2.6內(nèi)核initrd機制的變化,在重點介紹Linux2.6內(nèi)核initrd之前,先對linux2.4內(nèi)核的initrd進(jìn)行一個簡單的介紹。Linux2.4內(nèi)核的initrd的格式是文件系統(tǒng)鏡像文件,本文將其稱為image-initrd,以區(qū)別后面介紹的linux2.6內(nèi)核的cpio格式的initrd。 linux2.4內(nèi)核對initrd的處理流程如下:

        1. boot loader把內(nèi)核以及/dev/initrd的內(nèi)容加載到內(nèi)存,/dev/initrd是由boot loader初始化的設(shè)備,存儲著initrd。

        2. 在內(nèi)核初始化過程中,內(nèi)核把 /dev/initrd 設(shè)備的內(nèi)容解壓縮并拷貝到 /dev/ram0 設(shè)備上。

        3. 內(nèi)核以可讀寫的方式把 /dev/ram0 設(shè)備掛載為原始的根文件系統(tǒng)。

        4. 如果 /dev/ram0 被指定為真正的根文件系統(tǒng),那么內(nèi)核跳至一步正常啟動。

        5. 執(zhí)行 initrd 上的 /linuxrc 文件,linuxrc 通常是一個腳本文件,負(fù)責(zé)加載內(nèi)核訪問根文件系統(tǒng)必須的驅(qū)動, 以及加載根文件系統(tǒng)。

        6. /linuxrc 執(zhí)行完畢,真正的根文件系統(tǒng)被掛載。

        7. 如果真正的根文件系統(tǒng)存在 /initrd 目錄,那么 /dev/ram0 將從 / 移動到 /initrd。否則如果 /initrd 目錄不存在, /dev/ram0 將被卸載。

        8. 在真正的根文件系統(tǒng)上進(jìn)行正常啟動過程 ,執(zhí)行 /sbin/init。 linux2.4 內(nèi)核的 initrd 的執(zhí)行是作為內(nèi)核啟動的一個中間階段,也就是說 initrd 的 /linuxrc 執(zhí)行以后,內(nèi)核會繼續(xù)執(zhí)行初始化代碼,我們后面會看到這是 linux2.4 內(nèi)核同 2.6 內(nèi)核的 initrd 處理流程的一個顯著區(qū)別。

        Linux2.6 內(nèi)核對 Initrd 的處理流程

        linux2.6 內(nèi)核支持兩種格式的 initrd,一種是前面第 3 部分介紹的 linux2.4 內(nèi)核那種傳統(tǒng)格式的文件系統(tǒng)鏡像-image-initrd,它的制作方法同 Linux2.4 內(nèi)核的 initrd 一樣,其核心文件就是 /linuxrc。另外一種格式的 initrd 是 cpio 格式的,這種格式的 initrd 從 linux2.5 起開始引入,使用 cpio 工具生成,其核心文件不再是 /linuxrc,而是 /init,本文將這種 initrd 稱為 cpio-initrd。盡管 linux2.6 內(nèi)核對 cpio-initrd和 image-initrd 這兩種格式的 initrd 均支持,但對其處理流程有著顯著的區(qū)別,下面分別介紹 linux2.6 內(nèi)核對這兩種 initrd 的處理流程。

        cpio-initrd 的處理流程:

        1. boot loader 把內(nèi)核以及 initrd 文件加載到內(nèi)存的特定位置。

        2. 內(nèi)核判斷initrd的文件格式,如果是cpio格式。

        3. 將initrd的內(nèi)容釋放到rootfs中。

        4. 執(zhí)行initrd中的/init文件,執(zhí)行到這一點,內(nèi)核的工作全部結(jié)束,完全交給/init文件處理。

        image-initrd的處理流程:

        1. boot loader把內(nèi)核以及initrd文件加載到內(nèi)存的特定位置。

        2. 內(nèi)核判斷initrd的文件格式,如果不是cpio格式,將其作為image-initrd處理。

        3. 內(nèi)核將initrd的內(nèi)容保存在rootfs下的/initrd.image文件中。

        4. 內(nèi)核將/initrd.image的內(nèi)容讀入/dev/ram0設(shè)備中,也就是讀入了一個內(nèi)存盤中。

        5. 接著內(nèi)核以可讀寫的方式把/dev/ram0設(shè)備掛載為原始的根文件系統(tǒng)。

        6. .如果/dev/ram0被指定為真正的根文件系統(tǒng),那么內(nèi)核跳至一步正常啟動。

        7. 執(zhí)行initrd上的/linuxrc文件,linuxrc通常是一個腳本文件,負(fù)責(zé)加載內(nèi)核訪問根文件系統(tǒng)必須的驅(qū)動, 以及加載根文件系統(tǒng)。

        8. /linuxrc執(zhí)行完畢,常規(guī)根文件系統(tǒng)被掛載

        9. 如果常規(guī)根文件系統(tǒng)存在/initrd目錄,那么/dev/ram0將從/移動到/initrd。否則如果/initrd目錄不存在, /dev/ram0將被卸載。

        10. 在常規(guī)根文件系統(tǒng)上進(jìn)行正常啟動過程 ,執(zhí)行/sbin/init。

        通過上面的流程介紹可知,Linux2.6內(nèi)核對image-initrd的處理流程同linux2.4內(nèi)核相比并沒有顯著的變化, cpio-initrd的處理流程相比于image-initrd的處理流程卻有很大的區(qū)別,流程非常簡單,在后面的源代碼分析中,讀者更能體會到處理的簡捷。

        cpio-initrd同image-initrd的區(qū)別與優(yōu)勢

        沒有找到正式的關(guān)于cpio-initrd同image-initrd對比的文獻(xiàn),根據(jù)筆者的使用體驗以及內(nèi)核代碼的分析,總結(jié)出如下三方面的區(qū)別,這些區(qū)別也正是cpio-initrd的優(yōu)勢所在:cpio-initrd的制作方法更加簡單。cpio-initrd的制作非常簡單,通過兩個命令就可以完成整個制作過程。

        #假設(shè)當(dāng)前目錄位于準(zhǔn)備好的initrd文件系統(tǒng)的根目錄下:

        bash# find . | cpio -c -o > ../initrd.img

        bash# gzip ../initrd.img

        而傳統(tǒng)initrd的制作過程比較繁瑣,需要如下六個步驟,#假設(shè)當(dāng)前目錄位于準(zhǔn)備好的initrd文件系統(tǒng)的根目錄下:

        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

      免費預(yù)約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 中文字幕精品亚洲人成 | 在线不卡日本v二区707 | 日韩欧美国产aⅴ另类 | 亚洲欧美另类综合日韩 | 日产中文字幕在线精品一区 | 亚洲国产精品浪潮久久久AV |