既然要處理內核模塊,自然就得要了解內核提供的模塊之間的相關性。基本上,內核模塊的放置處是在/lib/modules/$(uname -r)/kernel,裏面主要分成幾個目錄:
arch:與硬件平臺有關的選項,例如CPU的等級等。
crypto:內核所支持的加密技術,例如md5或者是des等。
drivers:一些硬件的驅動程序,例如顯卡、網卡、PCI相關硬件等。
fs:內核所支持的文件系統,例如vfat、reiserfs、nfs等。
lib:一些函數。
net:與網絡有關的各項協議數據,還有防火牆模塊(net/ipv4/netfilter/*)等。
sound:與音效有關的各項模塊。
Linux Kernel2.6.X版本的內核模塊擴展名一定是以“.ko”結尾的。
① depmod
如果要我們一個一個去檢查這些模塊的主要信息,然後去定義出他們的依賴性,這樣肯定不現實。
Liunx提供了一些模塊的依賴性的解決方案,就是檢查/lib/modules/$(uname -r)/modules.dep這個文件,那麼如何創建這個文件?
#depmod [-Ane]
l 參數
不加任何參數,depmod會主動去分析目前內核的模塊,並重新寫入/lib/modules/$(uname -r)/modules.dep當中。
-A:查找比modules.dep文件中新的模塊,如果找到新模塊,纔會更新。
-n:不寫入modules.dep文件中,而是將結果輸出到屏幕上。
-e:顯示目前已加載的不可執行的模塊名稱。
② 查看內核模塊
a. lsmod
#lsmod
Module:模塊名稱;
Size:模塊的大小;
Used by:此模塊是否被其他模塊所使用;
如上圖所示,nf_nat_ipv4會被iptable_nat所使用,簡單說,當你要加載iptable_nat模塊時,需要先加載nf_nat_ipv4模塊纔可以。
b. modinfo
查看模塊信息
#modinfo [-adln] [module_name|filename]
參數:
-a:僅列出作者名稱;
-d:僅列出該module的說明;
-l:僅列出該module的授權;
-n:僅列出該module的詳細路徑;
#modinfo -a e1000e
#modinfo -d e1000e
#modinfo -l e1000e
#modinfo -n e1000e
③ 內核模塊的加載與刪除
如果想自行加載內核模塊,最簡單的方法是使用modprobe命令,因爲modprobe會主動去查找modules.dep的內容,首先會克服模塊的依賴性,才決定需要加載的模塊有哪些。
insmod則完全由用戶自行加載一個完整文件名的模塊,並不會主動分析模塊依賴性。
a. insmod
#insmod [/full/path/module_name] [parameters]
例如:
#insmod /lib/modules/$(uname -r)/kernel/fs/cifs/cifs.ko
#lsmod |grep cifs.ko
b. rmmod
#rmmod [-fw] module_name
參數:
-f:強制將該模塊刪除,不論是否正被使用
-w:若該模塊正被使用,則等待該模塊被使用完畢後刪除它
#rmmod cifs
c. modprobe
#modprobe [-lcfr] module_name
參數:
-c:列出目前系統所有的模塊
-l:列出目前在/lib/modules/$(uname -r)/kernel當中的所有模塊完整文件
-f:強制加載該模塊
-r:類似rmmod,刪除某個模塊
例子:
加載cifs模塊
#modprobe cifs
刪除cifs模塊
#modprobe -r cifs