首頁 > linux教程 > Linux系統啟動管理 閱讀:0更新時間:2020-03-28 01:02:34

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 <initramfs-2.6.32-279.el6.i686.img
#解壓縮
[root@localhost initramfs]#ll
總用量34512
drwxr-xr-x. 2 root root 4096 4月 2412:10 bin
drwxr-xr-x. 2 root root 4096 4 月 24 12:10 cmdline
drwxr-xr-x. 3 root root 4096 4月 24 12:10 dev
-rw-r--r--. 1 root root 19 4 月 24 12:10 dracut-004-283.el6
drwxr-xr-x. 2 root root 4096 4 月 24 12:10 emergency
drwxr-xr-x. 7 root root 4096 4月 24 12:10 etc
-rwxr-xr-x. 1 root root 8962 4月 24 12:10 init
drwxr-xr-x. 2 root root 4096 4 月 24 12:10 initqueue
drwxr-xr-x. 2 root root 4096 4 月 24 12:10 initqueue-finished
drwxr-xr-x. 2 root root 4096 4 月 24 12:10 initqueue-settled
drwxr-xr-x. 2 root root 4096 4 月 24 12:10
initqueue-timeout
-rw-r--r--. 1 root root 35235328 4 月 24 12:09 initramfs-2.6.32-279.el6.i686.img
drwxr-xr-x. 9 root root 4096 4月 2412:10 lib
…省略部分輸出…
#這就是initramfs虛擬文件系統中的內容,和根目錄是不是很像

beylze編程學院,一個分享編程知識和seo優化知識的網站。跟著beylze一起學習,每天都有進步。

通俗易懂,深入淺出,一篇文章只講一個知識點。

文章不深奧,不需要鉆研,在公交、在地鐵、在廁所都可以閱讀,隨時隨地漲姿勢。

文章不涉及代碼,不燒腦細胞,人人都可以學習。

當你決定關注beylze(公眾號:beylze),你已然超越了90%的其他從業者!

相關文章

優秀教程

国产亚洲欧美日韩