自動處理可載入模塊命令 modprobe insmod 和 modprobe使用方法

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功能就是,對系統裏的模塊進行增、減、安裝、刪除等等操作。


簡介

Linux命令:modprobe 。
功能說明:自動處理可載入模塊。
語  法:modprobe [-acdlrtvV][--help][模塊文件][符號名稱 = 符號值]。
補充說明:modprobe可載入指定的個別模塊,或是載入一組相依的模塊。modprobe會根據depmod所產生的相依關係,決定要載入哪些模塊。若在載入過程中發生錯誤,在modprobe會卸載整組的模塊。


內容

1、modprobe 命令是根據depmod -a的輸出/lib/modules/version/modules.dep來加載全部的所需要模塊。
2、刪除模塊的命令是:modprobe -r filename。
3、系統啓動後,正常工作的模塊都在/proc/modules文件中列出。使用lsmod命令也可顯示相同內容。
4、在內核中有一個“Automatic kernel module loading"功能被編譯到了內核中。當用戶嘗試打開某類型的文件時,內核會根據需要嘗試加載相應的模塊。/etc/modules.conf或 /etc/modprobe.conf文件是一個自動處理內核模塊的控制文件。

modprobe [-acdlrtvV][--help][模塊文件][符號名稱 = 符號值]

參數

-a 或 --all             載入全部的模塊。
-c或--show-conf  顯示所有模塊的設置信息。
-d或--debug        使用排錯模式。
-l或--list               顯示可用的模塊。
-r或--remove       模塊閒置不用時,即自動卸載模塊。
-t或--type             指定模塊類型。
-v或--verbose      執行時顯示詳細的信息。
-V或--version      顯示版本信息。
-help                   顯示幫助。

modprobe 與 insmod 命令的區別:

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 程式所建立。


linux設備驅動有兩種加載方式insmod和modprobe,下面談談它們用法上的區別
1、insmod一次只能加載特定的一個設備驅動,且需要驅動的具體地址。寫法爲:
        insmod drv.ko
2.  modprobe則可以一次將有依賴關係的驅動全部加載到內核。不加驅動的具體地址,但需要在安裝文件系統時是按照make modues_install的方式安裝驅動模塊的。驅動被安裝在/lib/modules/$(uname -r)/...下。寫法爲:
       modprob drv
------------------------------------------------------------------------
modprobe 和insmod一樣都是用來加載內核module的
不過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

功能:列出內核已載入模塊的狀態
用法:lsmod
描述:
lsmod 以美觀的方式列出/proc/modules的內容。
輸出爲:
Module(模塊名)    Size(模塊大小)   Used by(被…使用)
eg. ne2k_pci           8928               0
8390                 9472              1 ne2k_pci
在/proc/modules中相應的是:
(模塊名,模塊大小,被…使用,模塊地址(猜的,以後確認))
ne2k_pci 8928 0 – Live 0×3086400
8390 9472 1 ne2k_pci , Live 0xe086000

depmod

功能:分析可加載模塊的依賴性,生成modules.dep文件和映射文件
用法:depmod [-b basedir] [-e] [-F System.map] [-n] [-v] [version] [-A]
depmod [-e] [-F System.map] [-n] [-v] [version] [filename...]
描述:
Linux內核模塊可以爲其它模塊提供提供服務(在代碼中使用EXPORT_SYMBOL),這種服務被稱作”symbols”。若第二個模塊使用了這個symbol,則該模塊很明顯依賴於第一個模塊。這些依賴關係是非常繁雜的。
depmod讀取在/lib/modules/version 目錄下的所有模塊,並檢查每個模塊導出的symbol和需要的symbol,然後創建一個依賴關係列表。默認地,該列表寫入到/lib/moudules /version目錄下的modules.dep文件中。若命令中的filename有指定的話,則僅檢查這些指定的模塊(不是很有用)。
若命令中提供了version參數,則會使用version所指定的目錄生成依賴,而不是當前內核的版本(uname -r 返回的)。
選項:
-b basedir  –basedir basedir  若你的模塊並沒有正確的在/lib/mdules/version下,可以指定目錄生成依賴。
-e  –errsyms  和-F選項一起使用,當一個模塊需要的symbol在其它模塊裏面沒有提供時,做出報告。正常情況下,模塊沒有提供的symbol都在內核中有提供。
-F  –filesyms System.map 提供一個System.map文件(在內核編譯時生成的)許-e選項報告出unresolved symbol。
-n  –dry_run  將結果modules.dep和各種映射文件輸出到標準輸出(stdout),而不是寫到模塊目錄下。
-A –quick  檢查是否有模塊比modues.dep中的模塊新,若沒有,則退出不重新生成文件。

