【Linux技術】Linux內核Initrd機制解析,內核更新步驟,grub配置說明

什麼是Initrd

   initrd的英文含義是 boot loader initialized RAM disk,就是由boot loader初始化的內存盤。在 linux內核啓動前, boot loader 會將存儲介質中的 initrd 文件加載到內存,內核啓動時會在訪問真正的根文件系統前先訪問該內存中的 initrd 文件系統

   在 boot loader 配置了 initrd 的情況下,內核啓動被分成了兩個階段,第一階段先執行 initrd文件系統中的"某個文件",完成加載驅動模塊等任務,第二階段纔會執行真正的根文件系統中的 /sbin/init 進程。

   這裏提到的"某個文件",Linux2.6 內核會同以前版本內核的不同,所以這裏暫時使用了"某個文件"這個稱呼,後面會詳細講到。

   第一階段啓動的目的是爲第二階段的啓動掃清一切障礙,最主要的是加載根文件系統存儲介質的驅動模塊。爲了在內核啓動之後能夠判斷哪些硬件驅動需要加載,哪些不需要,文件系統有沒有問題等,最終使得根分區能順利加載。我們知道根文件系統可以存儲在包括IDE、SCSI、USB在內的多種介質上,如果將這些設備的驅動都編譯進內核,可以想象內核會多麼龐大、臃腫。



Initrd的用途

   1.linux 發行版的必備部件

   linux 發行版必須適應各種不同的硬件架構,將所有的驅動編譯進內核是不現實的,initrd技術是解決該問題的關鍵技術,Linux發行版在內核中只編譯了基本的硬件驅動,在安裝過程中通過檢測系統硬件,生成包含安裝系統硬件驅動的initrd,無非是一種即可行又靈活的解決方案。

   2.livecd 的必備部件

   同linux發行版相比livecd可能會面對更加複雜的硬件環境,所以也必須使用initrd。

   3.製作 Linux usb 啓動盤必須使用 initrd

   usb 設備是啓動比較慢的設備,從驅動加載到設備真正可用大概需要幾秒鐘時間。如果將usb驅動編譯進內核,內核通常不能成功訪問usb設備中的文件系統。因爲在內核訪問usb設備時,usb設備通常沒有初始化完畢。所以常規的做法是,在 initrd 中加載usb驅動,然後休眠幾秒中,等待usb設備初始化完畢後再掛載usb設備中的文件系統。

   4.在linuxrc腳本中可以很方便地啓用個性化bootsplash。



Linux2.4內核對Initrd的處理流程

   爲了清晰的瞭解Linux2.6內核initrd機制的變化,在介紹Linux2.6內核initrd之前,先對linux2.4內核的initrd進行一個簡單的介紹。Linux2.4內核的initrd的格式是文件系統鏡像文件,本文將其稱爲image-initrd,以區別後面介紹的linux2.6內核的cpio格式的initrd。

linux2.4內核對initrd的處理流程如下:

   1.boot loader把內核以及/dev/initrd的內容加載到內存,/dev/initrd是由boot loader初始化的設備,存儲着initrd。

   2.在內核初始化過程中,內核把/dev/initrd設備的內容解壓縮並拷貝到/dev/ram0設備上。

   3.內核以可讀寫的方式把/dev/ram0設備掛載爲原始的根文件系統。

   4.如果/dev/ram0被指定爲真正的根文件系統,那麼內核跳至最後一步正常啓動。

   5.執行initrd上的/linuxrc文件,linuxrc通常是一個腳本文件,負責加載內核訪問根文件系統必須的驅動,以及加載根文件系統。

   6./linuxrc執行完畢,真正的根文件系統被掛載。

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

   8.在真正的根文件系統上進行正常啓動過程,執行/sbin/init。linux2.4內核的initrd的執行是作爲內核啓動的一箇中間階段,也就是說initrd的/linuxrc執行以後,內核會繼續執行初始化代碼,我們後面會看到這是linux2.4內核同2.6內核的initrd處理流程的一個顯著區別。



