2.11. 防止在系统引导时自动载入内核模块
您可以通过使用相应的命令在 modprobe
配置文件中列出模块,来防止系统在引导过程中自动载入内核模块。
先决条件
-
此流程中的命令需要 root 权限。使用
su -
切换到 root 用户,或使用sudo
作为命令的前导。 -
已安装
kmod
软件包。 - 确定您当前的系统配置不需要您计划拒绝的内核模块。
流程
使用
lsmod
命令列出载入到当前运行的内核中的模块:$ lsmod Module Size Used by tls 131072 0 uinput 20480 1 snd_seq_dummy 16384 0 snd_hrtimer 16384 1 …
在输出中,识别您要防止被加载的模块。
或者,识别您要防止在
/lib/modules/<KERNEL-VERSION>/kernel/<SUBSYSTEM>/
目录中加载的而未加载的内核模块,例如:$ ls /lib/modules/4.18.0-477.20.1.el8_8.x86_64/kernel/crypto/ ansi_cprng.ko.xz chacha20poly1305.ko.xz md4.ko.xz serpent_generic.ko.xz anubis.ko.xz cmac.ko.xz…
创建一个作为 denylist 的配置文件:
# touch /etc/modprobe.d/denylist.conf
在您选择的文本编辑器中,将您要从自动加载中排除的模块名称与使用
blacklist
配置命令列出的模块名称结合在一起,例如:# Prevents <KERNEL-MODULE-1> from being loaded blacklist <MODULE-NAME-1> install <MODULE-NAME-1> /bin/false # Prevents <KERNEL-MODULE-2> from being loaded blacklist <MODULE-NAME-2> install <MODULE-NAME-2> /bin/false …
由于
blacklist
命令不会阻止将模块作为不在 denylist 中的另一个内核模块的依赖项加载,所以您还必须定义install
行。在这种情况下,系统运行/bin/false
,而不是安装模块。以哈希符号开头的行是注释,可用来使文件更易读。注意在输入内核模块的名称时,不要将
.ko.xz
扩展附加到名称的末尾。内核模块名称没有扩展名,它们对应的文件有。在重建前,创建当前初始 RAM 磁盘镜像的一个备份副本:
# cp /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).bak.$(date +%m-%d-%H%M%S).img
或者,创建初始 RAM 磁盘镜像的一个备份副本,该镜像对应于您要阻止内核模块自动载入的内核版本:
# cp /boot/initramfs-<VERSION>.img /boot/initramfs-<VERSION>.img.bak.$(date +%m-%d-%H%M%S)
生成一个新的初始 RAM 磁盘镜像以应用更改:
# dracut -f -v
如果您为系统当前使用的内核版本之外的版本构建初始 RAM 磁盘镜像,请指定目标
initramfs
和内核版本:# dracut -f -v /boot/initramfs-<TARGET-VERSION>.img <CORRESPONDING-TARGET-KERNEL-VERSION>
重启系统:
$ reboot
此流程中描述的更改将在重启后生效并保留。如果您在 denylist 中错误地列出了关键内核模块,您可以将系统切换到不稳定或不正常工作的状态。
其它资源
- 如何防止内核模块自动加载? 解决方案文章
-
modprobe.d (5)
和dracut (8)
手册页