新聞中心

成都創(chuàng)新互聯(lián)公司是專業(yè)的孟連網(wǎng)站建設(shè)公司,孟連接單;提供成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行孟連網(wǎng)站開發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
內(nèi)核完成再次系統(tǒng)自檢之后,開始采用動(dòng)態(tài)的方式加載每個(gè)硬件的模塊,這個(gè)動(dòng)態(tài)模塊大家可以想象成硬件的驅(qū)動(dòng)(默認(rèn) Linux 硬件的驅(qū)動(dòng)是不需要手工安裝的,如果是重要的功能,則會(huì)直接編譯到內(nèi)核當(dāng)中;如果是非重要的功能,比如硬件驅(qū)動(dòng)會(huì)編譯為模塊,則在需要時(shí)由內(nèi)核調(diào)用。不過,如果沒有被內(nèi)核硬件,要想驅(qū)動(dòng),就需要手工安裝個(gè)硬件的硬塊了。具體的安裝方法會(huì)在后續(xù)章節(jié)中介紹)。
那么,Linux 的內(nèi)核到底放在了哪里呢?當(dāng)然是 /boot 的啟動(dòng)目錄中了,我們來(lái)看看這個(gè)目錄下的內(nèi)容吧。
[root@localhost ~]#ls /boot/
config-2.6.32-279.el6.i686
#內(nèi)核的配置文件,內(nèi)核編譯時(shí)選擇的功能與模塊
efi
#可擴(kuò)展固件接口,為英特爾為全新PC固件的體系結(jié)構(gòu)、接口和服務(wù)提出的建議標(biāo)準(zhǔn)
grub
#啟動(dòng)引導(dǎo)程GTUB的數(shù)據(jù)目錄
initramfe-2.6.32-279.el6.i686.img
#虛擬文件系統(tǒng)(CentOS 6.x 中用initramfs替代了initrd,但功能是一樣的)
lost+found
故boot分區(qū)的備份目錄
symvers-2_6.32-279.el6.i686.gz
#模塊符號(hào)信息
System.map-2.6.32-279.el6.i686
#內(nèi)核功能和內(nèi)存地址的對(duì)應(yīng)列表
vmlinuz-2.6.32-279.el6.i686
#用于啟動(dòng)的Linux內(nèi)核。這個(gè)文件是一個(gè)壓縮的內(nèi)核鏡像
我們已經(jīng)知道,Linux 會(huì)把不重要的功能編譯成內(nèi)核模塊,在需要時(shí)再調(diào)用,從而保證了內(nèi)核不會(huì)過大。在多數(shù) Linux 中,都會(huì)把硬件的驅(qū)動(dòng)程序編譯為模塊, 這些模塊保存在 /lib/modules 目錄中。常見的 USB、SATA 和 SCSI 等硬盤設(shè)備的驅(qū)動(dòng),還有一些特殊的文件系統(tǒng)(如 LVM、RAID 等)的驅(qū)動(dòng),都是以模塊的方式來(lái)保存的。
如果 Linux 安裝在 IDE 硬盤之上,并且采用的是默認(rèn)的 ext3/4 文件系統(tǒng),那么內(nèi)核啟動(dòng)后加載根分區(qū)和模塊的加載都沒有什么問題,系統(tǒng)會(huì)順利啟動(dòng)。但是,如果 Linux 安裝在 SCSI 硬盤之上,或者采用的是 LVM 文件系統(tǒng),那么內(nèi)核(內(nèi)核載入內(nèi)存是啟動(dòng)引導(dǎo)程序 GRUB 調(diào)用的,并不存在硬盤驅(qū)動(dòng)不識(shí)別的問題)在加載根目錄之前是需要加載 SCSI 硬盤或 LVM 文件系統(tǒng)的驅(qū)動(dòng)的。
SCSI 硬盤和 LVM 文件系統(tǒng)的驅(qū)動(dòng)都放在硬盤的 /lib/modules 目錄中,既然內(nèi)核沒有辦法識(shí)別 SCSI 硬盤或 LVM 文件系統(tǒng),那怎么可能讀取 /lib/modules 目錄中的驅(qū)動(dòng)呢?Linux 給出的解決辦法是使用 initramfs 這個(gè)虛擬文件系統(tǒng)來(lái)處理這個(gè)問題。
initramfe虛擬文件系統(tǒng)
CentOS 6.x 中使用 initramfs 虛擬文件系統(tǒng)取代了 CentOS 5.x 中的 initrd RAM Disk。它們的作用類似,可以通過啟動(dòng)引導(dǎo)程序加載到內(nèi)存中,然后會(huì)解壓縮并在內(nèi)存中仿真成一個(gè)根目錄,并且這個(gè)仿真的文件系統(tǒng)能夠提供一個(gè)可執(zhí)行程序,通過該程序來(lái)加載啟動(dòng)過程中所需的內(nèi)核模塊,比如 USB、SATA. SCSI 硬盤的驅(qū)動(dòng)和 LVM、RAID 文件系統(tǒng)的驅(qū)動(dòng)。
也就是說,通過 initramfs 虛擬文件系統(tǒng)在內(nèi)存中模擬出一個(gè)根目錄,然后在這個(gè)模擬根目錄中加載 SCSI 等硬件的驅(qū)動(dòng),就可以加載真正的根目錄了,之后才能調(diào)用 Linux 的第一個(gè)進(jìn)程 /sbin/init。
Initramfs 虛擬文件系統(tǒng)主要有以下優(yōu)點(diǎn):
- initramfs 隨著其中數(shù)據(jù)的増減自動(dòng)増減容量。
- 在 initramfs 和頁(yè)面緩存之間沒有重復(fù)數(shù)據(jù)。
- initramfs 重復(fù)利用了 Linux caching 的代碼,因此幾乎沒有増加內(nèi)核尺寸,而 caching 的代碼已經(jīng)經(jīng)過良好測(cè)試,所以 initramfs 的代碼質(zhì)量也有保證。
- 不需要額外的文件系統(tǒng)驅(qū)動(dòng)。
其實(shí)大家只需要知道 initramfs 是為了在內(nèi)核中建立一個(gè)模擬根目錄,這個(gè)模擬根目錄是為了可以調(diào)用 USB、SATA、SCSI、LVM、RAID 等硬盤接口或文件系統(tǒng)的驅(qū)動(dòng)模塊,加載了驅(qū)動(dòng)模塊后才可以加載真正的系統(tǒng)根目錄。我們可以通過示意圖 1 來(lái)表示這個(gè)過程。
圖 1 內(nèi)核啟動(dòng)流程
那么既然 initramfs 是一個(gè)仿真根目錄,那么我們是否可以看看這個(gè)仿真根目錄中到底是什么樣子的呢?當(dāng)然可以,命令如下:
[root@localhost ~]# mkdir /tmp/initramfs
#建立測(cè)試目錄
[root@localhost ~]# cp/boot/
initramfs-2.6.32-279.el6.i686.img/tmp/initramfs/
#復(fù)制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
#查看文件類型,發(fā)現(xiàn)這個(gè)文件是一個(gè)使用gzip命令打包的壓縮包
[root@localhost initramfs]# mv initramfs-2.6.32-279.el6.i686.imginitramfs-2.6.32-279.el6.i686.img.gz
#修改文件的擴(kuò)展名為.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
[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虛擬文件系統(tǒng)中的內(nèi)容,和根目錄是不是很像
標(biāo)題名稱:Linux內(nèi)核(內(nèi)核模塊)的加載過程(超詳細(xì))
網(wǎng)頁(yè)地址:http://fisionsoft.com.cn/article/dpicpoe.html


咨詢
建站咨詢
