linux模塊使用
1. linux內核模塊如何開始和結束
GRLB 載入了內核之後,內核首先會再進行二次系統的自檢,而不一定使用 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/moles/ 目錄中。常見的 USB、SATA 和 SCSI 等硬碟設備的驅動,還有一些特殊的文件系統(如 LVM、RAID 等)的驅動,都是以模塊的方式來保存的。
如果 Linux 安裝在 IDE 硬碟之上,並且採用的是默認的 ext3/4 文件系統,那麼內核啟動後載入根分區和模塊的載入都沒有什麼問題,系統會順利啟動。但是如果 Linux 安裝在 SCSI 硬碟之上,或者採用的是 LVM 文件系統,那麼內核(內核載入入內存是啟動引導程序 GRUB 調用的,並不存在硬碟驅動不識別的問題)在載入根目錄之前是需要載入 SCSI 硬碟或 LVM 文件系統的驅動的。
SCSI 硬碟和 LVM 文件系統的驅動都放在硬碟的 /lib/moles/ 目錄中,既然內核沒有辦法識別 SCSI 硬碟或 LVM 文件系統,那怎麼可能讀取 /lib/moles/ 目錄中的驅動呢?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 來表示這個過程。
[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@localhostinitramfs]#file
initramfs-2.6.32-279.el6.i686.img
initramfe-2.6.32-279.el6.i686.img:gzipcompressed
data,fromUnix,lastmodified:
WedApr1021:49:342013,maxcompression
#查看文件類型,發現這個文件是一個使用gzip命令打包的壓縮包
[root@localhostinitramfs]#mvinitramfs-2.6.32-279.el6.i686.imginitramfs-2.6.32-279.el6.i686.img.gz
#修改文件的擴展名為.gz
[root@localhostinitramfs]#gunzip
initramfs-2.6.32-279.el6.i686.img.gz
#解壓縮
[root@localhostinitramfs]#ls
initramfs-2.6.32-279.el6.i686.img
[root@localhostinitramfs]#file
initramfs-2.6.32-279.el6.i686.img
initramfe-2.6.32-279.el6.i686.img:ASCIIcpioarchive(SVR4withnoCRC)
#查看文件類型,使用cpio命令的壓縮文件
[root@localhostinitramfs]#cpio-ivc<initramfs-2.6.32-279.el6.i686.img
#解壓縮
[root@localhostinitramfs]#ll
總用量34512
drwxr-xr-x.2rootroot40964月2412:10bin
drwxr-xr-x.2rootroot40964月2412:10cmdline
drwxr-xr-x.3rootroot40964月2412:10dev
-rw-r--r--.1rootroot194月2412:10dracut-004-283.el6
drwxr-xr-x.2rootroot40964月2412:10emergency
drwxr-xr-x.7rootroot40964月2412:10etc
-rwxr-xr-x.1rootroot89624月2412:10init
drwxr-xr-x.2rootroot40964月2412:10initqueue
drwxr-xr-x.2rootroot40964月2412:10initqueue-finished
drwxr-xr-x.2rootroot40964月2412:10initqueue-settled
drwxr-xr-x.2rootroot40964月2412:10
initqueue-timeout
-rw-r--r--.1rootroot352353284月2412:09initramfs-2.6.32-279.el6.i686.img
drwxr-xr-x.9rootroot40964月2412:10lib
…省略部分輸出…
#這就是initramfs虛擬文件系統中的內容,和根目錄是不是很像
關機或者某些進程停止,對應的內核模塊就會結束。更多知識請網路《Linux就該這么學》