modprobe

功能:Linux內核添加刪除模塊
用法:
modprobe [ -v ] [ -V ] [-C config-file] [ -n ] [ -i ] [ -q ] [ -o modulename] [ modulename ] [ module parameters ... ]
modprobe [ -r ] [ -v ] [ -n ] [ -i ] [ modulename ... ]
modprobe [ -l ] [ -t dirname ] [ wildcard ]
modprobe [ -c ]
描述:
modprobe可智能地添加和刪除Linux內核模塊(爲簡便起見,模塊名中’_'和’-'是一樣的)。modprobe會查看模塊 目錄/lib/modules/’uname -r’裏面的所有模塊和文件,除了可選的/etc/modprobe.conf配置文件和/etc/modprobe.d目錄外。
modprobe需要一個最新的modules.dep文件,可以用depmod來生成。該文件列出了每一個模塊需要的其他模塊,modprobe使用這個去自動添加或刪除模塊的依賴。
選項:
-v –verbose  顯示程序在幹什麼,通常在出問題的情況下,modprobe才顯示信息。
-C –config  重載(^_^,意思取C++的重載)默認配置文件(/etc/modprobe.conf或/etc/modprobe.d)。
-c –showconfig  輸出配置文件並退出
-n –dry-run  可以和-v選項一起使用,調試非常有用
-i –ignore-install –ignore-remove 該選項會使得modprobe忽略配置文件中的,在命令行上輸入的install和remove命令。
-q –quiet 一般modprobe刪除或插入一個模塊時,若沒有找到會提示錯誤。使用該選項,會忽略指定的模塊,並不提示任何錯誤信息。
-r –remove  該選項會導致modprobe去刪除,而不是插入一個模塊。通常沒有沒有理由去刪除內核模塊,除非是一些有bug的模塊。你的內核也不一定支持模塊的卸載。
-V –verssion 版本信息
-f –force  和同時使用–force-vermagic ,–force-modversion一樣。使用該選項是比較危險的。
-l –list 列出所有模塊
-a –all 插入所有命令行中的模塊
-t –type 強制 -l 顯示dirname中的模塊
-s –syslog 錯誤信息寫入syslog

modinfo

功能:顯示內核模塊的信息
用法:
modinfo [ -0 ] [ -F field] [modulename | filename ... ]
modinfo -V
modinfo -h
描述:
modinfo列出Linux內核中命令行指定的模塊的信息。若模塊名不是一個文件名,則會在/lib/modules/version 目錄中搜索,就像modprobe一樣。
modinfo默認情況下,爲了便於閱讀,以下面的格式列出模塊的每個屬性:fieldname : value。
選項:
-V –version 版本
-F –field 僅在一行上顯示field值,這對於腳本較爲有用。常用的field有:author, description, licence, param, depends, alias, filename。
-0 –NULL 使用’/0′字符分隔field值,而不是一個新行。對腳本比較有用。
-a -d -l -p -n 這些分別是author, description, license, param ,filename的簡短形式。

insmod

功能:向Linux內核中插入一個模塊
用法:insmod [filename] [modue options ...]
描述:
insmod是一個向內核插入模塊的小程序:若文件名是一個連字符’-',模塊從標準輸入輸入。大多數用戶使用modprobe,因爲它比較智能化。

rmmod

功能:刪除內核中的一模塊
用法:rmmod [ -f ] [ -w ] [ -s ] [ -v ] [ modulename ]
描述:
rmmod是一個可以從內核中刪除模塊的小程序,大多數用戶使用modprobe -r去刪除模塊。
選項:
-v –verbose  顯示程序正在做些什麼,一般只顯示執行時的錯誤信息。
-f –force  該選項是非常危險:除非編譯內核時,CONFIG_MODULE_FORCE_UNLOAD被設置該命令纔有效果,否則沒效果。用該選項可以刪除正在被使用的模塊,設計爲不能刪除的模塊,或者標記爲unsafe的模塊。
-w –wait 通常,rmmod拒絕刪除正在被使用的模塊。使用該選項後,指定的模塊會被孤立起來,直到不被使用。
-s  –syslog  將錯誤信息寫入syslog,而不是標準錯誤(stderr)。
-V  –version 版本信息

以上內容是參考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。。。,馬上去掉,重新編譯。這下沒了!




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章