3.10. 防止在系统引导时自动载入内核模块

您可以通过使用相应的命令在 modprobe 配置文件中列出模块,来防止系统在引导过程中自动载入内核模块。

先决条件

  • 此流程中的命令需要 root 权限。使用 su - 切换到 root 用户,或在命令前使用 sudo
  • 已安装 kmod 软件包。
  • 确定您当前的系统配置不需要您计划拒绝的内核模块。

步骤

  1. 使用 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…
  2. 创建一个配置文件作为 denylist :

    # touch /etc/modprobe.d/denylist.conf
  3. 在您选择的文本编辑器中,使用 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 扩展附加到名称的末尾。内核模块名称没有扩展名,它们对应的文件有。

  4. 在重建前,创建当前初始 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)
  5. 生成一个新的初始 RAM 磁盘镜像以应用更改:

    # dracut -f -v
    • 如果您为与您系统当前使用的内核版本不同的系统构建初始 RAM 磁盘镜像,请指定目标 initramfs 和内核版本:

      # dracut -f -v /boot/initramfs-<TARGET-VERSION>.img <CORRESPONDING-TARGET-KERNEL-VERSION>
  6. 重启系统:

    $ reboot
重要

此流程中描述的更改将在重启后生效并保留。如果您在 denylist 中错误地列出了关键内核模块,您可以将系统切换到不稳定或无法正常工作的状态。

其他资源