在RHEL/CentOS 8中更新内核
在本教程中,我们将学习RHEL/CentOS 8中引入的新内核程序包,即内核核心和内核模块。
我还将分享一些最佳实践的技巧,这些技巧对于更新内核(尤其是在生产环境中)必须遵循。
什么是内核核心和内核模块rpm
RPM是一个元软件包,它不包含任何文件,而是确保正确安装以下子软件包:
kernel-core
包含核心功能所需的最少内核模块,这些功能被认为是系统启动所必需的。kernel-modules
-包含更多的内核模块,这些模块通常可以在旧版RHEL的内核软件包中找到。kernel-modules-extra
-包含用于稀有硬件的内核模块,这些模块用于更晦涩的硬件和较少使用的网络调度策略和算法。
我们应该安装内核还是内核
内核元软件包提供了通过rpm和dnf与内核软件包交互的向后兼容方法。
因此,在RHEL/CentOS 8中,内核软件包不包含任何文件,但是向后兼容是必需的
因此建议在环境中安装
kernel
软件包。
内核rpm的内容
我们将查询kernel
rpm的内容:
# rpm -ql kernel-4.18.0-193.14.2.el8_2.x86_64 (contains no files)
如我们所见,它会打印相同的消息,即它不包含任何带有RHEL/CentOS 8的文件
内核转数的内容
要列出kernel-core
的内容,我们将使用类似的命令:
# rpm -ql kernel-core | more /boot/.vmlinuz-4.18.0-193.el8.x86_64.hmac /boot/System.map-4.18.0-193.el8.x86_64 /boot/config-4.18.0-193.el8.x86_64 /boot/initramfs-4.18.0-193.el8.x86_64.img /boot/symvers-4.18.0-193.el8.x86_64.gz <output trimmed>
如我们所见,此rpm包含内核软件包和模块,它们是内核rpm的较早部分。
内核模块rpm的内容
要列出kernel-modules rpm的所有模块,可以使用:
# rpm -ql kernel-modules | grep .xz$ /lib/modules/4.18.0-193.el8.x86_64/kernel/drivers/bcma/bcma.ko.xz /lib/modules/4.18.0-193.el8.x86_64/kernel/drivers/bluetooth/ath3k.ko.xz /lib/modules/4.18.0-193.el8.x86_64/kernel/drivers/bluetooth/bcm203x.ko.xz /lib/modules/4.18.0-193.el8.x86_64/kernel/drivers/bluetooth/bfusb.ko.xz /lib/modules/4.18.0-193.el8.x86_64/kernel/drivers/bluetooth/bpa10x.ko.xz <output trimmed>
我们可以在此命令中进一步使用grep来grep查找我们在内核模块rpm中寻找的确切模块
我需要哪些内核软件包
对于常规的裸机安装,将安装所有三个子软件包rpm,即" kernel-core"," kernel-modules"," kernel-modules-extra"。
在云供应商的VM上:仅需要安装"内核"。
更新内核,内核核心和内核模块的最佳实践
使用RHEL/CentOS 7,我们只关心内核rpm的处理,但是现在我们必须注意
kernel
,kernel-core
和kernel-modules
。我们不应该将rpm和-U一起使用来更新所提到的内核rpm。
由于rpm -U不够智能,无法区分普通软件包和内核内核rpm,因此它将内核与其他任何rpm一样对待,并在安装较新的软件包后删除较旧的软件包
现在从技术上讲这不是问题,但是我们会丢失备份。
假设我们进行了重新启动,并且Linux服务器由于内核升级而损坏,那么现在我们没有任何备份内核可以启动系统了。因此,"总是总是"确保(是写入2次)确保始终使用rpm命令安装"内核","内核核心"和"内核模块"软件包(而不更新)。
尽管我们可以使用
dnf
或者yum
通过yum update <rpm>
或者dnf update <rpm>
更新内核rpm。YUM和DNF足够聪明,可以处理内核更新,并且无论我们给我什么命令,它们都会始终执行
kernel
,kernel-core
和kernel-modules
的安装。因此,在生产环境中,更新内核时始终选择使用YUM或者DNF。
如果我们没有可用于YUM或者DNF的存储库,则可以注册RHEL服务器或者配置脱机存储库。
更新内核,内核核心和内核模块
我正在本教程中使用RHEL 8.1,该教程已在Red Hat Network中注册,但是我已经在CentOS 8上验证了相同的步骤,因此我们可以在任一节点上使用这些步骤。
# cat /etc/redhat-release Red Hat Enterprise Linux release 8.1 (Ootpa)
列出可用的升级内核
如果我们已经下载了内核rpm,则可以将其放置在目录中并创建离线存储库。
由于我的Linux服务器已在RHN中注册,因此我将自动获得这些更新。
列出存储库中所有可用的内核rpm
# dnf --showduplicates list kernel | expand Updating Subscription Management repositories. Last metadata expiration check: 0:00:37 ago on Sat 15 Aug 2017 02:52:02 PM IST. Installed Packages kernel.x86_64 4.18.0-147.el8 @anaconda Available Packages kernel.x86_64 4.18.0-80.el8 rhel-8-for-x86_64-baseos-rpms kernel.x86_64 4.18.0-80.1.2.el8_0 rhel-8-for-x86_64-baseos-rpms kernel.x86_64 4.18.0-80.4.2.el8_0 rhel-8-for-x86_64-baseos-rpms <output_trimmed> kernel.x86_64 4.18.0-193.6.3.el8_2 rhel-8-for-x86_64-baseos-rpms kernel.x86_64 4.18.0-193.13.2.el8_2 rhel-8-for-x86_64-baseos-rpms kernel.x86_64 4.18.0-193.14.3.el8_2 rhel-8-for-x86_64-baseos-rpms
同样,我们可以获取其他内核rpm的列表,即kernel-core
和kernel-modules
。
提示:
内核,内核核心,内核模块rpm的版本和发行版号将相同。
因此,我们为内核选择的任何版本,例如yum
或者dnf
都会自动选择依赖项内核rpms并进行安装。
当前在我的服务器上,安装了内核rpm列表以下
# rpm -qa | grep kernel kernel-core-4.18.0-147.el8.x86_64 kernel-modules-4.18.0-147.el8.x86_64 kernel-4.18.0-147.el8.x86_64 kernel-tools-libs-4.18.0-147.el8.x86_64 kernel-tools-4.18.0-147.el8.x86_64
更新内核,内核,内核模块和其他相关程序包
现在,我们将服务器上的内核更新为" 4.18.0-193.el8"版本。
由于我们计划将内核更新为特定版本,因此我还将提供版本号。
但是,如果我们打算将内核更新为最新的可用版本,则无需提供版本详细信息。
# dnf install kernel-4.18.0-193.el8 Updating Subscription Management repositories. Last metadata expiration check: 0:03:28 ago on Sat 15 Aug 2017 03:05:23 PM IST. Dependencies resolved. ====================================================================================================================== Package Architecture Version Repository Size ====================================================================================================================== Installing: kernel x86_64 4.18.0-193.el8 rhel-8-for-x86_64-baseos-rpms 2.8 M Upgrading: kexec-tools x86_64 2.0.20-14.el8 rhel-8-for-x86_64-baseos-rpms 485 k linux-firmware noarch 20191202-97.gite8a0f4c9.el8 rhel-8-for-x86_64-baseos-rpms 72 M Installing dependencies: kernel-modules x86_64 4.18.0-193.el8 rhel-8-for-x86_64-baseos-rpms 23 M kernel-core x86_64 4.18.0-193.el8 rhel-8-for-x86_64-baseos-rpms 28 M <output trimmed> Upgraded: kexec-tools-2.0.20-14.el8.x86_64 linux-firmware-20191202-97.gite8a0f4c9.el8.noarch Installed: kernel-4.18.0-193.el8.x86_64 kernel-modules-4.18.0-193.el8.x86_64 kernel-core-4.18.0-193.el8.x86_64 Complete!
所以其中我刚刚给了dnf install kernel
,dnf已经确定了相关的rpms,即kernel-core
和kernel-modules
并且还安装了它们。
如果我们注意到,则在升级某些从属软件包时会安装内核rpm
这是我之前用rpm -U和DNF/YUM强调的区别。
现在,我们可以列出此更新之后的可用内核
# rpm -qa | grep kernel | sort kernel-4.18.0-147.el8.x86_64 kernel-4.18.0-193.el8.x86_64 kernel-core-4.18.0-147.el8.x86_64 kernel-core-4.18.0-193.el8.x86_64 kernel-modules-4.18.0-147.el8.x86_64 kernel-modules-4.18.0-193.el8.x86_64 kernel-tools-4.18.0-147.el8.x86_64 kernel-tools-libs-4.18.0-147.el8.x86_64
现在我更新了内核,内核核心和内核模块,但是内核工具和内核工具库仍旧版本。
如果我们还有其他内核rpm,则建议所有内核rpm具有相同的版本级别
更新内核工具和内核工具库(可选)
因此,我们将手动更新其余的内核软件包。
我其中只提到了kernel-tools
,因为我知道kernel-tools-libs
是一个依赖包,它将由DNF自动选择。
# dnf update kernel-tools-4.18.0-193.el8 Updating Subscription Management repositories. Last metadata expiration check: 0:11:19 ago on Sat 15 Aug 2017 03:05:23 PM IST. Dependencies resolved. ====================================================================================================================== Package Architecture Version Repository Size ====================================================================================================================== Upgrading: kernel-tools-libs x86_64 4.18.0-193.el8 rhel-8-for-x86_64-baseos-rpms 2.8 M kernel-tools x86_64 4.18.0-193.el8 rhel-8-for-x86_64-baseos-rpms 2.9 M <output trimmed> Upgraded: kernel-tools-libs-4.18.0-193.el8.x86_64 kernel-tools-4.18.0-193.el8.x86_64 Complete!
注意其中我使用的是dnf update <rpm>而不是install的动作。
这是因为,我们只需要对核心内核软件包执行"安装"操作。
即使我其中使用"安装",软件包也将被"升级",所以没关系
验证已安装的内核软件包的列表
# rpm -qa | grep kernel | sort kernel-4.18.0-147.el8.x86_64 kernel-4.18.0-193.el8.x86_64 kernel-core-4.18.0-147.el8.x86_64 kernel-core-4.18.0-193.el8.x86_64 kernel-modules-4.18.0-147.el8.x86_64 kernel-modules-4.18.0-193.el8.x86_64 kernel-tools-4.18.0-193.el8.x86_64 kernel-tools-libs-4.18.0-193.el8.x86_64
因此,现在我们所有的内核软件包都位于4.18.0-193.el8
中,其中一些与4.18.0-147.el8
相同,但是一旦知道服务器正常运行,我们将删除它们。
检查默认内核版本
现在,由于我们已经更新了内核的rpm,因此默认情况下,新的内核将配置为在重启后被激活。
要验证这一点,请首先检查当前活动的内核
# uname -r 4.18.0-147.el8.x86_64
所以目前4.18.0-147.el8
是活动的。
接下来检查重启后将被激活的内核版本
# grubby --grub2 --default-title Red Hat Enterprise Linux (4.18.0-193.el8.x86_64) 8.2 (Ootpa) # grubby --default-kernel /boot/vmlinuz-4.18.0-193.el8.x86_64
在RHEL/CentOS 8中使用grubby,我们可以了解重启后将被激活的内核。
我将撰写有关grubby用法的单独文章,以及有关在RHEL/CentOS 8中在不同内核版本之间进行切换的更多信息。
现在,由于我们知道新的内核配置已正确设置为可以激活,因此让我们"重新启动服务器"。
重新启动后,重新验证默认和活动内核版本。
一旦节点正常运行,我们就可以验证应用程序功能(如果有),如果一切正常,我们就可以安全地删除旧内核。
删除旧的内核和内核核心rpm
我更喜欢使用DNF和YUM来安装内核rpm,但是对于删除而言,我更喜欢使用rpm命令来控制要删除的rpm列表,就像使用DNF和YUM一样,它可能会删除更多数量的从属软件包。
因此,仅删除旧版本内核的kernel
,kernel-core
和kernel-modules
# rpm -e kernel-4.18.0-147.el8.x86_64 kernel-core-4.18.0-147.el8.x86_64 kernel-modules-4.18.0-147.el8.x86_64
列出可用的内核版本
# rpm -qa | grep kernel | sort kernel-4.18.0-193.el8.x86_64 kernel-core-4.18.0-193.el8.x86_64 kernel-modules-4.18.0-193.el8.x86_64 kernel-tools-4.18.0-193.el8.x86_64 kernel-tools-libs-4.18.0-193.el8.x86_64
现在我们的服务器上不再有旧的内核rpm。