From:https://blog.csdn.net/good5101/article/details/39472291
linux內核模塊相關命令:lsmod,depmod,modprobe,modinfo,insmod,rmmod 使用說明
https://www.cnblogs.com/jacklikedogs/p/4659249.html
Linux下加載.ko驅動模塊的兩種方法:insmod與modprobe:
https://blog.csdn.net/yxfabcdefg/article/details/53376845
來源
初期linux的驅動程序是必須編譯在內核之中的(相應地驅動程序提供的是源程序以符合GNU規則,例如DFE530TX網卡的驅動就是ftp://www.scyld.com/pub/network/via-rhine.c),後來推廣使用以後一則感覺不方便、二則普通用戶也沒有能力自己編譯內核、三則當時內核不能太大,裏面驅動程序太多超過1M的話會癱掉,於是發明了模塊(modules),就是事先將驅動程序編譯成module,使用時再將他們裝載到系統裏以避免重新編譯內核。再經過發展以後,幾乎內核裏的大多數功能都能以模塊形式存在,例如讀寫NTFS、支持PPP協議等等,所以模塊功能已經不侷限於驅動程序了。 modprobe功能就是,對系統裏的模塊進行增、減、安裝、刪除等等操作。
簡介
內容
modprobe [-acdlrtvV][--help][模塊文件][符號名稱 = 符號值]
參數
modprobe 與 insmod 命令的區別:
1、insmod一次只能加載特定的一個設備驅動,且需要驅動的具體地址。寫法爲:
insmod drv.ko
2. modprobe則可以一次將有依賴關係的驅動全部加載到內核。不加驅動的具體地址,但需要在安裝文件系統時是按照make modues_install的方式安裝驅動模塊的。驅動被安裝在/lib/modules/$(uname -r)/...下。寫法爲:
modprob drv
不過modprobe比較智能,它可以根據module的依賴性來自動爲你加載;
而insmod就做不到這點。
---------------------------------分隔線---------------------------------
比如說使用ipmitool這個工具需要在dev/中存在ipmi0的設備,如果沒有的話就需要加載
modprobe ipmi_si
modprobe ipmi_devintf
讀取本地KCS接口的數據使用 -I open 例如
ipmitool -I open sensor
想要卸載module。使用rmmod
用modprobe 加載模塊時,提示模塊找不到的問題
用modprobe 加載模塊時,提示模塊找不到的問題,如在/home目錄下有個編譯好的模塊:helloworld.ko,
當我們運行 sudo modprobe /home/helloworld.ko時,會提示“FATAL: Module helloworld not found.”
modprobe是在/lib/module/`uname -r`下尋找加載的模塊的,並且modprobe需要一個最新的modules.dep文件,
這個modules.dep文件內容是些各個模塊之間的依賴等信息,此文件是由depmod命令來更新的。
man modprobe:
modprobe looks in the module directory /lib/modules/`uname -r` for all the modules and other files, except for the
optional /etc/modprobe.conf configuration file and /etc/modprobe.d
directory (see modprobe.conf(5)).
modprobe expects an up-to-date modules.dep file, as generated by depmod
(see depmod(8)). This file lists what other modules each module needs
(if any), and modprobe uses this to add or remove these dependencies
automatically. See modules.dep(5)).
所以我們需要做的事情:
1.將編譯好的模塊放入/lib/module/`uname -r`下,
2. 用depmod更新modules.dep文件
3. modprobe helloworld.ko
與內核模塊操作相關的命令還有:lsmod modinfo depmod rmmod inmod modprobe
內核模塊的開機自動掛載模塊一般是位於一個配置文件,一般的Linux發行版本都有 /etc/modules.conf 或 /etc/modprobe.conf
移除已經加載的模塊:
#modprobe -r modulename
和rmmod 功能相同。
查看加載包含有usb的模塊
#lsmod | grep usb
加載內核驅動的通常流程:
1.先將.ko文件拷貝到/lib/module/`uname -r`(內核版本號)/kernel/driver/...目錄下,
根據具體用途的區別分爲net、ide、scsi、usb、video、parport、md、block、ata等等。
2.運行depmod -a,更新模塊依賴新,主要是更新modules.dep文件
3.運行modprobe加載內核模塊
lsmod
depmod
modprobe
modinfo
insmod
rmmod
以上內容是參考man翻譯的,若有疑問請用man …查看原始文檔,翻譯可能有誤。
其它:
(1)lsmod 顯示當前加載的所有模塊,相當於cat /proc/modules,
假設你沒有設定開機加載某個模塊,比如ntfs,那麼開機後執行lsmod,列表裏不會有ntfs這個模塊的,
這時你再執行 mount -t ntfs xxx後,執行lsmod後列表裏就會有ntfs這個模塊了。
還要注意的是lsmod顯示的是模塊名,而不是別名(alias)。
(2) modprobe與insmod
modprobe -l #顯示當前可以加載的模塊
modprobe xxx.ko #加載某個模塊
modprobe -r xxx.ko #卸載某個模塊
通過了解modprobe的manpage我們知道,我可以通過modprobe -l來顯示可以當前可以加載的模塊,所謂當前可以加載的模塊,
實際上就是modules.dep文件中包含的那些模塊,而不是manpage裏說的modprobe會加載/lib/modules/`uname -r`下的所有模塊(也許是我理解錯誤),下面我們將會證明這一點.
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 程式所建立。
(3)上面(1)中提到modprobe加載某個模塊是根據/lib/modules/`uname -r`目錄下的modules.dep文件中的模塊列表,這個文件中有的模塊modprobe會正確加載,否則就會出錯。
我們還拿ntfs這個模塊來舉例:
vi /lib/modules/`uname -r`/modules.dep
註釋掉/lib/modules/2.6.18-4-k7/kernel/fs/ntfs/ntfs.ko這一行,就是加個#號.
這個修改是即使生效的。
modinfo ntfs
modinfo: could not find module ntfs
modprobe ntfs
FATAL: Module ntfs not found.
重啓機器,執行同樣的命令會得到同樣的結果,說明開機不會自動執行depmod的,而
locate ntfs.ko
/lib/modules/2.6.18-4-k7/kernel/fs/ntfs/ntfs.ko
證明我們並沒有轉移ntfs模塊。
注意如果重啓機器之前進行mount還是可以的,重啓之後就會報錯了,而上邊的都是即時生效的。
還有如果modules.dep裏註釋掉了ntfs,那麼在/etc/modules裏寫上也是不起作用的,說明這個和mount一樣都是依賴 modprobe來完成加載模塊命令的。而insmod是可以的,因爲insmod後面跟的是絕對路徑,它和modules.dep沒什麼關係。 insmod比較重要的用途是用來測試模塊的正確性,加載一般都是依靠modprobe。(這個可能也不起作用了,都用modprobe吧)
這一切只是因爲我們註釋掉了modules.dep中關於ntfs.ko的那一行,而模塊並沒有刪除或轉移。既然modules.dep文件如此重要,那麼它是怎麼生成的呢?這就和下一個命令有關了,depmod。
(4)depmod
man depmod
depmod -- program to generate modules.dep and map files. Blank lines, and lines starting with a '#' (ignoring spaces) are ignored in modules.dep.
depmod是一個用來產生modules.dep和map文件的程序。在modules.dep文件中空白行和以'#'開頭的行將被忽略.
Linux kernel modules can provide services (called "symbols") for other
modules to use (using EXPORT_SYMBOL in the code).
linux核心模塊可以提供服務給其他模塊,稱之爲"symbols"
depmod creates a list of module dependencies, by reading each module
under /lib/modules/version and determining what symbols it exports, and
what symbols it needs.
depmod通過讀取/lib/modules/version目錄下的每一個模塊來創建一個記錄模塊相依性
的列表。這個列表就是/lib/modules/version目錄下的modules.dep。
If a version is provided, then that kernel version's module directory
is used, rather than the current kernel version (as returned by "uname
-r").
如果給定version的話,那麼depmod會檢查這個version對應的modules目錄而不是
當前運行的kernel對應的modules目錄。
depmod will also generate various map files in this directory, for use
by the hotplug infrastructure.
depmod也會在/lib/modules/version目錄下創建許多map文件,這些文件將會被hotplug用到。
OPTIONS:
-a --all Probe all modules. This option is enabled by default if no
file names are given in the command-line.
檢查所有的模塊,這個命令是默認的如果你沒有指定模塊名字的話。
-A --quick This option scans to see if any modules are newer than the
modules.dep file before any work is done%3
實例
查看modules的配置文件:modprobe -c
這裏,可以查看modules的配置文件,比如模塊的alias別名是什麼等。
會打印許多行信息,例如其中的一行會類似如下:
alias symbol:ip_conntrack_unregister_notifier ip_conntrack
列出內核中所有已經或者未掛載的所有模塊:
modprobe -l
這裏,我們能查看到我們所需要的模塊,然後根據我們的需要來掛載.
其實modprobe -l 讀取的模塊列表就位於/lib/modules/`uname -r`目錄中;
其中uname -r是內核的版本,例如輸出結果的其中一行是:
/lib/modules/2.6.18-348.6.1.el5/kernel/net/netfilter/xt_statistic.ko
掛載vfat模塊:modprobe vfat
用法:modprobe 模塊名
掛載之後,用lsmod可以查看已經掛載的模塊。模塊名是不能帶有後綴的
我們通過modprobe -l所看到的模塊,都是帶有.ko或.o後綴。
移除已經加載的模塊:modprobe -r 模塊名
這裏,移除已加載的模塊,和rmmod功能相同。
安裝軟驅模塊:
[root@root~]# modprobe -v floppy
卸載軟驅模塊:
[root@root~]# modprobe -v -r floppy
1) 加載RAID1陣列級別模塊:
[root@root]# modprobe raid1
2) 顯示已加載的RAID1陣列級別模塊:
[root@root]# lsmod |grep raid1
3) 刪除RAID1陣列級別模塊:
[root@root]# modprobe -r raid1
4) 顯示RAID1陣列級別模塊:
[root@root]# lsmod |grep raid1
insmod 和 modprobe使用方法
From:https://blog.csdn.net/hktkfly6/article/details/53284158/
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 程式所建立。
modinfo ip_nat_ftp
一、什麼是內核;
內核官方:
http://www.kernel.org
內核洋文用 kernel,我剛纔翻了一下詞典,kernel 中文意思是內核、核心、中心、精髓的意思;也是果仁、果核的意思。從字面理解,kernel 是一事物的中心,植物的果實最重要的也是果仁和果核;:) 由此我們能推斷內核是操作系統的中心。
我們知道Linus Torvalds 研發了Linux ,其實他研發的就是內核,按內核官方主頁的理解,這個內核就是Linux ;其他的擴展和應用都是圍繞內核而展開的。所有Linux應用程式都會和內核發生直接或間接的接觸;比如硬件需要內核支持,網絡的通信也需要內核支持;文件系統更需要內核支持... ...
直言我的能力的不行,如果你想了解和學習解操作系統,我寫的教程只是初級應用,理論性的東西不是一言兩語能說的清晰的,更不是應用者能說的清晰的。
二、爲什麼需要編譯內核和管理內核
硬件是需要內核支持才行,有些硬件的支持沒有被編入內核,這也需要我們重編內核;內核的包含的不僅僅是設備的驅動,更有其他的內容,比如網絡協議的支持,防火牆的支持... ... 比如iptables的實現,有些功能是需要內核支持的,如果內核和iptables相關的內容沒有被編入,iptables 相關的功能就無法實現;
三、內核編譯方法
請參考:《編譯內核操作流程 ──爲新手指南》
四、管理內核模塊的相關命令
1、lsmod 列加以掛載的內核模塊;
lsmod 是列出目前系統中已加載的模塊的名稱及大小等;另外我們還能查看 /proc/modules ,我們相同能知道系統已加載的模塊;
[root@localhost beinan]# lsmod
2、modinfo 查看模塊信息;
modinfo 能查看模塊的信息,通過查看模塊信息來判定這個模塊的用途;
[root@localhost beinan]# moinfo 模塊名
舉例:
[root@localhost beinan]# modinfo ne2k-pci
filename: /lib/modules/2.6.11-1.1369_FC4/kernel/drivers/net/ne2k-pci.ko
author: Donald Becker / Paul Gortmaker
description: PCI NE2000 clone driver
license: GPL
parmtype: debug:int
parmtype: options:array of int
parmtype: full_duplex:array of int
parm: debug:debug level (1-2)
parm: options:Bit 5: full duplex
parm: full_duplex:full duplex setting(s) (1)
vermagic: 2.6.11-1.1369_FC4 686 REGPARM 4KSTACKS gcc-4.0
depends: 8390
alias: pci:v000010ECd00008029sv*sd*bc*sc*i*
alias: pci:v00001050d00000940sv*sd*bc*sc*i*
alias: pci:v000011F6d00001401sv*sd*bc*sc*i*
alias: pci:v00008E2Ed00003000sv*sd*bc*sc*i*
alias: pci:v00004A14d00005000sv*sd*bc*sc*i*
alias: pci:v00001106d00000926sv*sd*bc*sc*i*
alias: pci:v000010BDd00000E34sv*sd*bc*sc*i*
alias: pci:v00001050d00005A5Asv*sd*bc*sc*i*
alias: pci:v000012C3d00000058sv*sd*bc*sc*i*
alias: pci:v000012C3d00005598sv*sd*bc*sc*i*
alias: pci:v00008C4Ad00001980sv*sd*bc*sc*i*
srcversion: 6ACE95F441CD26DF9DC31C2
上面的例子是我們查看 ne2k-pci 這個模塊的信息,通過查看,我們知道ne2k-pci 模塊是8029網卡(PCI NE2000 clone driver)的驅動;模塊是位於 /lib/modules/2.6.11-1.1369_FC4/kernel/drivers/net/ 中ne2k-pci.ko
我們目前常用的網卡也有8139的,8139網卡所用的驅動是 8139too ;查查看?
[root@localhost beinan]# modinfo 8139too
我們再查查vfat 和ntfs 的模塊信息;
[root@localhost beinan]# modinfo vfat
[root@localhost beinan]# modinfo ntfs
自己嘗試一下;
注意: 模塊名是不能帶有後綴的,我們通過modprobe -l 所看到的模塊,都是帶有.ko 或.o後綴;
3、modprobe 掛載新模塊及新模塊相依賴的模塊
modprobe 我們常用的功能就是掛載模塊,在掛載某個內核模塊的同時,這個模塊所依賴的模塊也被同時掛載;當然modprobe 也有列出內核所有模塊,更有移除模塊的功能;下在我們舉個例子說一說咱們常用的功能和參數;
modprobe [-v] [-V] [-C config-file] [-n] [-i] [-q] [-o ] [parameters...]
modprobe -r [-n] [-i] [-v] ...
modprobe -l -t [ -a ...]
上面是modprobe 的用法,具體更爲周詳的幫助,我們能查看 man modprobe ;
[root@localhost beinan]# modprobe -c
modprobe -c 能查看modules 的設置文件,比如模塊的別名是什麼等;
[root@localhost beinan]# modprobe -l
modprobe -l 是列出內核中所有的模塊,包括已掛載和未掛載的;通過modprobe -l ,我們能查看到我們所需要的模塊,然後根據我們的需要來掛載;其實modprobe -l 讀取的模塊列表就位於 /lib/modules/’uname -r’ 目錄中;其中uname -r 是內核的版本;
[root@localhost beinan]# uname -r
2.6.11-1.1369_FC4
[root@localhost beinan]# ls /lib/modules/2.6.11-1.1369_FC4/
通過上面的命令,自己試試看?
[root@localhost beinan]# modprobe 模塊名 注:掛載一個模塊;
舉例:
[root@localhost beinan]# modprobe ne2k-pci 注:掛載 ne2k-pci 模塊;
[root@localhost beinan]# modprobe vfat 注:掛載vfat 模塊
[root@localhost beinan]# modprobe ntfs 注:掛載ntfs 模塊
[root@localhost beinan]# lsmod 注:列出已掛載模塊, 我們會看到ne2k-pci ,vfat ,ntfs的模塊 ;
注意: 模塊名是不能帶有後綴的,我們通過modprobe -l 所看到的模塊,都是帶有.ko 或.o後綴;
[root@localhost beinan]# modprobe -r 模塊名 注:移除已加載的模塊,和rmmod 功能相同;
注意: 模塊名是不能帶有後綴的,我們通過modprobe -l 所看到的模塊,都是帶有.ko 或.o後綴;
[root@localhost beinan]# modprobe -r 模塊名
舉例:
[root@localhost beinan]# modprobe -r ne2k-pci
就說這麼多吧,更爲周詳的還是用 man modprobe 來查看和嘗試;
4、rmmod 移除已掛載模塊;
命令格式:
rmmod 模塊名
注意: 模塊名是不能帶有後綴的,我們通過modprobe -l 所看到的模塊,都是帶有.ko 或.o後綴;
舉例:
[root@localhost beinan]# rmmod vfat 注:移除已掛載的模塊vfat
5、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/內核版本 目錄
比如 Fedora Core 4.0 中,系統默認的內核:
[root@localhost beinan]# ls /lib/modules/2.6.11-1.1369_FC4/modules.dep
/lib/modules/2.6.11-1.1369_FC4/modules.dep
6、insmod 掛載模塊;
insmod 這個工具,和modprobe 有點類似,但功能上沒有modprobe 強,modprobe 在掛載模塊是不用指定模塊文件的路徑,也不用帶文件的後綴.o 或.ko ;而insmod 需要的是模塊的所在目錄的絕對路徑,並且一定要帶有模塊文件名後綴的(modulefile.o 或modulesfile.ko );
對於這個工具,我們只是介紹一下, 並不推薦使用。因爲模塊有依賴關係,對於新手來說,可能不知道這個模塊依賴和哪個模塊依賴;
舉例:
[root@localhost beinan]# insmod /lib/modules/2.6.11-1.1369_FC4/kernel/drivers/net/tg3.ko
我們要到 /lib/modules/內核版本 uname -r 的命令輸出/kernel/drivers 中找相對應的模塊才行,要有絕對路徑,而且必須要用到文件名的全稱,不能把文件名的後綴省略;
五、和內核模塊加載相關的設置文件;
1、模塊的設置文件 modules.conf 或 modprobe.conf
內核模塊的開機自動掛載模塊一般是位於一個設置文件,一般的Linux發行版本都有 /etc/modules.conf 或 /etc/modprobe.conf 。比如Fedora Core 4.0 內核模塊開機自動加載文件是 /etc/modprobe.conf ;在這個文件中,一般是寫入模塊的加載命令或模塊的別名的定義等;比如我們在modules.conf 中可能會發行類似的一行 ;
alias eth0 8139too
///-----------------------------------------------------------------------------------------------------------------------
最近用友善之臂的板子,發現內核的名稱是:Linux-2.6.29.4-FriendlyARM.後面那個FriendlyARM死活去不掉。後來只好看代碼。
1、2.6.29.4這個版本號是是uboot在做uimage的時候加上的,看arch/arm/boot/Makefile:
quiet_cmd_uimage = UIMAGE $@
cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A arm -O linux -T kernel /
-C none -a $(LOADADDR) -e $(LOADADDR) /
-n 'Linux-$(KERNELRELEASE)' -d $< $@
2、對比,可見2.6.29.4-FriendlyARM就是 = $(KERNELRELEASE),因此我們需要找到$(KERNELRELEASE)怎麼定義的。
3、搜索可以知道$(KERNELRELEASE)在include/config/kernel.release定義,但是改了以後重新make又還有FriendlyARM。
4、看內核頂層的makefile,約872行有說明:
# Build the kernel release string
。。。
# $(localver-auto) (only if CONFIG_LOCALVERSION_AUTO is set)
# ./scripts/setlocalversion (SCM tag, if one exists)
# $(LOCALVERSION) (from make command line if provided)
仔細對比,原來這個FriendlyARM是$(LOCALVERSION)!,搜索下,發現autoconf.h有,哈哈,這就是內核圖形配置出來的嘛
5、馬上make menuconfig,搜索$(LOCALVERSION),乖乖,原來在Gernel Setup。。。,馬上去掉,重新編譯。這下沒了!