有編譯核心的人就知道除了可以將功能編譯進核心外,還可以編譯成模組.等有需要再加入支援,這樣可以減少核心的大小還可以加快系統開機的速度.以及系統的穩定
模組都存放在 /lib/modules/kernel-version/kernel 目錄下的個別子目錄.其存放的內容如下:
- arch:特定平台的模組(INTEL:microcode…)
- crypto:一些與加解密相關的模組
- driver:其他硬體的模組
- fs:對於檔案系統的支援(FAT,ext3,NTFS…)
- lib:核心空間運作的函數庫
- net:支援網路協定模組(IPV4,IPV6,appletalk…)
kernel 2.6 以上的模組副檔名為 ko, kernel 2.4 模組副檔名則為 o .
下面就是如何操作模組的常用指令
I.#lsmod 顯示目前已載入的模組
[root@benjr ~]# lsmod Module Size Used by Not tainted parport_pc 19204 1 (autoclean) lp 9188 0 (autoclean) parport 39072 1 (autoclean) [parport_pc lp] autofs 13684 0 (autoclean) (unused) e1000 50924 1 e100 62340 0 (unused) microcode 5184 0 (autoclean) keybdev 2976 0 (unused) mousedev 5656 0 hid 22308 0 (unused) input 6208 0 [keybdev mousedev hid] usb-uhci 27404 0 (unused) usbcore 82592 1 [hid usb-uhci] ext3 73376 2 jbd 56336 2 [ext3]
每一行的第一欄是模組名稱,第二欄位是模組大小,欄位三則是用量的記數(有哪些模組用到它).
最後一欄的資訊是敘述模組的狀態.常見的模組狀態如下.
(unused):表示該模組目前未使用
(autoclean):表示該模組可由 rmmid -a 來自動移除模組.
usbcore [hid usb-uhci]:表示 hid 與 usb-uhci是依附在 usbcore 模組下.
可以看到我的系統已經安裝了這些模組,其中幾個模組所支援的裝置如下
usbcore.o USB 的核心模組
usb-uhci.o 支援 USB 1.1 uhci controller 的模組
e100.o 支援 INTEL 的網路卡晶片模組為(10/100 NIC)
e1000.o 支援 INTEL 的網路卡晶片模組為(G NIC)
note:#lsmod 其實是參考到 /proc/modules 檔
II.#insmod modulename 載入 module
模組是有其相依性的如上一張 SCSI card (LSI 22320-R 模組為 mptscsih.o 與 mptscsibase.o ) 就與 scsi_mod.o 是有相依性,其實所有的 SCSI 卡都需要先上 scsi_mod.o 模組的.
[root@benjr ~]# insmod mptscsih Using /lib/modules/2.4.21-4.ELsmp/kernel/drivers/message/fusion/mptscsih.o /lib/modules/2.4.21-4.ELsmp/kernel/drivers/message/fusion/mptscsih.o: unresolved symbol mpt_adapter_find_first_Rsmp_5d6b7d43 …………………略……………………… /lib/modules/2.4.21-4.ELsmp/kernel/drivers/message/fusion/mptscsih.o: unresolved symbol scsi_register_module_Rsmp_fa20b7b0
#安裝模組失敗了,因為 mptscsih.o 是和其他模組有其相依性的關係.所以要先上 scsi_mod.o 這個模組才能上 mptscsi.h 模組
[root@benjr ~]# insmod scsi_mod Using /lib/modules/2.4.21-4.ELsmp/kernel/drivers/scsi/scsi_mod.o [root@benjr ~]# insmod mptbase Using /lib/modules/2.4.21-4.ELsmp/kernel/drivers/message/fusion/mptbase.o [root@benjr ~]# insmod mptscsih Using /lib/modules/2.4.21-4.ELsmp/kernel/drivers/message/fusion/mptscsih.o
這樣就可以使用 SCSI 了,但是我們怎麼知道哪些模組之間有哪些相依性,所以所們可以用 #modprobe 這個指令來取代 #insmod
III. #rmmod modulename 移除 module
移除模組和載入模組一樣有其相依性
剛才我們載入 LSI 22320-R 的模組,所以現在是無法移除 scsi_mod.o 模組的
[root@benjr ~]# rmmod scsi_mod scsi_mod: Device or resource busy
#必須先移除 mptscsih.o , mptbase.o 之後才能移除 scsi_mod.o
[root@benjr ~]# rmmod mptscsih [root@benjr ~]# rmmod mptbase [root@benjr ~]# rmmod scsi_mod
#同樣的我們怎麼知道哪些模組之間有哪些相依性,所以所們可以用 #modprobe -r 這個指令來取代 #rmmod
IV.#modprobe [options] module 載入/移除 module 但會自動滿足 modules 的相依性
剛剛的載入/移除 module 工作用 #modprobe 就可以輕鬆解決.
[root@benjr ~]# modprobe mptscsih
#modprobe 是依據 /lib/modules/kernel-version/modules.dep 中記載 modules 之間的相依性來載入.
#modprobe 也可以用於移除模組,只要用參數 -r 即可,他也會針對 modules 之間的相依性來移除
#如要移除 mptscsih 也可以用下面的指令
[root@benjr ~]# modprobe -r mptscsih
note:如果沒有 SCSI card 來實驗,你也可以用 fat.o , msdos.o 這兩個模組來做(Hit:msdos 需要 fat 的模組才能使用).
V.#depmod [options] module 顯示 modules 的相依性
ex: 顯示 aic79xx modules 的相依性
[root@benjr ~]# depmod -e /lib/modules/2.4.20-8smp/kernel/drivers/scsi/aic7xxx/aic79xx.o depmod: *** Unresolved symbols in /lib/modules/2.4.20-8smp/kernel/drivers/scsi/a ic7xxx/aic79xx.o depmod: scsi_partsize_Rsmp_f4a35f30 depmod: scsi_unregister_Rsmp_01c36634 depmod: scsi_report_bus_reset_Rsmp_7353fca9 depmod: scsi_unregister_module_Rsmp_81d85a75 depmod: scsi_register_Rsmp_28a0846d depmod: scsi_block_requests_Rsmp_5b523dcb depmod: scsi_register_module_Rsmp_fa20b7b0 depmod: scsi_unblock_requests_Rsmp_ab15ba4c /lib/modules/2.4.20-8smp/kernel/drivers/scsi/aic7xxx/aic79xx.o: …………………略…………………..
#可以看到 aic79xx 和 scsi_xxx 相關 , 而 depmod 是依據 /lib/modules/kernel-version/modules.dep 中記載 modules 之間的相依性所查詢得到.
note: depmod -a 可以重建 /lib/modules/kernel-version/modules.dep ,這個工作通常在我們 make 一個新的模組時才需要做的.
ex:.我們從網路下載一個 Emulex LP9802DC 的模組(lpfcdd.o)來編譯
[root@benjr ~]# make [root@benjr ~]# make install [root@benjr ~]# modprobe lpfcdd
#此時系統會告訴你 lpfcdd.o 模組不存在,這時就需要來重建 /lib/modules/kernel-version/modules.dep
[root@benjr ~]# depmod -a [root@benjr ~]# modprobe lpfcdd
VI.#modinfo [options] module_object_file 顯示與模組相關的訊息
-a, –author 顯示模組作者
[root@benjr ~]# modinfo -a aic7xxx “Maintainer: Justin T. Gibbs <gibbs@scsiguy.com>"
-d, –description 顯示模組本身的敘述
[root@benjr ~]# modinfo -d aic7xxx “Adaptec Aic77XX/78XX SCSI Host Bus Adapter driver"
-l, –license 顯示模組本身的 License
[root@benjr ~]# modinfo -l scsi_mod “GPL"
-p, –parameters 顯示模組可用參數
[root@benjr ~]# modinfo -p scsi_mod scsihosts string scsi_logging_level int, description “SCSI logging level; should be zero or nonze ro" max_scsi_luns int, description “last scsi LUN (should be between 1 and 2^32-1)" scsi_allow_ghost_devices int, description “allow devices marked as being offline to be accessed anyway (0 = off, else allow ghosts on lun 0 through scsi_allow_g host_devices – 1″
雖然是相同的模組名稱卻會因為不同版本或是不同的系統,而造成使用不同的參數,所以在加入參數前使用這個指令來查詢一下是不錯的方式.
VII.其他設定檔
- /etc/modules.conf (kernel 2.4) or /etc/modprobe.conf (kerneel2.6)
記載開機時需要上哪一些模組[root@benjr ~]# cat /etc/modules.conf alias eth0 e100 alias scsi_hostadapter mptbase alias scsi_hostadapter1 mptscsih alias usb-controller usb-uhci alias usb-controller1 ehci-hcd #可以看到網路卡(e100), SCSI 卡(mptscsih),以及 USB(usb 1.1 : usb-uhci ,USB 2.0 : ehci-hcd) 等裝置在開機後就啟動.
如果要在開機載入核心前就預先載入所需的模組.則需要重新建立 initrd 檔
在重建 initrd 時系統會依據 /etc/modules.conf 檔來決定要上哪一些 modules.
假如我們要系統載入時就載入 SATA H.D 的 module,我們就要在 /etc/modules.conf 加入這行
alias scsi_hostadapter2 ata_piix
使用指令 mkinitrd 就可以重建
mkinitrd initrd-2.4.21-4.ELsmp.img 2.4.21-4.ELsmp
其中的參數
initrd-2.4.21-4.ELsmp.img 這就是建立後的 initrd image 檔
2.4.21-4.ELsmp 這要依據 /lib/modules/ 中 kernel-version
再來複製到 /boot 目錄下,開機時就會用這個 initrd 來預先載入所需的模組. - /lib/modules/kernel-version/modules.dep
記載 modules 之間的相依性
用來顯示 X-window 的顯示卡不屬於任何模組或核心,而是屬於 XFree86 套件的一部分.
如果你要看 Graphic card 的版本.
#先看你的顯示卡是哪一家的,我說的哪一家是指 chipset 是 ATI 或 Nivida 等.
看 Video RAM 的大小