日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

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

Linux 的 initrd 技術(shù)是一個(gè)非常普遍使用的機(jī)制,linux2.6 內(nèi)核的 initrd 的文件格式由原來(lái)的文件系統(tǒng)鏡像文件轉(zhuǎn)變成了 cpio 格式,變化不僅反映在文件格式上, linux 內(nèi)核對(duì)這兩種格式的 initrd 的處理有著截然的不同 。initrd 的英文含義是 boot loader initialized RAM disk,就是由 boot loader 初始化的內(nèi)存盤 。在 linux內(nèi)核啟動(dòng)前, boot loader 會(huì)將存儲(chǔ)介質(zhì)中的 initrd 文件加載到內(nèi)存,內(nèi)核啟動(dòng)時(shí)會(huì)在訪問(wèn)真正的根文件系統(tǒng)前先訪問(wèn)該內(nèi)存中的 initrd 文件系統(tǒng) 。在 boot loader 配置了 initrd 的情況下,內(nèi)核啟動(dòng)被分成了兩個(gè)階段,第一階段先執(zhí)行 initrd 文件系統(tǒng)中的"某個(gè)文件",完成加載驅(qū)動(dòng)模塊等任務(wù),第二階段才會(huì)執(zhí)行真正的根文件系統(tǒng)中的 /sbin/init 進(jìn)程 。這里提到的"某個(gè)文件",Linux2.6 內(nèi)核會(huì)同以前版本內(nèi)核的不同,所以這里暫時(shí)使用了"某個(gè)文件"這個(gè)稱呼,后面會(huì)詳細(xì)講到 。第一階段啟動(dòng)的目的是為第二階段的啟動(dòng)掃清一切障愛(ài),最主要的是加載根文件系統(tǒng)存儲(chǔ)介質(zhì)的驅(qū)動(dòng)模塊 。我們知道根文件系統(tǒng)可以存儲(chǔ)在包括IDE、SCSI、USB在內(nèi)的多種介質(zhì)上,如果將這些設(shè)備的驅(qū)動(dòng)都編譯進(jìn)內(nèi)核,可以想象內(nèi)核會(huì)多么龐大、臃腫 。Linux2.4內(nèi)核對(duì) Initrd 的處理流程 為了使讀者清晰的了解Linux2.6內(nèi)核initrd機(jī)制的變化,在重點(diǎn)介紹Linux2.6內(nèi)核initrd之前,先對(duì)linux2.4內(nèi)核的initrd進(jìn)行一個(gè)簡(jiǎn)單的介紹 。Linux2.4內(nèi)核的initrd的格式是文件系統(tǒng)鏡像文件,本文將其稱為image-initrd,以區(qū)別后面介紹的linux2.6內(nèi)核的cpio格式的initrd 。linux2.4內(nèi)核對(duì)initrd的處理流程如下: 1. boot loader把內(nèi)核以及/dev/initrd的內(nèi)容加載到內(nèi)存,/dev/initrd是由boot loader初始化的設(shè)備,存儲(chǔ)著initrd 。2. 在內(nèi)核初始化過(guò)程中,內(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)核跳至最后一步正常啟動(dòng) 。5. 執(zhí)行 initrd 上的 /linuxrc 文件,linuxrc 通常是一個(gè)腳本文件,負(fù)責(zé)加載內(nèi)核訪問(wèn)根文件系統(tǒng)必須的驅(qū)動(dòng), 以及加載根文件系統(tǒng) 。6. /linuxrc 執(zhí)行完畢,真正的根文件系統(tǒng)被掛載 。7. 如果真正的根文件系統(tǒng)存在 /initrd 目錄,那么 /dev/ram0 將從 / 移動(dòng)到 /initrd 。否則如果 /initrd 目錄不存在, /dev/ram0 將被卸載 。8. 在真正的根文件系統(tǒng)上進(jìn)行正常啟動(dòng)過(guò)程 ,執(zhí)行 /sbin/init 。linux2.4 內(nèi)核的 initrd 的執(zhí)行是作為內(nèi)核啟動(dòng)的一個(gè)中間階段,也就是說(shuō) initrd 的 /linuxrc 執(zhí)行以后,內(nèi)核會(huì)繼續(xù)執(zhí)行初始化代碼,我們后面會(huì)看到這是 linux2.4 內(nèi)核同 2.6 內(nèi)核的 initrd 處理流程的一個(gè)顯著區(qū)別 。Linux2.6 內(nèi)核對(duì) 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 起開(kāi)始引入,使用 cpio 工具生成,其核心文件不再是 /linuxrc,而是 /init,本文將這種 initrd 稱為 cpio-initrd 。盡管 linux2.6 內(nèi)核對(duì) cpio-initrd和 image-initrd 這兩種格式的 initrd 均支持,但對(duì)其處理流程有著顯著的區(qū)別,下面分別介紹 linux2.6 內(nèi)核對(duì)這兩種 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í)行到這一點(diǎn),內(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è)備中,也就是讀入了一個(gè)內(nèi)存盤中 。5. 接著內(nèi)核以可讀寫的方式把/dev/ram0設(shè)備掛載為原始的根文件系統(tǒng) 。6. .如果/dev/ram0被指定為真正的根文件系統(tǒng),那么內(nèi)核跳至最后一步正常啟動(dòng) 。7. 執(zhí)行initrd上的/linuxrc文件,linuxrc通常是一個(gè)腳本文件,負(fù)責(zé)加載內(nèi)核訪問(wèn)根文件系統(tǒng)必須的驅(qū)動(dòng), 以及加載根文件系統(tǒng) 。8. /linuxrc執(zhí)行完畢,常規(guī)根文件系統(tǒng)被掛載 9. 如果常規(guī)根文件系統(tǒng)存在/initrd目錄,那么/dev/ram0將從/移動(dòng)到/initrd 。否則如果/initrd目錄不存在, /dev/ram0將被卸載 。10. 在常規(guī)根文件系統(tǒng)上進(jìn)行正常啟動(dòng)過(guò)程 ,執(zhí)行/sbin/init 。通過(guò)上面的流程介紹可知,Linux2.6內(nèi)核對(duì)image-initrd的處理流程同linux2.4內(nèi)核相比并沒(méi)有顯著的變化, cpio-initrd的處理流程相比于image-initrd的處理流程卻有很大的區(qū)別,流程非常簡(jiǎn)單,在后面的源代碼分析中,讀者更能體會(huì)到處理的簡(jiǎn)捷 。cpio-initrd同image-initrd的區(qū)別與優(yōu)勢(shì) 沒(méi)有找到正式的關(guān)于cpio-initrd同image-initrd對(duì)比的文獻(xiàn),根據(jù)筆者的使用體驗(yàn)以及內(nèi)核代碼的分析,總結(jié)出如下三方面的區(qū)別,這些區(qū)別也正是cpio-initrd的優(yōu)勢(shì)所在:cpio-initrd的制作方法更加簡(jiǎn)單 。cpio-initrd的制作非常簡(jiǎn)單,通過(guò)兩個(gè)命令就可以完成整個(gè)制作過(guò)程 。#假設(shè)當(dāng)前目錄位于準(zhǔn)備好的initrd文件系統(tǒng)的根目錄下: bash# find . | cpio -c -o > ../initrd.img bash# gzip ../initrd.img 而傳統(tǒng)initrd的制作過(guò)程比較繁瑣,需要如下六個(gè)步驟,#假設(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

推薦閱讀