Linux / Unix命令:insmod

Linux / Unix命令insmod在正在運行的內核中安裝可加載模塊insmod嘗試通過解析內核導出的符號表中的所有符號將模塊鏈接到正在運行的內核。

如果給出的模塊文件名不帶目錄或擴展名, insmod將在一些常用的默認目錄中搜索模塊。 環境變量MODPATH可以用來覆蓋這個默認值。 如果存在諸如/etc/modules.conf的模塊配置文件,它將覆蓋MODPATH中定義的路徑。

環境變量MODULECONF也可用於從默認的/etc/modules.conf (或/etc/conf.modules (不建議使用))中選擇不同的配置文件。 這個環境變量將覆蓋上面的所有定義。

當設置環境變量UNAME_MACHINE時 ,modutils將使用它的值而不是uname()系統調用中的機器字段。 這主要是在32位用戶空間中編譯64位模塊時使用,反之亦然,請將UNAME_MACHINE設置為模塊的類型。 目前的modutils不支持模塊的完全交叉構建模式,它僅限於在32位和64位版本的主機體系結構之間進行選擇。

選項

-e persist_name ,-- persist = persist_name

指定模塊的任何持久性數據在加載時被讀取的位置,並在模塊的此實例化被卸載時被寫入。 如果模塊沒有持久數據,則此選項將被忽略。 如果此選項存在,則只有insmod讀取持久性數據,默認情況下, insmod不處理持久性數據。

作為一個簡寫形式-e“” (一個空字符串)被insmod解釋為modules.conf中定義的persistdir的值,後面跟隨該模塊相對於模塊搜索路徑找到的文件名,減去任何尾隨“.gz”,“.o”或“.mod”。 如果modules.conf指定“ persistdir = ”(即persistdir是一個空字段),那麼這個簡寫形式將被忽略。 (請參閱modules.conf (5)。)

-f ,-- force

即使運行內核的版本和編譯模塊的內核版本不匹配,也要嘗試加載模塊。 這只會覆蓋內核版本檢查,它對符號名稱檢查沒有影響。 如果模塊中的符號名稱與內核不匹配,則無法強制insmod加載模塊。

-h , - 幫助

顯示選項摘要並立即退出。

-k ,-- autoclean

在模塊上設置自動清除標誌。 這個標誌將被kerneld (8)用來刪除在一段時間內沒有被使用的模塊 - 通常是一分鐘。

-L , -

使用flock (2)來防止同一模塊的同時加載。

-m ,-- map

在標準輸出上輸出負載映射,使得在內核恐慌時調試模塊變得更加容易。

-n ,-- noload

虛擬運行,除了將模塊加載到內核之外,其它的事情都會完成。 如果由-m-O請求,則運行將生成一個映射或blob文件。 由於該模塊未加載,所以真正的內核加載地址是未知的,因此映射和blob文件基於任意加載地址0x12340000。

-o module_name ,-- name = module_name

顯式命名模塊,而不是從源對象文件的基本名稱派生名稱。

-O blob_name ,-- blob = blob_name

將二進制對象保存在blob_name中 。 結果是一個二進制blob(沒有ELF頭文件),顯示了在部分操作和重定位之後加載到內核的內容。 選項-m建議獲取對象的映射。

-p ,-- probe

探測模塊以查看它是否可以成功加載 。 這包括在模塊路徑中查找目標文件,檢查版本號和解析符號。 它不會檢查重定位,也不會生成地圖或Blob文件。

-P 前綴 ,-- prefix = 前綴

此選項可與SMP或bigmem內核的版本化模塊一起使用,因為這些模塊在其符號名稱中添加了額外的前綴。 如果內核是用符號版本構建的,那麼insmod會自動從“get_module_symbol”或“inter_module_get”的定義中提取前綴,其中一個必須存在於支持模塊的任何內核中。 如果內核沒有符號版本,但模塊是用符號版本構建的,那麼用戶必須提供-P

-q , - 安靜

不要打印任何未解決符號的列表。 不要抱怨版本不匹配。 這個問題只會反映在insmod的退出狀態中。

-r-

一些用戶在非root用戶標識下編譯模塊,然後以root身份安裝模塊。 即使模塊目錄由root擁有,此進程也可以讓非root用戶標識擁有的模塊。 如果非根用戶標識符受到攻擊,入侵者可以覆蓋該用戶標識符擁有的現有模塊,並使用此公開權限引導至根用戶訪問權限。

默認情況下,modutils將拒絕嘗試使用不屬於root的模塊。 指定-r將切換檢查並允許root加載不屬於root的模塊。 注意:配置modutils時,可以更改根檢查的默認值。

在配置時使用-r禁用根檢查或將默認設置為“無根檢查”是主要的安全風險,不建議使用。

-s- syslog

將所有內容輸出到syslog (3)而不是終端。

-S , - 冰淇淋

強制加載的模塊具有kallsyms數據,即使內核不支持它。 此選項適用於內核加載時沒有kallsyms數據的小型系統,但所選模塊需要使用kallsyms進行調試。 這個選項是Red Hat Linux的默認選項。

-v ,-- verbose

詳細。

-V ,-- version

顯示insmod的版本。

-X ,-- export ; -x--noexport

請勿分別導出模塊的所有外部符號。 默認值是為了導出符號。 此選項僅在模塊未明確導出其自己的受控符號表時才有效,因此不推薦使用。

-Y ,-- ksymoops ; -y , - noksymoops

