在CentOS RHEL 7中将内核模块列入黑名单的5个简单步骤

时间:2020-01-09 10:38:11  来源:igfitidea点击:

在本文中,我将分享禁用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 &lt;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中的任何其他内核模块。