1.8. 防止在系统引导时自动载入内核模块
下面的步骤描述了如何在 denylist 中添加内核模块使其不会在引导过程中自动载入。
先决条件
- root 权限。
-
已安装
kmod
软件包。 - 确定 denylist 中的内核模块对您当前系统配置并不重要。
流程
选择您要放入 denylist 中的内核模块:
$ lsmod Module Size Used by fuse 126976 3 xt_CHECKSUM 16384 1 ipt_MASQUERADE 16384 1 uinput 20480 1 xt_conntrack 16384 1 …
lsmod
命令显示载入到当前运行的内核的模块列表。或者,找到您要防止载入的未加载内核模块。
所有内核模块都位于
/lib/modules/<KERNEL_VERSION>/kernel/<SUBSYSTEM>/
目录中。
为 denylist 创建配置文件:
# vim /etc/modprobe.d/blacklist.conf # Blacklists <KERNEL_MODULE_1> blacklist <MODULE_NAME_1> install <MODULE_NAME_1> /bin/false # Blacklists <KERNEL_MODULE_2> blacklist <MODULE_NAME_2> install <MODULE_NAME_2> /bin/false # Blacklists <KERNEL_MODULE_n> blacklist <MODULE_NAME_n> install <MODULE_NAME_n> /bin/false …
示例中显示了由
vim
编辑器编辑的blacklist.conf
文件的内容。黑名单
行可确保在引导过程中不会自动加载相关内核模块。但是,黑名单
命令不会阻止将模块作为不在 denylist 中的另一个内核模块的依赖项加载。因此,install 行
会导致/bin/false
运行而不是安装模块。以 hash 符号开头的行是注释以便更易读。
注意在输入内核模块的名称时,不要将.
ko.xz
扩展附加到名称的末尾。内核模块名称没有扩展名,它们对应的文件有。在重新构建前,为当前初始 ramdisk 镜像创建备份副本:
# cp /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).bak.$(date +%m-%d-%H%M%S).img
如果新版本出现意外问题,以上命令会创建一个备份
initramfs
镜像。另外,还可创建其它初始 ramdisk 镜像的备份副本,该副本与您要将内核模块放入 denylist 中的内核版本对应:
# cp /boot/initramfs-<SOME_VERSION>.img /boot/initramfs-<SOME_VERSION>.img.bak.$(date +%m-%d-%H%M%S)
根据更改生成新的初始 ramdisk 镜像:
# dracut -f -v
如果您要为当前引导的不同内核版本构建初始 ramdisk 镜像,请指定目标
initramfs
和内核版本:# dracut -f -v /boot/initramfs-<TARGET_VERSION>.img <CORRESPONDING_TARGET_KERNEL_VERSION>
重启系统:
$ reboot
此流程中描述的更改将在重启后生效并保留。如果您将关键内核模块错误地放入 denylist 中,您会遇到不稳定的情况或系统无法正常工作。
其它资源
-
如需有关
dracut
实用程序的更多详细信息,请参阅dracut(8)手册页
。 - 有关防止在 Red Hat Enterprise Linux 8 及更早的版本中系统引导时自动载入内核模块的更多信息,请参阅 如何防止内核模块自动载入?