請不要將ksymoops符號添加到ksyms。 如果在這個模塊中有Oops,這些符號被ksymoops用來提供更好的調試。 缺省是為了定義ksymoops符號。 該選項獨立於-X / -x選項。

ksymoops符號為每個加載的模塊添加大約260個字節。 除非你真的缺乏內核空間,並且試圖將ksyms降低到最小尺寸,否則採用默認值並獲得更準確的Oops調試。 ksymoops符號是保存持久模塊數據所必需的。

-N- 僅限數字

只能根據內核版本檢查模塊版本的數字部分,即在決定模塊是否屬於內核時忽略EXTRAVERSION。 該標誌自動設置為內核2.5以上,對於較早的內核是可選的。

模塊參數

一些模塊接受加載時間參數來定制它們的操作。 這些參數通常是I / O端口和IRQ號碼,因機器而異,無法通過硬件來確定。

在為2.0系列內核構建的模塊中,任何整數或字符指針符號可被視為參數並進行修改。 從2.1系列內核開始,符號被顯式地標記為參數,以便只有特定的值可以被改變。 此外,提供類型信息用於檢查加載時提供的值。

在整數的情況下,所有的值都可以是十進制,八進製或十六進制的a C:17,021或0x11。 數組元素是用逗號分隔的指定序列。 元素可以通過省略值來跳過。

在2.0系列模塊中,不以數字開頭的值被視為字符串。 從2.1開始,參數的類型信息指示是否將該值解釋為字符串。 如果該值以雙引號( )開頭,則該字符串被解釋為C,轉義序列和全部。請注意,從shell提示符處,引號本身可能需要受到shell解釋的保護。

GPL授權模塊和符號

從內核2.4.10開始,模塊應該有一個使用MODULE_LICENSE()定義的許可字符串。 有幾個字符串被認為是GPL兼容的; 任何其他許可證字符串或無許可證都意味著該模塊被視為專有。

如果內核支持/ proc / sys / kernel / tainted標誌,那麼在加載沒有GPL許可證的模塊時, insmod會將受污染的標誌或'1'或OR。 如果內核支持篡改並且模塊在沒有許可證的情況下加載,則會發出警告。 對於具有不兼容GPL的MODULE_LICENSE()的模塊,即使在不支持污染的舊內核上也會發出警告。 當舊的內核使用新的modutils時,這可以最大限度地減少警告。

insmod -f (強制)模式將在內核上使用'2'或污染標誌來支持污點。 它總是發出警告。

有些內核開發人員要求通過代碼導出的符號只能由具有GPL兼容許可證的模塊使用。 這些符號由EXPORT_SYMBOL_GPL導出,而不是通常的EXPORT_SYMBOL 。 內核和其他模塊導出的僅GPL符號僅對具有GPL兼容許可證的模塊可見,這些符號出現在/ proc / ksysy中,前綴為“ GPLONLY_ ”。 在加載GPL授權模塊時, insmod忽略符號上的GPLONLY_前綴,因此該模塊只引用正常的符號名稱,而沒有前綴。 沒有GPL兼容許可證的模塊不提供GPL唯一符號,這包括完全沒有許可證的模塊。

Ksymoops協助

為了在使用模塊時幫助調試內核Oops, insmod默認將某些符號添加到ksyms中,請參閱-Y選項。 這些符號以__insmod_modulename_開頭 。 需要modulename才能使符號具有唯一性。 在不同的模塊名稱下多次加載相同的對像是合法的。 目前,定義的符號是:

__insmod_modulename_Oobjectfile_Mmtime_Vversion

objectfile是該對像從中加載的文件的名稱。 這確保ksymoops可以將代碼與正確的對象相匹配。 mtime是十六進製文件中最後修改的時間戳,如果統計失敗,則為零。 版本是模塊編譯的內核版本,如果沒有版本可用,則為-1。 _O符號具有與模塊頭相同的起始地址。

__insmod_modulename_Ssectionname_Llength

此符號出現在所選ELF部分的開頭,當前為.text,.rodata,.data,.bss和.sbss。 只有在該部分的大小不為零時才會顯示。 sectionname是ELF節的名稱, length是十進制節的長度。 這些符號有助於ksymoops在沒有符號可用時將地址映射到節。

__insmod_modulename_Ppersistent_filename

只有當模塊具有一個或多個標記為持久數據的參數和一個用於保存持久數據文件名時,才由insmod創建(請參見上面的-e )。

在模塊中調試內核Oops的另一個問題是/ proc / ksyms/ proc / modules的內容可能會在Oops和處理日誌文件之間發生變化。 為了幫助解決這個問題,如果目錄/ var / log / ksymoops存在,那麼insmodrmmod會自動將/ proc / ksyms/ proc / modules複製到/ var / log / ksymoops前綴為'date +%Y%m %d%H%M%S`。 系統管理員可以在調試Oops時告訴ksymoops使用哪些快照文件。 沒有開關來禁用此自動副本。 如果你不想讓它發生,不要創建/ var / log / ksymoops 。 如果該目錄存在,它應該由root擁有,並且是644或600模式,你應該每天運行這個腳本。 下面的腳本安裝為insmod_ksymoops_clean

基本信息要知道

名稱

insmod - 安裝可加載的內核模塊

概要

insmod [-fhkLmnpqrsSvVxXyYN] [-e persist_name ] [-o module_name ] [-O blob_name ] [-P 前綴 ] 模塊 [ symbol = value ...]