在RHEL/CentOS 8中更新内核

时间:2020-02-23 14:40:21  来源:igfitidea点击:

在本教程中,我们将学习RHEL/CentOS 8中引入的新内核程序包,即内核核心和内核模块。
我还将分享一些最佳实践的技巧,这些技巧对于更新内核(尤其是在生产环境中)必须遵循。

什么是内核核心和内核模块rpm

  • RPM是一个元软件包,它不包含任何文件,而是确保正确安装以下子软件包:

  • kernel-core包含核心功能所需的最少内核模块,这些功能被认为是系统启动所必需的。

  • kernel-modules-包含更多的内核模块,这些模块通常可以在旧版RHEL的内核软件包中找到。

  • kernel-modules-extra-包含用于稀有硬件的内核模块,这些模块用于更晦涩的硬件和较少使用的网络调度策略和算法。

我们应该安装内核还是内核

  • 内核元软件包提供了通过rpm和dnf与内核软件包交互的向后兼容方法。

  • 因此,在RHEL/CentOS 8中,内核软件包不包含任何文件,但是向后兼容是必需的

  • 因此建议在环境中安装kernel软件包。

内核rpm的内容

我们将查询kernelrpm的内容:

# 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的处理,但是现在我们必须注意kernelkernel-corekernel-modules

  • 我们不应该将rpm和-U一起使用来更新所提到的内核rpm。

  • 由于rpm -U不够智能,无法区分普通软件包和内核内核rpm,因此它将内核与其他任何rpm一样对待,并在安装较新的软件包后删除较旧的软件包

  • 现在从技术上讲这不是问题,但是我们会丢失备份。
    假设我们进行了重新启动,并且Linux服务器由于内核升级而损坏,那么现在我们没有任何备份内核可以启动系统了。

  • 因此,"总是总是"确保(是写入2次)确保始终使用rpm命令安装"内核","内核核心"和"内核模块"软件包(而不更新)。

  • 尽管我们可以使用dnf或者yum通过yum update &lt;rpm>或者dnf update &lt;rpm>更新内核rpm。

  • YUM和DNF足够聪明,可以处理内核更新,并且无论我们给我什么命令,它们都会始终执行kernelkernel-corekernel-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-corekernel-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-corekernel-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一样,它可能会删除更多数量的从属软件包。

因此,仅删除旧版本内核的kernelkernel-corekernel-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。