28 管理内核模块 #
虽然 Linux 属于单内核,但可通过内核模块加以扩展。这些特殊对象可以插入到内核中,并可按需去除。就实际角度而言,内核模块使添加和去除内核本身未包含的驱动程序和接口成为现实。Linux 提供了若干用于管理内核模块的命令。
28.1 使用 lsmod 和 modinfo 列出装载的模块 #
使用 lsmod
命令可查看目前装载了哪些内核模块。该命令的输出可能如下所示:
>
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/5.3.18-57-default/kernel/arch/x86/kvm/kvm.ko.xz
license: GPL
author: Qumranet
suserelease: SLE15-SP3
srcversion: 3D8FBA9060D4537359A06FC
depends: irqbypass
supported: yes
retpoline: Y
intree: Y
name: kvm
vermagic: 5.3.18-57-default SMP mod_unload modversions
28.2 添加和去除内核模块 #
虽然可以使用 insmod
和 rmmod
分别添加和去除内核模块,但建议使用 modprobe
工具来执行这些操作。modprobe
具有多项重要优势,包括自动解析依赖项和将内核模块列入黑名单。
如果不指定任何参数,使用 modprobe
命令会安装指定的内核模块。必须使用 root 特权来运行 modprobe
:
>
sudo
modprobe acpi
要去除内核模块,请使用 -r
参数:
>
sudo
modprobe -r acpi
28.2.1 引导时自动装载内核模块 #
您可以选择不手动装载内核模块,而是使用 systemd-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/
。
28.2.2 使用 modprobe 将内核模块列入黑名单 #
将某个内核模块列入黑名单后,引导期间便不再会装载该模块。当要禁用您怀疑可能导致系统出现问题的某个模块时,此功能十分有用。您仍可使用 insmod
或 modprobe
工具手动装载列入黑名单的内核模块。
要将模块列入黑名单,请创建包含以下内容的 /etc/modprobe.d/60-blacklist-MODULE_NAME.conf
文件:
blacklist MODULE_NAME
以 root 身份运行 dracut
命令生成新的 initrd
映像,然后重引导计算机(将 NAME 替换为当前 initrd 的名称,将 KERNELVERSION 替换为当前运行的内核):
>
su
echo "blacklist nouveau" >> /etc/modprobe.d/60-blacklist-nouveau.conf
/usr/bin/dracut --logfile /var/log/YaST2/mkinitrd.log --force /boot/$initrd-NAME $KERNELVERSION
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
命令使更改生效。