Linux2.6內核對Initrd的處理流程

   linux2.6內核支持兩種格式的initrd,一種是前面第3部分介紹的linux2.4內核那種傳統格式的文件系統鏡像-image-initrd,它的製作方法同Linux2.4內核的initrd一樣,其核心文件就是/linuxrc。另外一種格式的initrd 是cpio格式的,這種格式的initrd從 linux2.5 起開始引入,使用cpio工具生成,其核心文件不再是/linuxrc,而是/init,本文將這種initrd稱爲cpio-initrd。

   儘管linux2.6內核對cpio-initrd和image-initrd這兩種格式的initrd均支持,但對其處理流程有着顯著的區別,下面分別介紹linux2.6內核對這兩種initrd的處理流程。

   cpio-initrd 的處理流程

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

   2.內核判斷initrd的文件格式,如果是cpio格式。

   3.將initrd的內容釋放到rootfs中。

   4.執行initrd中的/init文件,執行到這一點,內核的工作全部結束,完全交給/init文件處理。

   image-initrd的處理流程

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

   2.內核判斷initrd的文件格式,如果不是cpio格式,將其作爲image-initrd處理。

   3.內核將initrd的內容保存在rootfs下的/initrd.image文件中。

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

   5.接着內核以可讀寫的方式把/dev/ram0設備掛載爲原始的根文件系統。

   6..如果/dev/ram0被指定爲真正的根文件系統,那麼內核跳至最後一步正常啓動。

   7.執行initrd上的/linuxrc文件,linuxrc通常是一個腳本文件,負責加載內核訪問根文件系統必須的驅動,以及加載根文件系統。

   8./linuxrc執行完畢,常規根文件系統被掛載

   9.如果常規根文件系統存在/initrd目錄,那麼/dev/ram0將從/移動到/initrd。否則如果/initrd目錄不存在,/dev/ram0將被卸載。

   10.在常規根文件系統上進行正常啓動過程 ,執行/sbin/init。

通過上面的流程介紹可知,Linux2.6內核對image-initrd的處理流程同linux2.4內核相比並沒有顯著的變化,cpio-initrd的處理流程相比於image-initrd的處理流程卻有很大的區別,流程非常簡單。



Linux發行版內核更新步驟

   (1)進入內核目錄,執行清理工作:make distclean(對於全新的內核,此步可以省略)。

   (2)複製參考配置文件到內核目錄下的.config。

   (3)使.config生效:make menuconfig。

   (4)編譯內核鏡像:make bzImage。

   (5)編譯內核模塊:make modules。

   (6)安裝內核模塊:make modules_install。

   (7)製作initrd:RHEL、fedoral等使用mkinitrd,Ubuntu、Debian等使用mkinitramfs。

   (8)複製initrd和內核鏡像bzImage到/boot。

   (9)修改grub配置文檔,添加新的啓動項。

   (10)然後重啓系統,進入grub選擇從新的內核啓動。



grub配置文件說明

   (1)default行,是指grub啓動時默認菜單項。0表示第一項,如果是多系統可以修改此選項改變默認光標停留位置。

   (2)timeout行,是指在菜單到自動啓動系統前的停留時間,單位時間爲sec,可以按需分配。

   (3)splashimage行,指定啓動菜單的背景圖標,圖片格式應該是xpm。

   (4)hiddenmenu行,用於啓動時隱藏菜單,除非在 timeout 之前按下 Esc鍵才能看到菜單。

   (5)password行,用於定義進入 GRUB 命令模式的密碼。你還可以爲每個操作系統都定義一個密碼,方法是把 password 命令放在 title行之後。

   第25~28行爲linux類,其一般格式如下。

title (......)
root (hd[0-n],x)
kernel (......)
initrd (......)

   title行,指定一個啓動操作系統名稱。

   root行,指定相應內核鏡像所在目錄/boot所在的磁盤分區,hd[0-n]表示的是第幾個硬盤,x則表示的是[第幾個分區-1]。

   kernel行,指定Linux的內核鏡像所在路徑。

   initrd行,指定Linux的initial ramdisk所在路徑。


本文出自 “成鵬致遠” 博客,請務必保留此出處http://infohacker.blog.51cto.com/6751239/1201947

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章