20 管理内核模块 #
虽然 Linux 属于单内核,但可通过内核模块加以扩展。这些特殊对象可以插入到内核中,并可按需去除。就实际角度而言,内核模块使添加和去除内核本身未包含的驱动程序和接口成为现实。Linux 提供了若干用于管理内核模块的命令。
20.1 使用 lsmod 和 modinfo 列出装载的模块 #
使用 lsmod
命令可查看目前装载了哪些内核模块。该命令的输出可能如下所示:
tux >
lsmod
Module Size Used by
snd_usb_audio 188416 2
snd_usbmidi_lib 36864 1 snd_usb_audio
hid_plantronics 16384 0
snd_rawmidi 36864 1 snd_usbmidi_lib
snd_seq_device 16384 1 snd_rawmidi
fuse 106496 3
nfsv3 45056 1
nfs_acl 16384 1 nfsv3
输出内容分为三列:Module
列列出所装载模块的名称,Size
列显示各模块的大小。Used by
列显示引用模块的进程数及其名称。请注意,此列表可能不完整。
要查看有关特定内核模块的详细信息,请使用 modinfo MODULE_NAME
命令。其中 MODULE_NAME 为所需内核模块的名称。请注意,modinfo
二进制文件位于用户的 PATH 环境变量中未包含的 /sbin
目录下。这意味着,当您以普通用户身份运行 modinfo
命令时,必须指定该二进制文件的完整路径:
$ /sbin/modinfo kvm filename: /lib/modules/4.12.14-94.37-default/kernel/arch/x86/kvm/kvm.ko license: GPL author: Qumranet srcversion: BDFD8098BEEA517CB75959B depends: irqbypass intree: Y vermagic: 4.4.57-18.3-default SMP mod_unload modversions signer: openSUSE Secure Boot Signkey sig_key: 03:32:FA:9C:BF:0D:88:BF:21:92:4B:0D:E8:2A:09:A5:4D:5D:EF:C8 sig_hashalgo: sha256 parm: ignore_msrs:bool parm: min_timer_period_us:uint parm: kvmclock_periodic_sync:bool parm: tsc_tolerance_ppm:uint parm: lapic_timer_advance_ns:uint parm: halt_poll_ns:uint parm: halt_poll_ns_grow:int parm: halt_poll_ns_shrink:int
20.2 添加和去除内核模块 #
虽然可以使用 insmod
和 rmmod
分别添加和去除内核模块,但建议使用 modprobe
工具来执行这些操作。modprobe
具有多项重要优势,包括自动解析依赖项和将内核模块列入黑名单。
如果不指定任何参数,使用 modprobe
命令会安装指定的内核模块。必须使用 root 特权来运行 modprobe
:
tux >
sudo modprobe acpi
要去除内核模块,请使用 -r
参数:
sudo modprobe -r acpi
20.2.1 引导时自动装载内核模块 #
您可以选择不手动装载内核模块,而是使用 system-modules-load.service
服务在引导过程中自动装载这些模块。要启用内核模块,请将 .conf
文件添加到 /etc/modules-load.d/
目录下。建议为配置文件指定与模块相同的名称,例如:
/etc/modules-load.d/rt2800usb.conf
配置文件中必须包含所需内核模块的名称(例如 rt2800usb
)。
通过上述的这个技巧,无需指定任何参数即可装载内核模块。如果您需要使用特定选项装载内核模块,请将配置文件添加到 /etc/modprobe.d/
目录下。该文件的扩展名必须为 .conf
。文件名必须符合以下命名约定:priority-modulename.conf
,例如:50-thinkfan.conf
。配置文件中必须包含内核模块名称及所需参数。您可以使用以下示例命令来创建包含内核模块名称及其参数的配置文件:
echo "options thinkpad_acpi fan_control=1" | sudo tee /etc/modprobe.d/thinkfan.conf
当检测到设备或用户空间请求特定功能时,系统会自动装载大多数内核模块。因此,很少需要手动将模块添加到 /etc/modules-load.d/
。
20.2.2 使用 modprobe 将内核模块列入黑名单 #
将某个内核模块列入黑名单后,引导期间便不再会装载该模块。当要禁用您怀疑可能导致系统出现问题的某个模块时,此功能十分有用。请注意,您仍可通过使用 insmod
或 modprobe
工具来手动装载列入黑名单的内核模块。
要将模块列入黑名单,请在 /etc/modprobe.d/50-blacklist.conf
文件中添加 blacklist MODULE_NAME
行。例如:
blacklist nouveau
以 root 身份运行 mkinitrd
命令生成新的 initrd
映像,然后重引导计算机。可使用以下命令执行上述步骤:
su echo "blacklist nouveau" >> /etc/modprobe.d/50-blacklist.conf && mkinitrd && reboot
如果只想临时禁用内核模块,可在引导期间即时将其列入黑名单。要实现此目的,请在引导屏幕显示时按 E 键。这样,您会进入一个可供您修改引导参数的小编辑器。找到如下所示的行:
linux /boot/vmlinuz...splash= silent quiet showopts
在该行末尾添加 modprobe.blacklist=MODULE_NAME
命令。例如:
linux /boot/vmlinuz...splash= silent quiet showopts modprobe.blacklist=nouveau
按 F10 或 Ctrl–X 以按照指定配置引导。
要通过 GRUB 将某个内核模块永久列入黑名单,请打开要编辑的 /etc/default/grub
文件,在 GRUB_CMD_LINUX
命令中添加 modprobe.blacklist=MODULE_NAME
选项。然后运行 sudo grub2-mkconfig -o /boot/grub2/grub.cfg
命令使更改生效。