linux kernel在自身初始化完成之後,需要能夠找到並執行第乙個使用者程式(這個程式通常叫做「init」程式)。使用者程式存在於檔案系統之中,因此,核心必須找到並掛載乙個檔案系統才可以成功完成系統的引導過程。
在grub中提供了乙個選項「root=」用來指定第乙個檔案系統,但隨著硬體的發展,很多情況下這個檔案系統也許是存放在usb裝置,scsi裝置等等多種多樣的裝置之上,如果需要正確引導,usb或者scsi驅動模組首先需要執行起來,可是不巧的是,這些驅動程式也是存放在檔案系統裡,因此會形成乙個悖論。
為解決此問題,linux kernel提出了乙個ram disk的解決方案,把一些啟動所必須的使用者程式和驅動模組放在ram disk中,這個ram disk看上去和普通的disk一樣,有檔案系統,有cache,核心啟動時,首先把ram disk掛載起來,等到init程式和一些必要模組執行起來之後,再切到真正的檔案系統之中。
上面提到的ram disk的方案實際上就是initrd。如果仔細考慮一下,initrd雖然解決了問題但並不完美。比如,disk有cache機制,對於ram disk來說,這個cache機制就顯得很多餘且浪費空間;disk需要檔案系統,那檔案系統(如ext2等)必須被編譯進kernel而不能作為模組來使用。
linux 2.6 kernel提出了一種新的實現機制,即initramfs。顧名思義,initramfs只是一種ram filesystem而不是disk。initramfs實際是乙個cpio歸檔,啟動所需的使用者程式和驅動模組被歸檔成乙個檔案。因此,不需要cache,也不需要檔案系統。
更加詳細的initramfs的資料可以參考如下:
(1) 黃敬群先生的blog:深入理解 linux 2.6 的 initramfs 機制
(2) initramfs, a new model for initial ram
下面是一些使用initramfs的簡單幫助
1. 檢視initramfs的內容
# mkdir temp ; cd temp
# cp /boot/initrd.img-2.6.24-16 initrd.img-2.6.24-16.gz
# gunzip initrd.img-2.6.24-16.gz
# cpio -i --make-directories
# 2. 建立initramfs
命令:mkinitramfs, update-initramfs
1) mkinitramfs
# mkinitramfs -o /boot/initrd.img 2.6.24-16
note: 2.6.24-16是需要建立initramfs的kernel版本號,如果是給當前kernel製作initramfs,可以用uname -r檢視當前的版本號。提供kernel版本號的主要目的是為了在initramfs中新增指定kernel的驅動模組。mkinitramfs會把/lib/modules/$/ 目錄下的一些啟動會用到的模組新增到initramfs中。
2)update-initramfs
更新當前kernel的initramfs
# update-initramfs -u
在新增模組時,initramfs tools只會新增一些必要模組,使用者可以通過在/etc/initramfs-tools/modules檔案中加入模組名稱來指定必須新增的模組。
製作uImage映象
由於uboot 只能用來啟動uimage,不能啟動zimage,因此當核心編譯結束生成zimage 映象檔案後,還需要進一步製作uimage 映象.1 製作uboot 時,在uboot 的tools 目錄下會生成mkimage 工具,約52kb.2 將tools 目錄下生成的mkimage 檔案拷貝...
製作CentOS映象
製作centos映象 2010 02 08 00 20 49 標籤 系統 centos 休閒職場 原始出處 作者資訊和本宣告。否則將追究法律責任。製作centos映象 mkdir pv iso centos 先建立centos目錄 touch packages.txt 建立這個檔案,用來存軟體包的名...
製作docker映象
命令docker build,從零開始來建立乙個新的映象。為此,我們需要建立乙個 dockerfile 檔案,其中包含一組指令來告訴 docker 如何構建我們的映象 指定基礎映象 from openjdk 8 dockerfile使用變數 可以在dockerfile中進行引用 工作目錄 指定ver...