附录 E. 防止内核模块自动载入

您可以防止自动加载内核模块,无论是直接加载模块,还是在引导过程中作为依赖项载入。

流程

  1. 模块名称必须添加到 modprobe 实用程序的配置文件中。此文件必须位于配置目录 /etc/modprobe.d 中。

    有关此配置目录的更多信息,请参阅 man page modprobe.d

  2. 确保该模块没有配置为在以下任意位置载入:

    • /etc/modprobe.conf
    • /etc/modprobe.d/*
    • /etc/rc.modules
    • /etc/sysconfig/modules/*
    # modprobe --showconfig <_configuration_file_name_>
  3. 如果模块出现在输出中,请确保它被忽略且没有加载:

    # modprobe --ignore-install <_module_name_>
  4. 如果载入了正在运行的系统,从正在运行的系统中卸载该模块:

    # modprobe -r <_module_name_>
  5. 通过将 blacklist 行添加到系统专用的配置文件(如 /etc/modprobe.d/local-dontload.conf )来防止直接加载模块:

    # echo "blacklist <_module_name_> >> /etc/modprobe.d/local-dontload.conf
    注意

    如果模块是另一个模块的必需依赖项或可选依赖项,则此步骤不会阻止模块加载。

  6. 防止根据需要载入可选模块:

    # echo "install <_module_name_>/bin/false" >> /etc/modprobe.d/local-dontload.conf
    重要

    如果其他硬件需要排除的模块,则排除该模块可能会导致意外的副作用。

  7. 生成 initramfs 的备份副本:

    # cp /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.$(date +%m-%d-%H%M%S).bak
  8. 如果内核模块是 initramfs 的一部分,重建初始 ramdisk 镜像,省略该模块:

    # dracut --omit-drivers <_module_name_> -f
  9. 获取当前的内核命令行参数:

    # grub2-editenv - list | grep kernelopts
  10. <_module_name_>.blacklist=1 rd.driver.blacklist=<_module_name_> 附加到生成的输出中:

    # grub2-editenv - set kernelopts="<> <_module_name_>.blacklist=1 rd.driver.blacklist=<_module_name_>"

    例如:

    # grub2-editenv - set kernelopts="root=/dev/mapper/rhel_example-root ro crashkernel=auto resume=/dev/mapper/rhel_example-swap rd.lvm.lv=rhel_example/root rd.lvm.lv=rhel_example/swap <_module_name_>.blacklist=1 rd.driver.blacklist=<_module_name_>"
  11. 生成 kdump initramfs 的备份副本:

    # cp /boot/initramfs-$(uname -r)kdump.img /boot/initramfs-$(uname -r)kdump.img.$(date +%m-%d-%H%M%S).bak
  12. rd.driver.blacklist=<_module_name_> 附加到 /etc/sysconfig/kdump 文件中的 KDUMP_COMMANDLINE_APPEND 设置中,以从 kdump initramfs 中忽略它:

    # sed -i '/^KDUMP_COMMANDLINE_APPEND=/s/"$/ rd.driver.blacklist=module_name"/' /etc/sysconfig/kdump
  13. 重启 kdump 服务以获取对 kdump initrd 的更改:

      # kdumpctl restart
  14. 重建 kdump 初始 ramdisk 镜像:

      # mkdumprd -f /boot/initramfs-$(uname -r)kdump.img
  15. 重启系统:

E.1. 临时删除模块

您可以临时删除模块。

流程

  1. 运行 modprobe 以删除任何当前加载的模块:

    # modprobe -r <module name>
  2. 如果模块无法卸载,则进程或其他模块可能仍在使用该模块。如果是,终止进程并运行在其他时间上写入的 modpole 命令以卸载该模块。