在CentOS RHEL 7中将内核模块列入黑名单的5个简单步骤
在本文中,我将分享禁用RHEL/CentOS 7和8 Linux中的内核模块以及将内核模块列入黑名单的步骤。
我们可以使用modprobe -r <module_name>禁用内核模块运行时,并且可以使用/etc/modprobe.d/local-blacklist.conf
来将内核模块列入黑名单。
我们将详细分析将内核模块列入黑名单的两个选项,在本示例中,我们将从RHEL/CentOS 7和8 Linux节点中将btrfs模块列入黑名单。
检查模块是否已加载到内核中
在选择将内核模块列入黑名单之前,请检查内核中是否已加载相应的模块。
我们可以使用lsmod
列出所有已加载的模块,并尝试grep作为模块名称。
# lsmod | grep -i btrfs btrfs 1074009 0 raid6_pq 102527 1 btrfs xor 21411 1 btrfs
重要的提示:
知道要列入黑名单的确切模块名称非常重要,否则卸载内核模块将失败。
另外,我们也可以使用modinfo
来查询内核模块
# modinfo btrfs filename: /lib/modules/3.10.0-1127.el7.x86_64/kernel/fs/btrfs/btrfs.ko.xz
就我而言,btrfs
模块已加载,我也可以使用/var/log/messages
进行验证
Apr 21 11:34:18 Ban17-adm01-a kernel: Btrfs loaded, crc32c=crc32c-intel
提示:
也可能会出现" modinfo:错误:未找到模块{module_name}"的信息,这意味着该模块当前未加载到内核中。
无论哪种方式,我们的目标都是将内核模块列入黑名单,以确保内核未加载相应的模块。
:禁用内核模块运行时间
要卸载内核模块运行时,我们可以使用modprobe --remove <module_name>
。
# modprobe --remove -v btrfs rmmod btrfs rmmod xor rmmod raid6_pq
在这个例子中,modprobe具有卸载btrfs和所有依赖模块。
但这将仅对当前会话禁用内核模块,"重启后,btrfs可能会再次加载"。
第2步:将黑名单内核模块
在黑名单内核模块" btrfs"旁边,我们将在" /etc/modprobe.d/"下创建一个新文件" btrfs-blacklist.conf"。
# echo "blacklist btrfs" >> /etc/modprobe.d/btrfs-blacklist.conf # echo "install btrfs /bin/false" >> /etc/modprobe.d/btrfs-blacklist.conf
黑名单文件的名称并不重要,我们可以根据需要使用任何名称。
安装行仅导致运行/bin/false而不是安装模块。
该更改将在下次尝试加载模块时生效。
(此阶段不需要重新引导节点)如果将其他特定硬件所需的模块列入黑名单,则可能会有意外的副作用。
以下是我的btrfs-blacklist.conf
的内容
# cat /etc/modprobe.d/btrfs-blacklist.conf blacklist btrfs install btrfs /bin/false
这些步骤在大多数情况下都可以在Linux中将内核模块列入黑名单,但是在某些情况下,"某些内核模块仍会尝试按需加载可选模块"。
因此,我们必须将内核模块适当地列入黑名单以进行永久更改,以使该模块即使在某些依赖时也不会被加载
:取得initramfs的备份副本
建议(但不是强制性的)为initramfs
创建备份。
因此,如果发生故障,我们可以使用initramfs备份进行后备。
另请阅读:
在RHEL/CentOS 7和8 Linux中提取,修改和重建initramfs的步骤
# cp /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.$(date +%m-%d-%H%M%S).bak
:重建initramfs
接下来,我们必须省略相应的内核模块并重新构建initramfs
。
# dracut --omit-drivers btrfs -f
我们也可以使用dracut --omit-drivers" module1 module2 module3" -f
在同一命令中提供驱动程序列表。
如果要输出详细信息,则还可以在上面的命令中添加-v
:将GRUB2更新到黑名单内核模块
为了正确地将内核模块列入黑名单,我们还必须通知dracut和GRUB2. 在Red Hat/CentOS 7和8 Linux之间,更新GRUB2的步骤有所不同。
根据环境遵循相应的章节:
在RHEL/CentOS 7中使用GRUB2禁用内核模块
接下来,我们还必须更新GRUB2配置,以确保在启动阶段未加载内核模块。
我们可以使用任何编辑器手动更新/etc/sysconfig/grub
,如下所示。
[root@centos-7 ~]# grep GRUB_CMDLINE_LINUX /etc/sysconfig/grub GRUB_CMDLINE_LINUX="novga console=ttyS0,115200 rhgb quiet console=tty0 rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap btrfs.blacklist=1 rd.driver.blacklist=btrfs"
将<module_name> .blacklist添加到内核cmdline。
我们给它一个无效的黑名单参数,并将其设置为" 1",以防止内核加载它。
其中我们还设置了rd.driver.blacklist作为阻止其加载的另一种方法。
另外,我们也可以使用下面的" sed"命令在" grub"文件中添加内核模块。
[root@centos-7 ~]# sed -i '/^GRUB_CMDLINE_LINUX=/s/"$/<module_name>.blacklist=1 rd.driver.blacklist=<module_name>"/' /etc/sysconfig/grub
重建GRUB2配置文件
[root@centos-7 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg Generating grub configuration file ... Found linux image: /boot/vmlinuz-3.10.0-1127.el7.x86_64 Found initrd image: /boot/initramfs-3.10.0-1127.el7.x86_64.img Found linux image: /boot/vmlinuz-0-rescue-be97378b9f97461eb4c8d8cbbe36d1ba Found initrd image: /boot/initramfs-0-rescue-be97378b9f97461eb4c8d8cbbe36d1ba.img done
提示:
如果系统使用UEFI,则必须将路径更改为/boot/efi/EFI/redhat/grub.cfg
。
在RHEL/CentOS 8中使用GRUB2禁用内核模块
与RHEL/CentOS 7相比,在RHEL/CentOS 8中更新GRUB2的过程不同。
我写了另一篇文章,其中介绍了使用3种不同的工具在RHEL 8中更新GRUB2的步骤。
在这个例子中,我将使用grub2-mkconfig
更新GRUB2. 将 <module_name> .blacklist = 1
和rd.driver.blacklist = <module_name>添加到
/etc/sysconfig/grub中的
GRUB_CMDLINE_LINUX`上
接下来列出" kernelopts"的现有值
[root@centos-8 ~]# grub2-editenv - list | grep kernelopts kernelopts=root=/dev/mapper/rhel-root ro crashkernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet
接下来,取消设置" kernelopts"的现有值
[root@centos-8 ~]# grub2-editenv - unset kernelopts
重建GRUB2配置文件
[root@centos-8 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg Generating grub configuration file ... done
验证kernelopts
的更新列表
[root@centos-8 ~]# grub2-editenv - list | grep kernelopts kernelopts=root=/dev/mapper/rhel-root ro crashkernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet btrfs.blacklist=1 rd.driver.blacklist=btrfs
下一步,重新启动Linux服务器以激活更改。
验证更改
重新启动后检查模块是否仍在加载
# lsmod | grep -i btrfs
grepped为各个模块时,我们应该为lsmod获得一个空白输出。
尝试使用modprobe
调用内核模块
# modprobe btrfs modprobe: ERROR: Error running install command for raid6_pq modprobe: ERROR: could not insert 'btrfs': Operation not permitted
正如我们现在所预期的那样,在禁用内核模块btrfs
之后,不允许modprobe
运行或者安装该模块。
我们可以使用此方法禁用Linux中的任何其他内核模块。