linux内核arch模块,Kernel module (简体中文)
翻譯狀態:本文是 Kernel_modules 的翻譯。上次翻譯日期:2018-05-09。如果英文版本有所更改,則您可以幫助同步翻譯。
內核模塊是可以按需加載或卸載的內核代碼,可以不重啟系統就擴充內核的功能。
要創建內核模塊,請閱讀此指南。模塊可以設置成內置或者動態加載,要編譯成可動態加載,需要在內核配置時將模塊配置為 M (模塊)。
獲取信息
模塊保存在 /lib/modules/kernel_release (使用 uname -r 命令顯示當前內核版本)。
注意: 模塊名通常使用 (_) 或 - 連接,但是這些符號在 modprobe 命令和 /etc/modprobe.d/ 配置文件中都是可以相互替換的。
顯示當前裝入的內核模塊:
$ lsmod
顯示模塊信息:
$ modinfo module_name
顯示所有模塊的配置信息:
$ modprobe -c | less
顯示某個模塊的配置信息:
$ modprobe -c | grep module_name
顯示一個裝入模塊使用的選項:
$ systool -v -m module_name
顯示模塊的依賴關系:
$ modprobe --show-depends module_name
使用systemd自動加載模塊
目前,所有必要模塊的加載均由 udev 自動完成。所以,如果不需要使用任何額外的模塊,就沒有必要在任何配置文件中添加啟動時加載的模塊。但是,有些情況下可能需要在系統啟動時加載某個額外的模塊,或者將某個模塊列入黑名單以便使系統正常運行。
內核模塊可以在/etc/modules-load.d/ 下的文件中明確列出,以便systemd在引導過程中加載它們。 每個配置文件都以 /etc/modules-load.d/.conf的樣式命名。 配置文件僅包含要加載的內核模塊名稱列表,以換行符分隔。 空行和第一個非空白字符為#或;的行被忽略。
/etc/modules-load.d/virtio-net.conf
# Load virtio_net.ko at boot
virtio_net
手動加載卸載
控制內核模塊載入/移除的命令是
# modprobe module_name
按文件名加載模塊:
# insmod filename [args]
Note: 如果升級了內核但是沒有重啟,路徑 /usr/lib/modules/$(uname -r)/ 已經不存在。modprobe 會返回錯誤 1,沒有額外的錯誤信息。如果出現 modprobe 加載失敗,請檢查模塊路徑以確認是否是這個問題導致。
如果要移除一個模塊:
# modprobe -r module_name
或者:
# rmmod module_name
配置模塊參數
手動加載時設置
傳遞參數的基本方式是使用 modprobe 選項,格式是 key=value:
# modprobe module_name parameter_name=parameter_value
使用 /etc/modprobe.d/中的文件
要通過配置文件傳遞參數,在 /etc/modprobe.d/ 中放入任意名稱 .conf 文件,加入:
/etc/modprobe.d/myfilename.conf
options modname parametername=parametercontents
例如
/etc/modprobe.d/thinkfan.conf
# On thinkpads, this lets the thinkfan daemon control fan speed
options thinkpad_acpi fan_control=1
注意: 如果要在啟動時就修改內核參數(從 init ramdisk 開始),需要將相應的.conf-文件加入 mkinitcpio.conf 的 FILES 參數中。
使用內核命令行
如果模塊直接編譯進內核,也可以通過啟動管理器(GRUB, LILO 或 Syslinux)的內核行加入參數:
modname.parametername=parametercontents
例如:
thinkpad_acpi.fan_control=1
別名
/etc/modprobe.d/myalias.conf
# Lets you use 'mymod' in MODULES, instead of 'really_long_module_name'
alias mymod really_long_module_name
有些模塊具有別名,以方便其它程序自動裝入模塊。禁用這些別名可以阻止自動裝入,但是仍然可以手動裝入。
/etc/modprobe.d/modprobe.conf
# Prevent autoload of bluetooth
alias net-pf-31 off
# Prevent autoload of ipv6
alias net-pf-10 off
黑名單
禁用內核模塊
對內核模塊來說,黑名單是指禁止某個模塊裝入的機制。當對應的硬件不存在或者裝入某個模塊會導致問題時很有用。
有些模塊作為 initramfs 的一部分裝入。
mkinitcpio -M 會顯示所有自動檢測到到模塊:要阻止 initramfs 裝入某些模塊,可以在 /etc/modprobe.d中將它們加入黑名單。并應在映像生成過程中通過modconf掛鉤將其添加。
運行 mkinitcpio -v 會顯示各種鉤子(例如 filesystem 鉤子, SCSI 鉤子等)裝入的模塊。如果您的HOOKS 數組中沒有 modconf 鉤子(例如,和默認配置不同)則請將該".conf"文件添加到/etc/mkinitcpio.conf中的FILES數組中。一旦您將其列入黑名單,請重新生成 initramfs,然后重新啟動。
使用 /etc/modprobe.d/ 中的文件
在 /etc/modprobe.d/ 中創建 .conf 文件,使用 blacklist 關鍵字屏蔽不需要的模塊,例如如果不想裝入 pcspkr 模塊:
/etc/modprobe.d/nobeep.conf
# Do not load the pcspkr module on boot
blacklist pcspkr
注意: blacklist 命令將屏蔽一個模板,所以不會自動裝入,但是如果其它非屏蔽模塊需要這個模塊,系統依然會裝入它。
要避免這個行為,可以讓 modprobe 使用自定義的 install 命令,而不是像往常一樣將模塊插入內核,因此您可以通過以下方式強制模塊始終無法加載:
/etc/modprobe.d/blacklist.conf
...
install MODULE /bin/true
...
這樣就可以 "屏蔽" 模塊及所有依賴它的模塊。
使用內核命令行
提示: 如果模塊損壞導致無法引導系統,這將非常有用。
您也可以從引導加載程序中將模塊列入黑名單。
如Kernel參數.中所述,只需將module_blacklist=modname1,modname2,modname3 添加到引導加載程序的內核行中即可。
注意: 將多個模塊列入黑名單時,請注意,它們之間僅用逗號分隔。 空格或其他內容可能會破壞語法。
問題處理
模塊未加載
如果出現模塊在啟動時未加載,而且啟動日志中(journalctl -b) 顯示模塊被屏蔽,但是 /etc/modprobe.d/ 中未找到屏蔽設置,請檢查 /usr/lib/modprobe.d/ 目錄。
"vermagic" 字符串與內核不一致的模塊不會被加載,如果確認模塊與當前內核兼容,可以用 modprobe --force-vermagic 參數加載,跳過檢查。
警告: 忽略模塊檢查,可能因為不兼容導致系統崩潰或不可預知行為,請謹慎使用 --force-vermagic。
參見
總結
以上是生活随笔為你收集整理的linux内核arch模块,Kernel module (简体中文)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在windows上模拟linux环境,M
- 下一篇: win10内核linux,windows