1,604 瀏覽數

Linux – 模組

有編譯核心的人就知道除了可以將功能編譯進核心外,還可以編譯成模組.等有需要再加入支援,這樣可以減少核心的大小還可以加快系統開機的速度.以及系統的穩定
模組都存放在 /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.其他設定檔

  1. /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 來預先載入所需的模組.

  2. /lib/modules/kernel-version/modules.dep
    記載 modules 之間的相依性

2 個網友的想法 “Linux – 模組

  1. 自動參照通知: 硬體裝置 | Benjr.tw

  2. 用來顯示 X-window 的顯示卡不屬於任何模組或核心,而是屬於 XFree86 套件的一部分.

    如果你要看 Graphic card 的版本.

    [root@benjr ~]# lspci
    00:05.0 VGA compatible controller: ATI Technologies Inc ES1000 (rev 02)
    ….
    

    #先看你的顯示卡是哪一家的,我說的哪一家是指 chipset 是 ATI 或 Nivida 等.

    [root@benjr ~]# cat /var/log/Xorg.0.log | grep –i driver
    ATI: ATI driver (version 6.5.6) for chipsets: ati, ativga
    #再來找是屬於哪一個 driver(module)
    

    看 Video RAM 的大小

    [root@benjr ~]#cat /var/log/Xorg.0.log | grep –i videoram
    

發表迴響