自动处理可载入模块命令 modprobe
From:https://blog.csdn.net/good5101/article/details/39472291
linux內(nèi)核模塊相關(guān)命令:lsmod,depmod,modprobe,modinfo,insmod,rmmod 使用說(shuō)明
https://www.cnblogs.com/jacklikedogs/p/4659249.html
Linux下加載.ko驅(qū)動(dòng)模塊的兩種方法:insmod與modprobe:
https://blog.csdn.net/yxfabcdefg/article/details/53376845
來(lái)源
初期linux的驅(qū)動(dòng)程序是必須編譯在內(nèi)核之中的(相應(yīng)地驅(qū)動(dòng)程序提供的是源程序以符合GNU規(guī)則,例如DFE530TX網(wǎng)卡的驅(qū)動(dòng)就是ftp://www.scyld.com/pub/network/via-rhine.c),后來(lái)推廣使用以后一則感覺(jué)不方便、二則普通用戶也沒(méi)有能力自己編譯內(nèi)核、三則當(dāng)時(shí)內(nèi)核不能太大,里面驅(qū)動(dòng)程序太多超過(guò)1M的話會(huì)癱掉,于是發(fā)明了模塊(modules),就是事先將驅(qū)動(dòng)程序編譯成module,使用時(shí)再將他們裝載到系統(tǒng)里以避免重新編譯內(nèi)核。再經(jīng)過(guò)發(fā)展以后,幾乎內(nèi)核里的大多數(shù)功能都能以模塊形式存在,例如讀寫NTFS、支持PPP協(xié)議等等,所以模塊功能已經(jīng)不局限于驅(qū)動(dòng)程序了。modprobe功能就是,對(duì)系統(tǒng)里的模塊進(jìn)行增、減、安裝、刪除等等操作。簡(jiǎn)介
Linux命令:modprobe 。 功能說(shuō)明:自動(dòng)處理可載入模塊。 語(yǔ) 法:modprobe [-acdlrtvV][--help][模塊文件][符號(hào)名稱 = 符號(hào)值]。 補(bǔ)充說(shuō)明:modprobe可載入指定的個(gè)別模塊,或是載入一組相依的模塊。modprobe會(huì)根據(jù)depmod所產(chǎn)生的相依關(guān)系,決定要載入哪些模塊。若在載入過(guò)程中發(fā)生錯(cuò)誤,在modprobe會(huì)卸載整組的模塊。內(nèi)容
1、modprobe 命令是根據(jù)depmod?-a的輸出/lib/modules/version/modules.dep來(lái)加載全部的所需要模塊。 2、刪除模塊的命令是:modprobe -r filename。 3、系統(tǒng)啟動(dòng)后,正常工作的模塊都在/proc/modules文件中列出。使用lsmod命令也可顯示相同內(nèi)容。 4、在內(nèi)核中有一個(gè)“Automatic kernel module loading"功能被編譯到了內(nèi)核中。當(dāng)用戶嘗試打開某類型的文件時(shí),內(nèi)核會(huì)根據(jù)需要嘗試加載相應(yīng)的模塊。/etc/modules.conf或 /etc/modprobe.conf文件是一個(gè)自動(dòng)處理內(nèi)核模塊的控制文件。 modprobe [-acdlrtvV][--help][模塊文件][符號(hào)名稱 = 符號(hào)值]參數(shù)
-a 或 --all ? ? ? ? ? ?載入全部的模塊。-c或--show-conf 顯示所有模塊的設(shè)置信息。-d或--debug ? ? ? 使用排錯(cuò)模式。-l或--list ? ? ? ? ? ? ?顯示可用的模塊。-r或--remove ? ? ?模塊閑置不用時(shí),即自動(dòng)卸載模塊。-t或--type ? ? ? ? ? ?指定模塊類型。-v或--verbose ? ? 執(zhí)行時(shí)顯示詳細(xì)的信息。-V或--version ? ? 顯示版本信息。-help ? ? ? ? ? ? ? ? ?顯示幫助。modprobe?與 insmod 命令的區(qū)別:
insmod 與 modprobe 都是載入 kernel module,不過(guò)一般差別于 modprobe 能夠處理 module 載入的相依問(wèn)題。比方你要載入 a module,但是 a module 要求系統(tǒng)先載入 b module 時(shí),直接用 insmod 掛入通常都會(huì)出現(xiàn)錯(cuò)誤訊息,不過(guò) modprobe 倒是能夠知道先載入 b module 后才載入 a module,如此相依性就會(huì)滿足。不過(guò) modprobe 并不是大神,不會(huì)厲害到知道 module 之間的相依性為何,該程式是讀取 /lib/modules/2.6.xx/modules.dep 檔案得知相依性的。而該檔案是透過(guò)?depmod?程式所建立。1、insmod一次只能加載特定的一個(gè)設(shè)備驅(qū)動(dòng),且需要驅(qū)動(dòng)的具體地址。寫法為:
??????? insmod drv.ko
2.? modprobe則可以一次將有依賴關(guān)系的驅(qū)動(dòng)全部加載到內(nèi)核。不加驅(qū)動(dòng)的具體地址,但需要在安裝文件系統(tǒng)時(shí)是按照make modues_install的方式安裝驅(qū)動(dòng)模塊的。驅(qū)動(dòng)被安裝在/lib/modules/$(uname -r)/...下。寫法為:
?????? modprob drv ------------------------------------------------------------------------ modprobe 和insmod一樣都是用來(lái)加載內(nèi)核module的
不過(guò)modprobe比較智能,它可以根據(jù)module的依賴性來(lái)自動(dòng)為你加載;
而insmod就做不到這點(diǎn)。
---------------------------------分隔線---------------------------------
比如說(shuō)使用ipmitool這個(gè)工具需要在dev/中存在ipmi0的設(shè)備,如果沒(méi)有的話就需要加載
modprobe ipmi_si
modprobe ipmi_devintf
讀取本地KCS接口的數(shù)據(jù)使用 -I open 例如
ipmitool -I open sensor
想要卸載module。使用rmmod
用modprobe 加載模塊時(shí),提示模塊找不到的問(wèn)題
用modprobe 加載模塊時(shí),提示模塊找不到的問(wèn)題,如在/home目錄下有個(gè)編譯好的模塊:helloworld.ko,
當(dāng)我們運(yùn)行 sudo modprobe /home/helloworld.ko時(shí),會(huì)提示“FATAL: Module helloworld not found.”
modprobe是在/lib/module/`uname -r`下尋找加載的模塊的,并且modprobe需要一個(gè)最新的modules.dep文件,
這個(gè)modules.dep文件內(nèi)容是些各個(gè)模塊之間的依賴等信息,此文件是由depmod命令來(lái)更新的。
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
與內(nèi)核模塊操作相關(guān)的命令還有:lsmod? ? ?modinfo? ?depmod? ? rmmod? ? inmod? ? modprobe? ?
內(nèi)核模塊的開機(jī)自動(dòng)掛載模塊一般是位于一個(gè)配置文件,一般的Linux發(fā)行版本都有 /etc/modules.conf 或 /etc/modprobe.conf?
移除已經(jīng)加載的模塊:
#modprobe -r? modulename
和rmmod 功能相同。?
查看加載包含有usb的模塊
#lsmod | grep usb
加載內(nèi)核驅(qū)動(dòng)的通常流程:
1.先將.ko文件拷貝到/lib/module/`uname -r`(內(nèi)核版本號(hào))/kernel/driver/...目錄下,
??? 根據(jù)具體用途的區(qū)別分為net、ide、scsi、usb、video、parport、md、block、ata等等。
2.運(yùn)行depmod -a,更新模塊依賴新,主要是更新modules.dep文件
3.運(yùn)行modprobe加載內(nèi)核模塊
lsmod
功能:列出內(nèi)核已載入模塊的狀態(tài) 用法:lsmod 描述: lsmod 以美觀的方式列出/proc/modules的內(nèi)容。 輸出為: Module(模塊名)????Size(模塊大小)? ?Used by(被…使用) eg.?ne2k_pci?????????? 8928?????????????? 0 8390???????????????? 9472????????????? 1 ne2k_pci 在/proc/modules中相應(yīng)的是: (模塊名,模塊大小,被…使用,模塊地址(猜的,以后確認(rèn))) ne2k_pci 8928 0 – Live 0×3086400 8390 9472?1 ne2k_pci , Live 0xe086000depmod
功能:分析可加載模塊的依賴性,生成modules.dep文件和映射文件。 用法:depmod [-b basedir] [-e] [-F System.map] [-n] [-v] [version] [-A] depmod [-e] [-F System.map] [-n] [-v] [version] [filename...] 描述: Linux內(nèi)核模塊可以為其它模塊提供提供服務(wù)(在代碼中使用EXPORT_SYMBOL),這種服務(wù)被稱作”symbols”。若第二個(gè)模塊使用了這個(gè)symbol,則該模塊很明顯依賴于第一個(gè)模塊。這些依賴關(guān)系是非常繁雜的。 depmod讀取在/lib/modules/version 目錄下的所有模塊,并檢查每個(gè)模塊導(dǎo)出的symbol和需要的symbol,然后創(chuàng)建一個(gè)依賴關(guān)系列表。默認(rèn)地,該列表寫入到/lib/moudules /version目錄下的modules.dep文件中。若命令中的filename有指定的話,則僅檢查這些指定的模塊(不是很有用)。 若命令中提供了version參數(shù),則會(huì)使用version所指定的目錄生成依賴,而不是當(dāng)前內(nèi)核的版本(uname -r 返回的)。 選項(xiàng): -b basedir? –basedir basedir? 若你的模塊并沒(méi)有正確的在/lib/mdules/version下,可以指定目錄生成依賴。 -e? –errsyms? 和-F選項(xiàng)一起使用,當(dāng)一個(gè)模塊需要的symbol在其它模塊里面沒(méi)有提供時(shí),做出報(bào)告。正常情況下,模塊沒(méi)有提供的symbol都在內(nèi)核中有提供。 -F? –filesyms System.map 提供一個(gè)System.map文件(在內(nèi)核編譯時(shí)生成的)許-e選項(xiàng)報(bào)告出unresolved symbol。 -n? –dry_run? 將結(jié)果modules.dep和各種映射文件輸出到標(biāo)準(zhǔn)輸出(stdout),而不是寫到模塊目錄下。 -A –quick? 檢查是否有模塊比modues.dep中的模塊新,若沒(méi)有,則退出不重新生成文件。modprobe
功能:Linux內(nèi)核添加刪除模塊 用法: 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內(nèi)核模塊(為簡(jiǎn)便起見,模塊名中’_'和’-'是一樣的)。modprobe會(huì)查看模塊 目錄/lib/modules/’uname -r’里面的所有模塊和文件,除了可選的/etc/modprobe.conf配置文件和/etc/modprobe.d目錄外。 modprobe需要一個(gè)最新的modules.dep文件,可以用depmod來(lái)生成。該文件列出了每一個(gè)模塊需要的其他模塊,modprobe使用這個(gè)去自動(dòng)添加或刪除模塊的依賴。 選項(xiàng): -v –verbose? 顯示程序在干什么,通常在出問(wèn)題的情況下,modprobe才顯示信息。 -C?–config??重載(^_^,意思取C++的重載)默認(rèn)配置文件(/etc/modprobe.conf或/etc/modprobe.d)。 -c?–showconfig? 輸出配置文件并退出 -n –dry-run? 可以和-v選項(xiàng)一起使用,調(diào)試非常有用 -i –ignore-install –ignore-remove 該選項(xiàng)會(huì)使得modprobe忽略配置文件中的,在命令行上輸入的install和remove命令。 -q –quiet 一般modprobe刪除或插入一個(gè)模塊時(shí),若沒(méi)有找到會(huì)提示錯(cuò)誤。使用該選項(xiàng),會(huì)忽略指定的模塊,并不提示任何錯(cuò)誤信息。 -r –remove??該選項(xiàng)會(huì)導(dǎo)致modprobe去刪除,而不是插入一個(gè)模塊。通常沒(méi)有沒(méi)有理由去刪除內(nèi)核模塊,除非是一些有bug的模塊。你的內(nèi)核也不一定支持模塊的卸載。 -V –verssion 版本信息 -f –force? 和同時(shí)使用–force-vermagic ,–force-modversion一樣。使用該選項(xiàng)是比較危險(xiǎn)的。 -l –list?列出所有模塊 -a –all 插入所有命令行中的模塊 -t –type 強(qiáng)制 -l 顯示dirname中的模塊 -s –syslog 錯(cuò)誤信息寫入syslogmodinfo
功能:顯示內(nèi)核模塊的信息 用法: modinfo [ -0 ] [ -F field] [modulename | filename ... ] modinfo -V modinfo -h 描述: modinfo列出Linux內(nèi)核中命令行指定的模塊的信息。若模塊名不是一個(gè)文件名,則會(huì)在/lib/modules/version 目錄中搜索,就像modprobe一樣。 modinfo默認(rèn)情況下,為了便于閱讀,以下面的格式列出模塊的每個(gè)屬性:fieldname : value。 選項(xiàng): -V –version 版本 -F –field 僅在一行上顯示field值,這對(duì)于腳本較為有用。常用的field有:author, description, licence, param, depends, alias, filename。 -0 –NULL 使用’/0′字符分隔field值,而不是一個(gè)新行。對(duì)腳本比較有用。 -a -d -l -p -n 這些分別是author, description, license, param ,filename的簡(jiǎn)短形式。insmod
功能:向Linux內(nèi)核中插入一個(gè)模塊 用法:insmod [filename] [modue options ...] 描述: insmod是一個(gè)向內(nèi)核插入模塊的小程序:若文件名是一個(gè)連字符’-',模塊從標(biāo)準(zhǔn)輸入輸入。大多數(shù)用戶使用modprobe,因?yàn)樗容^智能化。rmmod
功能:刪除內(nèi)核中的一模塊 用法:rmmod [ -f ] [ -w ] [ -s ] [ -v ] [ modulename ] 描述: rmmod是一個(gè)可以從內(nèi)核中刪除模塊的小程序,大多數(shù)用戶使用modprobe -r去刪除模塊。 選項(xiàng): -v –verbose? 顯示程序正在做些什么,一般只顯示執(zhí)行時(shí)的錯(cuò)誤信息。 -f?–force? 該選項(xiàng)是非常危險(xiǎn):除非編譯內(nèi)核時(shí),CONFIG_MODULE_FORCE_UNLOAD被設(shè)置該命令才有效果,否則沒(méi)效果。用該選項(xiàng)可以刪除正在被使用的模塊,設(shè)計(jì)為不能刪除的模塊,或者標(biāo)記為unsafe的模塊。 -w –wait 通常,rmmod拒絕刪除正在被使用的模塊。使用該選項(xiàng)后,指定的模塊會(huì)被孤立起來(lái),直到不被使用。 -s? –syslog? 將錯(cuò)誤信息寫入syslog,而不是標(biāo)準(zhǔn)錯(cuò)誤(stderr)。 -V? –version 版本信息以上內(nèi)容是參考man翻譯的,若有疑問(wèn)請(qǐng)用man …查看原始文檔,翻譯可能有誤。
?
其它:
(1)lsmod 顯示當(dāng)前加載的所有模塊,相當(dāng)于cat /proc/modules,
??? 假設(shè)你沒(méi)有設(shè)定開機(jī)加載某個(gè)模塊,比如ntfs,那么開機(jī)后執(zhí)行l(wèi)smod,列表里不會(huì)有ntfs這個(gè)模塊的,
??? 這時(shí)你再執(zhí)行 mount -t ntfs xxx后,執(zhí)行l(wèi)smod后列表里就會(huì)有ntfs這個(gè)模塊了。
??? 還要注意的是lsmod顯示的是模塊名,而不是別名(alias)。
(2)?modprobe與insmod
??? modprobe -l??????????? #顯示當(dāng)前可以加載的模塊
??? modprobe xxx.ko??????? #加載某個(gè)模塊
??? modprobe -r xxx.ko???? #卸載某個(gè)模塊
?
??? 通過(guò)了解modprobe的manpage我們知道,我可以通過(guò)modprobe -l來(lái)顯示可以當(dāng)前可以加載的模塊,所謂當(dāng)前可以加載的模塊,
??? 實(shí)際上就是modules.dep文件中包含的那些模塊,而不是manpage里說(shuō)的modprobe會(huì)加載/lib/modules/`uname -r`下的所有模塊(也許是我理解錯(cuò)誤),下面我們將會(huì)證明這一點(diǎn).
????insmod 與 modprobe 都是載入 kernel module,不過(guò)一般差別于 modprobe 能夠處理 module 載入的相依問(wèn)題。
比方你要載入 a module,但是 a module 要求系統(tǒng)先載入 b module 時(shí),直接用 insmod 掛入通常都會(huì)出現(xiàn)錯(cuò)誤訊息,不過(guò) modprobe 倒是能夠知道先載入 b module??后才載入 a module,如此相依性就會(huì)滿足。
不過(guò) modprobe 并不是大神,不會(huì)厲害到知道 module 之間的相依性為何,該程式是讀取 /lib/modules/2.6.xx/modules.dep 檔案得知相依性的。而該檔案是透過(guò) depmod 程式所建立。
(3)上面(1)中提到modprobe加載某個(gè)模塊是根據(jù)/lib/modules/`uname -r`目錄下的modules.dep文件中的模塊列表,這個(gè)文件中有的模塊modprobe會(huì)正確加載,否則就會(huì)出錯(cuò)。
我們還拿ntfs這個(gè)模塊來(lái)舉例:
vi /lib/modules/`uname -r`/modules.dep
注釋掉/lib/modules/2.6.18-4-k7/kernel/fs/ntfs/ntfs.ko這一行,就是加個(gè)#號(hào).
這個(gè)修改是即使生效的。
modinfo ntfs
modinfo: could not find module ntfs
modprobe ntfs
FATAL: Module ntfs not found.
重啟機(jī)器,執(zhí)行同樣的命令會(huì)得到同樣的結(jié)果,說(shuō)明開機(jī)不會(huì)自動(dòng)執(zhí)行depmod的,而
locate ntfs.ko
/lib/modules/2.6.18-4-k7/kernel/fs/ntfs/ntfs.ko
證明我們并沒(méi)有轉(zhuǎn)移ntfs模塊。
注意如果重啟機(jī)器之前進(jìn)行mount還是可以的,重啟之后就會(huì)報(bào)錯(cuò)了,而上邊的都是即時(shí)生效的。
還有如果modules.dep里注釋掉了ntfs,那么在/etc/modules里寫上也是不起作用的,說(shuō)明這個(gè)和mount一樣都是依賴 modprobe來(lái)完成加載模塊命令的。而insmod是可以的,因?yàn)閕nsmod后面跟的是絕對(duì)路徑,它和modules.dep沒(méi)什么關(guān)系。 insmod比較重要的用途是用來(lái)測(cè)試模塊的正確性,加載一般都是依靠modprobe。(這個(gè)可能也不起作用了,都用modprobe吧)
這一切只是因?yàn)槲覀冏⑨尩袅薽odules.dep中關(guān)于ntfs.ko的那一行,而模塊并沒(méi)有刪除或轉(zhuǎn)移。既然modules.dep文件如此重要,那么它是怎么生成的呢?這就和下一個(gè)命令有關(guān)了,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是一個(gè)用來(lái)產(chǎn)生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核心模塊可以提供服務(wù)給其他模塊,稱之為"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通過(guò)讀取/lib/modules/version目錄下的每一個(gè)模塊來(lái)創(chuàng)建一個(gè)記錄模塊相依性
的列表。這個(gè)列表就是/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會(huì)檢查這個(gè)version對(duì)應(yīng)的modules目錄而不是
當(dāng)前運(yùn)行的kernel對(duì)應(yīng)的modules目錄。
depmod will also generate various map files in this directory, for? use
by the hotplug infrastructure.
depmod也會(huì)在/lib/modules/version目錄下創(chuàng)建許多map文件,這些文件將會(huì)被hotplug用到。
OPTIONS:
-a --all? Probe? all? modules.? This option is enabled by default if no
??????????? file names are given in the command-line.
檢查所有的模塊,這個(gè)命令是默認(rèn)的如果你沒(méi)有指定模塊名字的話。
-A --quick? This option scans to see if any modules are? newer? than? the
???????????????? modules.dep file before any work is done%3
實(shí)例
查看modules的配置文件:modprobe -c
這里,可以查看modules的配置文件,比如模塊的alias別名是什么等。
會(huì)打印許多行信息,例如其中的一行會(huì)類似如下:
alias symbol:ip_conntrack_unregister_notifier ip_conntrack
列出內(nèi)核中所有已經(jīng)或者未掛載的所有模塊:
modprobe -l
這里,我們能查看到我們所需要的模塊,然后根據(jù)我們的需要來(lái)掛載.
其實(shí)modprobe -l 讀取的模塊列表就位于/lib/modules/`uname -r`目錄中;
其中uname -r是內(nèi)核的版本,例如輸出結(jié)果的其中一行是:
/lib/modules/2.6.18-348.6.1.el5/kernel/net/netfilter/xt_statistic.ko
掛載vfat模塊:modprobe vfat
用法:modprobe 模塊名?
掛載之后,用lsmod可以查看已經(jīng)掛載的模塊。模塊名是不能帶有后綴的
我們通過(guò)modprobe -l所看到的模塊,都是帶有.ko或.o后綴。
移除已經(jīng)加載的模塊:modprobe -r 模塊名
這里,移除已加載的模塊,和rmmod功能相同。
安裝軟驅(qū)模塊:
[root@root~]# modprobe -v floppy?
卸載軟驅(qū)模塊:
[root@root~]# modprobe -v -r floppy?
1) 加載RAID1陣列級(jí)別模塊:
[root@root]# modprobe raid1?
2) 顯示已加載的RAID1陣列級(jí)別模塊:
[root@root]# lsmod |grep raid1??
3) 刪除RAID1陣列級(jí)別模塊:
[root@root]# modprobe -r raid1?
4) 顯示RAID1陣列級(jí)別模塊:
[root@root]# lsmod |grep raid1?
insmod 和 modprobe使用方法
From:https://blog.csdn.net/hktkfly6/article/details/53284158/
insmod 和 modprobe 都是載入 kernel module,不過(guò)一般差別于 modprobe 能夠處理 module 載入的相依問(wèn)題。
比方你要載入 a module,不過(guò) a module 需求系統(tǒng)先載入 b module 時(shí),直接用 insmod 掛入通常都會(huì)出現(xiàn)錯(cuò)誤訊息,不過(guò) modprobe 倒是能夠知道先載入 b module??后才載入 a module,如此相依性就會(huì)滿足。不過(guò) modprobe 并不是大神,不會(huì)厲害到知道 module 之間的相依性為何,該程式是讀取 /lib/modules/2.6.xx/modules.dep 檔案得知相依性的。而該檔案是透過(guò) depmod 程式所建立。
modinfo ip_nat_ftp
一、什么是內(nèi)核;?
內(nèi)核官方:
http://www.kernel.org
內(nèi)核洋文用 kernel,我剛才翻了一下詞典,kernel 中文意思是內(nèi)核、核心、中心、精髓的意思;也是果仁、果核的意思。從字面理解,kernel 是一事物的中心,植物的果實(shí)最重要的也是果仁和果核;:) 由此我們能推斷內(nèi)核是操作系統(tǒng)的中心。
我們知道Linus Torvalds 研發(fā)了Linux ,其實(shí)他研發(fā)的就是內(nèi)核,按內(nèi)核官方主頁(yè)的理解,這個(gè)內(nèi)核就是Linux ;其他的擴(kuò)展和應(yīng)用都是圍繞內(nèi)核而展開的。所有Linux應(yīng)用程式都會(huì)和內(nèi)核發(fā)生直接或間接的接觸;比如硬件需要內(nèi)核支持,網(wǎng)絡(luò)的通信也需要內(nèi)核支持;文件系統(tǒng)更需要內(nèi)核支持... ...
直言我的能力的不行,如果你想了解和學(xué)習(xí)解操作系統(tǒng),我寫的教程只是初級(jí)應(yīng)用,理論性的東西不是一言兩語(yǔ)能說(shuō)的清晰的,更不是應(yīng)用者能說(shuō)的清晰的。
? ? 二、為什么需要編譯內(nèi)核和管理內(nèi)核
硬件是需要內(nèi)核支持才行,有些硬件的支持沒(méi)有被編入內(nèi)核,這也需要我們重編內(nèi)核;內(nèi)核的包含的不僅僅是設(shè)備的驅(qū)動(dòng),更有其他的內(nèi)容,比如網(wǎng)絡(luò)協(xié)議的支持,防火墻的支持... ... 比如iptables的實(shí)現(xiàn),有些功能是需要內(nèi)核支持的,如果內(nèi)核和iptables相關(guān)的內(nèi)容沒(méi)有被編入,iptables 相關(guān)的功能就無(wú)法實(shí)現(xiàn);
? ? 三、內(nèi)核編譯方法
請(qǐng)參考:《編譯內(nèi)核操作流程 ──為新手指南》
? ? 四、管理內(nèi)核模塊的相關(guān)命令
1、lsmod 列加以掛載的內(nèi)核模塊;
lsmod 是列出目前系統(tǒng)中已加載的模塊的名稱及大小等;另外我們還能查看 /proc/modules ,我們相同能知道系統(tǒng)已加載的模塊;
[root@localhost beinan]# lsmod
2、modinfo 查看模塊信息;
modinfo 能查看模塊的信息,通過(guò)查看模塊信息來(lái)判定這個(gè)模塊的用途;
[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 這個(gè)模塊的信息,通過(guò)查看,我們知道ne2k-pci 模塊是8029網(wǎng)卡(PCI NE2000 clone driver)的驅(qū)動(dòng);模塊是位于 /lib/modules/2.6.11-1.1369_FC4/kernel/drivers/net/ 中ne2k-pci.ko
我們目前常用的網(wǎng)卡也有8139的,8139網(wǎng)卡所用的驅(qū)動(dòng)是 8139too ;查查看?
[root@localhost beinan]# modinfo 8139too
我們?cè)俨椴関fat 和ntfs 的模塊信息;
[root@localhost beinan]# modinfo vfat
[root@localhost beinan]# modinfo ntfs
自己嘗試一下;
注意: 模塊名是不能帶有后綴的,我們通過(guò)modprobe -l 所看到的模塊,都是帶有.ko 或.o后綴;
3、modprobe 掛載新模塊及新模塊相依賴的模塊
modprobe 我們常用的功能就是掛載模塊,在掛載某個(gè)內(nèi)核模塊的同時(shí),這個(gè)模塊所依賴的模塊也被同時(shí)掛載;當(dāng)然modprobe 也有列出內(nèi)核所有模塊,更有移除模塊的功能;下在我們舉個(gè)例子說(shuō)一說(shuō)咱們常用的功能和參數(shù);
modprobe [-v] [-V] [-C config-file] [-n] [-i] [-q] [-o ] [parameters...]
modprobe -r [-n] [-i] [-v] ...
modprobe -l -t [ -a ...]
上面是modprobe 的用法,具體更為周詳?shù)膸椭?#xff0c;我們能查看 man modprobe ;
[root@localhost beinan]# modprobe -c
modprobe -c 能查看modules 的設(shè)置文件,比如模塊的別名是什么等;
[root@localhost beinan]# modprobe -l
modprobe -l 是列出內(nèi)核中所有的模塊,包括已掛載和未掛載的;通過(guò)modprobe -l ,我們能查看到我們所需要的模塊,然后根據(jù)我們的需要來(lái)掛載;其實(shí)modprobe -l 讀取的模塊列表就位于 /lib/modules/’uname -r’ 目錄中;其中uname -r 是內(nèi)核的版本;
[root@localhost beinan]# uname -r
2.6.11-1.1369_FC4
[root@localhost beinan]# ls /lib/modules/2.6.11-1.1369_FC4/
通過(guò)上面的命令,自己試試看?
[root@localhost beinan]# modprobe 模塊名 注:掛載一個(gè)模塊;
舉例:
[root@localhost beinan]# modprobe ne2k-pci 注:掛載 ne2k-pci 模塊;
[root@localhost beinan]# modprobe vfat 注:掛載vfat 模塊
[root@localhost beinan]# modprobe ntfs 注:掛載ntfs 模塊
[root@localhost beinan]# lsmod 注:列出已掛載模塊, 我們會(huì)看到ne2k-pci ,vfat ,ntfs的模塊 ;
注意: 模塊名是不能帶有后綴的,我們通過(guò)modprobe -l 所看到的模塊,都是帶有.ko 或.o后綴;
[root@localhost beinan]# modprobe -r 模塊名 注:移除已加載的模塊,和rmmod 功能相同;
注意: 模塊名是不能帶有后綴的,我們通過(guò)modprobe -l 所看到的模塊,都是帶有.ko 或.o后綴;
[root@localhost beinan]# modprobe -r 模塊名
舉例:
[root@localhost beinan]# modprobe -r ne2k-pci
就說(shuō)這么多吧,更為周詳?shù)倪€是用 man modprobe 來(lái)查看和嘗試;
4、rmmod 移除已掛載模塊;
命令格式:
rmmod 模塊名
注意: 模塊名是不能帶有后綴的,我們通過(guò)modprobe -l 所看到的模塊,都是帶有.ko 或.o后綴;
舉例:
[root@localhost beinan]# rmmod vfat 注:移除已掛載的模塊vfat
5、depmod 創(chuàng)建模塊依賴關(guān)系的列表
這個(gè)模塊管理工具是創(chuàng)建模塊依賴關(guān)系的列表,有幾個(gè)參數(shù)我們注意一下就行了,目前的的Linux 發(fā)行版所用的內(nèi)核是2.6x版本,是自動(dòng)解決依賴關(guān)系,所以這個(gè)命令知道就行了;模塊之前也有依賴關(guān)系,比如我們想驅(qū)動(dòng)USB 移動(dòng)硬盤,目前有兩種驅(qū)動(dòng),一種是udev ,在內(nèi)核中有,但目前不太穩(wěn)定;另一種辦法是用usb-storage驅(qū)動(dòng),而usb-storage 依賴的模塊是scsi 模塊,所以我們要用usb-storage 的模塊,也得把scsi 編譯安裝;
再舉個(gè)例子:sata的硬盤,在Linux中的設(shè)備表示的是/dev/sd* ,比如 /dev/sda,/dev/sdb 等... 系統(tǒng)要驅(qū)動(dòng) sata硬盤,則需要把sata在內(nèi)核中選中,或編譯成模塊,或內(nèi)置于內(nèi)核之中,在此同時(shí),還需要在內(nèi)核中選中ide ,scsi 的支持等;
depmod 工具的洋文原意:depmod ? program to generate modules.dep and map files.(我譯的:為modules.dep 文件或映射文件創(chuàng)建依賴關(guān)系)
[root@localhost beinan]# depmod -a 注:為所有列在/etc/modprobe.conf 或/etc/modules.conf 中的所有模塊創(chuàng)建依賴關(guān)系,并且寫入到modules.dep文件;
[root@localhost beinan]# depmod -e 注:列出已掛載但不可用的模塊;
[root@localhost beinan]# depmod -n 注:列出所有模塊的依賴關(guān)系,但僅僅是輸出出來(lái) (Write the dependency file on stdout only)
注:modules.dep 位于 /lib/modules/內(nèi)核版本 目錄
比如 Fedora Core 4.0 中,系統(tǒng)默認(rèn)的內(nèi)核:
[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 這個(gè)工具,和modprobe 有點(diǎn)類似,但功能上沒(méi)有modprobe 強(qiáng),modprobe 在掛載模塊是不用指定模塊文件的路徑,也不用帶文件的后綴.o 或.ko ;而insmod 需要的是模塊的所在目錄的絕對(duì)路徑,并且一定要帶有模塊文件名后綴的(modulefile.o 或modulesfile.ko );
對(duì)于這個(gè)工具,我們只是介紹一下, 并不推薦使用。因?yàn)槟K有依賴關(guān)系,對(duì)于新手來(lái)說(shuō),可能不知道這個(gè)模塊依賴和哪個(gè)模塊依賴;
舉例:
[root@localhost beinan]# insmod /lib/modules/2.6.11-1.1369_FC4/kernel/drivers/net/tg3.ko
我們要到 /lib/modules/內(nèi)核版本 uname -r 的命令輸出/kernel/drivers 中找相對(duì)應(yīng)的模塊才行,要有絕對(duì)路徑,而且必須要用到文件名的全稱,不能把文件名的后綴省略;
? ? 五、和內(nèi)核模塊加載相關(guān)的設(shè)置文件;
1、模塊的設(shè)置文件 modules.conf 或 modprobe.conf
內(nèi)核模塊的開機(jī)自動(dòng)掛載模塊一般是位于一個(gè)設(shè)置文件,一般的Linux發(fā)行版本都有 /etc/modules.conf 或 /etc/modprobe.conf 。比如Fedora Core 4.0 內(nèi)核模塊開機(jī)自動(dòng)加載文件是 /etc/modprobe.conf ;在這個(gè)文件中,一般是寫入模塊的加載命令或模塊的別名的定義等;比如我們?cè)趍odules.conf 中可能會(huì)發(fā)行類似的一行 ;
alias eth0 8139too
///-----------------------------------------------------------------------------------------------------------------------
KERNELRELEASE 的定義,Linux $(KERNELRELEASE)
最近用友善之臂的板子,發(fā)現(xiàn)內(nèi)核的名稱是:Linux-2.6.29.4-FriendlyARM.后面那個(gè)FriendlyARM死活去不掉。后來(lái)只好看代碼。
1、2.6.29.4這個(gè)版本號(hào)是是uboot在做uimage的時(shí)候加上的,看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、對(duì)比,可見2.6.29.4-FriendlyARM就是 =? $(KERNELRELEASE),因此我們需要找到$(KERNELRELEASE)怎么定義的。
3、搜索可以知道$(KERNELRELEASE)在include/config/kernel.release定義,但是改了以后重新make又還有FriendlyARM。
4、看內(nèi)核頂層的makefile,約872行有說(shuō)明:
# 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)
仔細(xì)對(duì)比,原來(lái)這個(gè)FriendlyARM是$(LOCALVERSION)!,搜索下,發(fā)現(xiàn)autoconf.h有,哈哈,這就是內(nèi)核圖形配置出來(lái)的嘛
5、馬上make menuconfig,搜索$(LOCALVERSION),乖乖,原來(lái)在Gernel Setup。。。,馬上去掉,重新編譯。這下沒(méi)了!
總結(jié)
以上是生活随笔為你收集整理的自动处理可载入模块命令 modprobe的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: vscode 调试 C++/JavaSc
- 下一篇: Linux进制查看工具:od、hexdu
