arch-wiki-md-repo
Version:
All arch-wiki articles in markdown format, updated every two days.
249 lines (154 loc) • 8.95 kB
Markdown
相关文章
* [Boot Debugging](/index.php/Boot_Debugging "Boot Debugging")
* [Kernels (简体中文)](/index.php/Kernels_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "Kernels (简体中文)")
* [Kernel parameters (简体中文)](/index.php/Kernel_parameters_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "Kernel parameters (简体中文)")
**翻译状态:** 本文是英文页面 [Kernel_modules](/index.php/Kernel_modules "Kernel modules") 的[翻译](/index.php/ArchWiki_Translation_Team_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "ArchWiki Translation Team (简体中文)"),最后翻译时间:2018-05-09,点击[这里](https://wiki.archlinux.org/index.php?title=Kernel_modules&diff=0&oldid=515813)可以查看翻译后英文页面的改动。
[内核模块](https://en.wikipedia.org/wiki/Loadable_kernel_module "wikipedia:Loadable kernel module")是可以按需加载或卸载的内核代码,可以不重启系统就扩充内核的功能。
要创建内核模块,请阅读[此指南](http://tldp.org/LDP/lkmpg/2.6/html/index.html)。模块可以设置成内置或者动态加载,要编译成可动态加载,需要在内核配置时将模块配置为 `M` (模块)。
## Contents
* [1 获取信息](#.E8.8E.B7.E5.8F.96.E4.BF.A1.E6.81.AF)
* [2 自动处理](#.E8.87.AA.E5.8A.A8.E5.A4.84.E7.90.86)
* [3 手动加载卸载](#.E6.89.8B.E5.8A.A8.E5.8A.A0.E8.BD.BD.E5.8D.B8.E8.BD.BD)
* [4 配置模块参数](#.E9.85.8D.E7.BD.AE.E6.A8.A1.E5.9D.97.E5.8F.82.E6.95.B0)
* [4.1 手动加载时设置](#.E6.89.8B.E5.8A.A8.E5.8A.A0.E8.BD.BD.E6.97.B6.E8.AE.BE.E7.BD.AE)
* [4.2 使用 /etc/modprobe.d/中的文件](#.E4.BD.BF.E7.94.A8_.2Fetc.2Fmodprobe.d.2F.E4.B8.AD.E7.9A.84.E6.96.87.E4.BB.B6)
* [4.3 使用内核命令行](#.E4.BD.BF.E7.94.A8.E5.86.85.E6.A0.B8.E5.91.BD.E4.BB.A4.E8.A1.8C)
* [5 别名](#.E5.88.AB.E5.90.8D)
* [6 黑名单](#.E9.BB.91.E5.90.8D.E5.8D.95)
* [6.1 禁用内核模块](#.E7.A6.81.E7.94.A8.E5.86.85.E6.A0.B8.E6.A8.A1.E5.9D.97)
* [6.2 使用 /etc/modprobe.d/ 中的文件](#.E4.BD.BF.E7.94.A8_.2Fetc.2Fmodprobe.d.2F_.E4.B8.AD.E7.9A.84.E6.96.87.E4.BB.B6)
* [6.3 使用内核命令行](#.E4.BD.BF.E7.94.A8.E5.86.85.E6.A0.B8.E5.91.BD.E4.BB.A4.E8.A1.8C_2)
* [7 问题处理](#.E9.97.AE.E9.A2.98.E5.A4.84.E7.90.86)
* [7.1 模块未加载](#.E6.A8.A1.E5.9D.97.E6.9C.AA.E5.8A.A0.E8.BD.BD)
* [8 参见](#.E5.8F.82.E8.A7.81)
## 获取信息
模块保存在 `/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*
```
## 自动处理
目前,所有必要模块的加载均由 [udev](/index.php/Udev "Udev") 自动完成。所以,如果不需要使用任何额外的模块,就没有必要在任何配置文件中添加启动时加载的模块。但是,有些情况下可能需要在系统启动时加载某个额外的模块,或者将某个模块列入黑名单以便使系统正常运行。
systemd 读取 `/etc/modules-load.d/` 中的配置加载额外的内核模块。配置文件名称通常为 `/etc/modules-load.d/<program>.conf`。格式很简单,一行一个要读取的模块名,而空行以及第一个非空格字符为`#`或`;`的行会被忽略,如:
`/etc/modules-load.d/virtio-net.conf`
```
# Load virtio-net.ko at boot
virtio-net
```
另见[modules-load.d(5)](https://jlk.fjfi.cvut.cz/arch/manpages/man/modules-load.d.5)。
## 手动加载卸载
控制内核模块载入/移除的命令是[kmod](https://www.archlinux.org/packages/?name=kmod) 软件包提供的, 要手动装入模块的话,执行:
```
# 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](/index.php/Mkinitcpio.conf "Mkinitcpio.conf") 的 FILES 参数中。
### 使用内核命令行
如果模块直接编译进内核,也可以通过启动管理器([GRUB](/index.php/GRUB "GRUB"), [LILO](/index.php/LILO "LILO") 或 [Syslinux](/index.php/Syslinux "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](/index.php/Initramfs "Initramfs") 的一部分装入。
`mkinitcpio -M` 会显示所有自动检测到到模块:要阻止 initramfs 装入某些模块,可以在 `/etc/modprobe.d/modprobe.conf` 中将它们加入黑名单。
运行 `mkinitcpio -v` 会显示各种钩子(例如 filesystem 钩子, SCSI 钩子等)装入的模块。如果要禁用这些模块,记得在配置完成后,将`.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/false
...
```
这样就可以 "屏蔽" 模块及所有依赖它的模块。
### 使用内核命令行
同样可以通过内核命令行(位于 [GRUB](/index.php/GRUB "GRUB")、[LILO](/index.php/LILO "LILO") 或 [Syslinux](/index.php/Syslinux "Syslinux"))禁用模块:
```
modprobe.blacklist=modname1,modname2,modname3
```
当某个模块导致系统无法启动时,可以使用此方法禁用模块。
参阅[Kernel parameters](/index.php/Kernel_parameters "Kernel parameters").
## 问题处理
### 模块未加载
如果出现模块在启动时未加载,而且启动日志中(`journalctl -b`) 显示模块被屏蔽,但是 `/etc/modprobe.d/` 中未找到屏蔽设置,请检查 `/usr/lib/modprobe.d/` 目录。
"vermagic" 字符串与内核不一致的模块不会被加载,如果确认模块与当前内核兼容,可以用 `modprobe --force-vermagic` 参数加载,跳过检查。
**警告:** 忽略模块检查,可能因为不兼容导致系统崩溃或不可预知行为,请谨慎使用 `--force-vermagic`。
## 参见
* [http://linuxmanpages.com/man5/modprobe.conf.5.php](http://linuxmanpages.com/man5/modprobe.conf.5.php)
* [禁用 IPv6](/index.php/Disabling_IPv6_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "Disabling IPv6 (简体中文)")
* [禁用 PC喇叭](/index.php/Disable_PC_speaker_beep_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "Disable PC speaker beep (简体中文)")