UNPKG

arch-wiki-md-repo

Version:

All arch-wiki articles in markdown format, updated every two days.

249 lines (154 loc) 8.95 kB
相关文章 * [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 (简体中文)")