16.4 Linux內核(內核模塊)的加載
GRUB 加載了內核之后,內核首先會再進行二次系統的自檢,而不一定使用 BIOS 檢測的硬件信息。這時內核終于開始替代 BIOS 接管 Linux 的啟動過程了。
內核完成再次系統自檢之后,開始采用動態的方式加載每個硬件的模塊,這個動態模塊大家可以想象成硬件的驅動(默認 Linux 硬件的驅動是不需要手工安裝的,如果是重要的功能,則會直接編譯到內核當中;如果是非重要的功能,比如硬件驅動會編譯為模塊,則在需要時由內核調用。不過,如果沒有被內核硬件,要想驅動,就需要手工安裝個硬件的硬塊了。具體的安裝方法會在后續章節中介紹)。
那么,Linux 的內核到底放在了哪里呢?當然是 /boot 的啟動目錄中了,我們來看看這個目錄下的內容吧。
[root@localhost ~]#ls /boot/ config-2.6.32-279.el6.i686 \#內核的配置文件,內核編譯時選擇的功能與模塊 efi \#可擴展固件接口,為英特爾為全新PC固件的體系結構、接口和服務提出的建議標準 grub \#啟動引導程GTUB的數據目錄 initramfe-2.6.32-279.el6.i686.img \#虛擬文件系統(CentOS 6.x 中用initramfs替代了initrd,但功能是一樣的) lost+found 故boot分區的備份目錄 symvers-2_6.32-279.el6.i686.gz \#模塊符號信息 System.map-2.6.32-279.el6.i686 \#內核功能和內存地址的對應列表 vmlinuz-2.6.32-279.el6.i686 \#用于啟動的Linux內核。這個文件是一個壓縮的內核鏡像
我們已經知道,Linux 會把不重要的功能編譯成內核模塊,在需要時再調用,從而保證了內核不會過大。在多數 Linux 中,都會把硬件的驅動程序編譯為模塊, 這些模塊保存在 /lib/modules 目錄中。常見的 USB、SATA 和 SCSI 等硬盤設備的驅動,還有一些特殊的文件系統(如 LVM、RAID 等)的驅動,都是以模塊的方式來保存的。
如果 Linux 安裝在 IDE 硬盤之上,并且采用的是默認的 ext3/4 文件系統,那么內核啟動后加載根分區和模塊的加載都沒有什么問題,系統會順利啟動。但是,如果 Linux 安裝在 SCSI 硬盤之上,或者采用的是 LVM 文件系統,那么內核(內核載入內存是啟動引導程序 GRUB 調用的,并不存在硬盤驅動不識別的問題)在加載根目錄之前是需要加載 SCSI 硬盤或 LVM 文件系統的驅動的。
SCSI 硬盤和 LVM 文件系統的驅動都放在硬盤的 /lib/modules 目錄中,既然內核沒有辦法識別 SCSI 硬盤或 LVM 文件系統,那怎么可能讀取 /lib/modules 目錄中的驅動呢?Linux 給出的解決辦法是使用 initramfs 這個虛擬文件系統來處理這個問題。
initramfe虛擬文件系統
CentOS 6.x 中使用 initramfs 虛擬文件系統取代了 CentOS 5.x 中的 initrd RAM Disk。它們的作用類似,可以通過啟動引導程序加載到內存中,然后會解壓縮并在內存中仿真成一個根目錄,并且這個仿真的文件系統能夠提供一個可執行程序,通過該程序來加載啟動過程中所需的內核模塊,比如 USB、SATA. SCSI 硬盤的驅動和 LVM、RAID 文件系統的驅動。
也就是說,通過 initramfs 虛擬文件系統在內存中模擬出一個根目錄,然后在這個模擬根目錄中加載 SCSI 等硬件的驅動,就可以加載真正的根目錄了,之后才能調用 Linux 的第一個進程 /sbin/init。
Initramfs 虛擬文件系統主要有以下優點:
initramfs 隨著其中數據的増減自動増減容量。
在 initramfs 和頁面緩存之間沒有重復數據。
initramfs 重復利用了 Linux caching 的代碼,因此幾乎沒有増加內核尺寸,而 caching 的代碼已經經過良好測試,所以 initramfs 的代碼質量也有保證。
不需要額外的文件系統驅動。
其實大家只需要知道 initramfs 是為了在內核中建立一個模擬根目錄,這個模擬根目錄是為了可以調用 USB、SATA、SCSI、LVM、RAID 等硬盤接口或文件系統的驅動模塊,加載了驅動模塊后才可以加載真正的系統根目錄。我們可以通過示意圖 1 來表示這個過程。
圖 1 內核啟動流程
那么既然 initramfs 是一個仿真根目錄,那么我們是否可以看看這個仿真根目錄中到底是什么樣子的呢?當然可以,命令如下:
[root@localhost ~]# mkdir /tmp/initramfs \#建立測試目錄 [root@localhost ~]# cp/boot/ initramfs-2.6.32-279.el6.i686.img/tmp/initramfs/ \#復制initramfs文件 [root@localhost ~]# cd /tmp/initramfs/ [root@localhost initramfs]# file initramfs-2.6.32-279.el6.i686.img initramfe-2.6.32-279.el6.i686.img:gzip compressed data,from Unix,last modified: Wed Apr 10 21:49:34 2013, max compression \#查看文件類型,發現這個文件是一個使用gzip命令打包的壓縮包 [root@localhost initramfs]# mv initramfs-2.6.32-279.el6.i686.imginitramfs-2.6.32-279.el6.i686.img.gz \#修改文件的擴展名為.gz [root@localhost initramfs]# gunzip initramfs-2.6.32-279.el6.i686.img.gz \#解壓縮 [root@localhost initramfs]# ls initramfs-2.6.32-279.el6.i686.img [root@localhost initramfs]# file initramfs-2.6.32-279.el6.i686.img initramfe-2.6.32-279.el6.i686.img: ASCII cpio archive (SVR4withnoCRC) \#查看文件類型,使用cpio命令的壓縮文件 [root@localhost initramfs]# cpio -ivcdu Linux
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。