linux內核模塊基礎
1 什麼是內核模塊
內核模塊是Linux內核向外部提供的一個插口,其全稱爲動態可加載內核模塊(Loadable Kernel Module,LKM),我們簡稱爲模塊。Linux內核之所以提供模塊機制,是因爲它本身是一個單內核(monolithic kernel)。單內核的最大優點是效率高,因爲所有的內容都集成在一起,但其缺點是可擴展性和可維護性相對較差,模塊機制就是爲了彌補這一缺陷。
模塊是具有獨立功能的程序,它可以被單獨編譯,但不能獨立運行。它在運行時被鏈接到內核作爲內核的一部分在內核空間運行,這與運行在用戶空間的進程是不同的。模塊通常由一組函數和數據結構組成,用來實現一種文件系統、一個驅動程序或其他內核上層的功能。
2 linux模塊命令
核心的功能就是用來控制系統硬件與相關程序的東西!核心可以使用"模塊"的方式來動態的加載與移除所需要的模塊!那麼該如何加載與卸載這些模塊呢?
開機時即加載模塊的檔案在於:/etc/modprobe.conf,如果你有任何的新的驅動程序需要在開機的時候加載,寫入這個檔案就對了!核心的驅動程序寫在:/lib/modules/`uname–r`/kernel/drivers。
手動編譯一些驅動程序或者是 tarball 的套件時,得到了 *.ko 這個編譯成功的目標檔案。這樣就編譯完成了,接着下來就是將編譯好的模塊放置在覈心應該要放置的地方,
核心的模塊放置目錄: /lib/modules/`uname –r`/kernel/
核心的檔案格式模塊: /lib/modules/`uname –r`/kernel/fs
核心的網絡卡驅動程序模塊: /lib/modules/`uname –r`/kernel/drivers/net
因此,我們要把模塊給他直接 copy 到該目錄. 完成編譯之後,想要在開機的時候立即啓動這個模塊的對應,那麼就寫入/etc/modprobe.conf 當中.
modprobe
[root @test /root]# modprobe [-l |-c]
[root @test /root]# modprobe modules_name<==直接加載該模塊與其相依屬性的模塊
參數說明:
-l :列出目前系統所有的模塊 ( 在 /lib/modules/`uname -r`/kernel 底下 )
-c :列出目前系統所有的模塊!(更詳細的代號對應表)
範例:
[root @test /root]# modprobe ip_tables <==直接加載 ip_tables.ko 這個模塊
需要特別留意的是,模塊全部都擺在『 /lib/modules/`uname -r`/kernel 』這個目錄下,而且模塊的名稱都是以 *.ko 這個附檔名存在,但是在實際加載模塊的時候,只要寫入名稱.
insmod *.ko 安裝模塊
**************************************
insmod(install module):載入模塊 install loadable kernel module
語法:insmod [-fkmpsvxX][-o <模塊名稱>][模塊文件][符號名稱 = 符號值]
參數:
-f 不檢查目前kernel版本與模塊編譯時的kernel版本是否一致,強制將模塊載入。
-k 將模塊設置爲自動卸除。
-m 輸出模塊的載入信息。
-o <模塊名稱> 指定模塊的名稱,可使用模塊文件的文件名。
-p 測試模塊是否能正確地載入kernel。
-s 將所有信息記錄在系統記錄文件中。
-v 執行時顯示詳細的信息。
使用說明:Linux有許多功能是通過模塊的方式,在需要時才載入kernel。如此可使kernel較爲精簡,進而提高效率,以及保有較大的彈性。這類可載入的模塊,通常是設備驅動程序。
insmod命令主要用於在Linux 2.4內核之前加載Linux內核模塊命令。對於通過此命令加載的Linux內核模塊,系統不僅不會自動解決內核模塊之間的依賴關係,而且還要求將模塊路徑寫詳細。所以在Linux 2.6內核出現時,此命令已漸漸被遺忘。
加載RAID1陣列級別模塊,如下所示:
[root@rhel5 boot]# insmod /lib/modules/2.6.18-8.el5/kernel/drivers/md/raid1.ko
[root@rhel5 boot]# lsmod | grep raid1
raid1 25153 0
從以上顯示結果可知,RAID1模塊已加載成功。只是在使用insmod命令加載模塊時,需要使用絕對路徑方能加載,且加載時無法自動解決依賴關係。
擴展閱讀:insmod 和modprobe的區別
insmod 這個工具,和modprobe 有點類似,但功能上沒有modprobe 強,modprobe 在掛載模塊是不用指定模塊文件的路徑,也不用帶文件的後綴.o 或.ko ;而insmod 需要的是模塊的所在目錄的絕對路徑,並且一定要帶有模塊文件名後綴的(modulefile.o 或modulesfile.ko )
insmod 與 modprobe 都是載入 kernel module,不過一般差別於 modprobe 能夠處理 module 載入的相依賴問題。比方要載入 a module,但是 a module 要求系統先載入 b module 時,直接用 insmod 掛入通常都會出現錯誤訊息,不過 modprobe 倒是能夠知道先載入 b module 後才載入 a module,如此相依性就會滿足。不過 modprobe 並不是大神,不會厲害到知道 module 之間的相依性爲何,該程式是讀取 /lib/modules/2.6.xx/modules.dep 檔案得知相依性的。而該檔案是透過 depmod 程式所建立。
**************************************
rmmod *.ko 卸載模塊
lsmod :列出目前系統中已加載的模塊的名稱及大小等;另外我們還可以查看 /proc/modules ,一樣可以知道系統已經加載的模塊。
modinfo 可以查看模塊的信息,通過查看模塊信息來判定這個模塊的用途。
modprobe 掛載新模塊以及新模塊相依賴的模塊
modprobe 我們常用的功能就是掛載模塊,在掛載某個內核模塊的同時,這個模塊所依賴的模塊也被同時掛載;當然modprobe 也有列出內核所有模塊,還有移除模塊的功能;
modprobe -l 是列出內核中所有的模塊,包括已掛載和未掛載的;通過modprobe -l ,我們能查看到我們所需要的模塊,然後根據我們的需要來掛載;其實modprobe -l 讀取的模塊列表就位於 /lib/modules/'uname -r' 目錄中;其中uname -r 是內核的版本;
注意: 模塊名是不能帶有後綴的,我們通過modprobe -l 所看到的模塊,都是帶有.ko 或.o後綴;
depmod 創建模塊依賴關係的列表
這個模塊管理工具是創建模塊依賴關係的列表,有幾個參數我們注意一下就行了,目前的的Linux 發行版所用的內核是2.6x版本,是自動解決依賴關係,所以這個命令知道就行了;模塊之前也有依賴關係,比如我們想驅動USB 移動硬盤,目前有兩種驅動,一種是udev ,在內核中有,但目前不太穩定;另一種辦法是用usb-storage驅動,而usb-storage 依賴的模塊是scsi 模塊,所以我們要用usb-storage 的模塊,也得把scsi 編譯安裝;
再舉個例子:sata的硬盤,在Linux中的設備表示的是/dev/sd* ,比如 /dev/sda,/dev/sdb 等... 系統要驅動 sata硬盤,則需要把sata在內核中選中,或編譯成模塊,或內置於內核之中,在此同時,還需要在內核中選中ide ,scsi 的支持等;
depmod 工具的洋文原意:depmod — program to generate modules.dep and map files.(我譯的:爲modules.dep 文件或映射文件創建依賴關係)
[root@localhost beinan]# depmod -a 注:爲所有列在/etc/modprobe.conf 或/etc/modules.conf 中的所有模塊創建依賴關係,並且寫入到modules.dep文件;
[root@localhost beinan]# depmod -e 注:列出已掛載但不可用的模塊;
[root@localhost beinan]# depmod -n 注:列出所有模塊的依賴關係,但僅僅是輸出出來 (Write the dependency file on stdout only)
注:modules.dep 位於 /lib/modules/內核版本 目錄