如何正确删除旧内核RHEL/CentOS 8

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

在早期的RHEL/CentOS发行版中,我们使用package-cleanup删除了旧的内核软件包。
但是在RHEL/CentOS 8的最新发行版中," package-cleanup"不能用于删除旧内核。
现在,我们有installonly_limitoldinstallonly用于此目的。
在本教程中,我们将使用不同的示例来分析此选项。

删除旧内核的最佳实践

  • 在删除内核之前,请始终检查当前处于活动状态的内核以及在重启后将被激活的内核,以确保我们不会删除错误的内核。

  • 建议当前活动的内核和重新启动后要激活的内核版本都应该相同。
    虽然这不是严格的依赖关系,但应视情况而定

  • 在未指定内核版本的情况下,切勿使用YUM或者DNF删除旧的内核软件包。
    我们始终需要在服务器上至少安装一个内核软件包,而yum/dnf如果未指定版本,则可能会删除所有已安装的内核。

  • 我们可以使用rpm -e <kernel-version>来删除内核,但是必须确保我们也删除了映射依赖项。
    对于每个用户而言,这可能很难检查,因此我们可以使用yum remove kernel- &lt;version>来删除特定版本的内核及其所有依赖项

  • 始终建议在安装程序上至少安装两个内核,以在生产环境中提供后备支持。

软件包清理不适用于CentOS/RHEL 8

随着RHEL/CentOS 8的引入,package-cleanup已被修改,不能再用于删除旧内核。
我们可以从RHEL/CentOS 8和更早版本的手册页中查看支持的参数列表中的差异。

现在我们收到此消息

# package-cleanup --oldkernels --count=2
package-cleanup has to be executed with one of the options: --dupes, --leaves, --orphans, --problems or --cleandupes

结合使用installonly_limit和oldinstallonly

现在我们可以将dnf与installonly_limit和--oldinstallonly一起使用,以删除旧的内核rpm并定义已安装的内核rpm的列表。
按照dnf.conf的手册页

  • installonly_limit:允许同时安装的installonly软件包的数量。
    默认值为3. 最小的installonly软件包为2. 值0或者1表示无限数量的installonly软件包。

  • oldinstallonly:删除旧的installonly软件包,仅保留installonly_limit最新版本。

默认情况下,在/etc/dnf/dnf.conf中将installonly_limit设置为3.

# grep limit /etc/dnf/dnf.conf
installonly_limit=3

因此,如果我们尝试安装3个以上的内核软件包,"最旧的软件包将被自动删除"。

使用dnf删除旧内核

示例1:最新内核处于活动状态时

现在,让我向我们展示一些有关使用dnf自动删除旧内核软件包的案例研究。
为了演示,我安装了4个内核(通过修改dnf.conf中的installonly_limit)

目前,在此阶段,我的Linux服务器正在使用最新的内核版本运行

# uname -r
4.18.0-193.13.2.el8_2.x86_64

在此命令中,我们保留系统上安装的最后2个内核,并删除剩余的旧内核。
我已经使用--setopt明确定义了installonly_limit = 2来覆盖/etc/dnf/dnf.conf中的默认值。
如果我们不提供此选项,则默认情况下dnf将考虑dnf.conf中的installonly_limit值。

# dnf remove --oldinstallonly --setopt installonly_limit=2 kernel

以下是我的服务器中的代码段:

如我们所见,此命令已"开始删除2个旧内核",该内核按预期工作

示例2:旧内核处于活动状态时

现在,在这种情况下,我将活动内核版本切换到了较旧的版本

# grubby --set-default "/boot/vmlinuz-4.18.0-147.5.1.el8_1.x86_64"
The default is /boot/loader/entries/d88fa2c7ff574ae782ec8c4288de4e85-4.18.0-147.5.1.el8_1.x86_64.conf with index 2 and kernel /boot/vmlinuz-4.18.0-147.5.1.el8_1.x86_64

下一步,重新引导服务器并检查活动的内核版本

# uname -r
4.18.0-147.5.1.el8_1.x86_64

可用内核列表:

因此,即使我安装了193.3.2版本,我的活动内核也较旧,即5.1

现在,在这个阶段,如果我使用相同的命令删除较旧的内核

# dnf remove --oldinstallonly --setopt installonly_limit=2 kernel
Updating Subscription Management repositories.
Error:
 Problem: The operation would result in removing the following protected packages: kernel-core
(try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)

该命令失败,因为它假定以下内核版本是最新的

kernel-4.18.0-147.8.1.el8_1.x86_64
kernel-4.18.0-193.13.2.el8_2.x86_64

所以它试图删除

kernel-4.18.0-147.5.1.el8_1.x86_64
kernel-4.18.0-147.el8.x86_64

但是然后kernel-4.18.0-147.5.1.el8_1.x86_64是活动内核。

现在我不确定这是设计使然还是错误的。
希望它应该是设计使然,因为手册页上清楚地写着:"删除旧的installonly软件包",在我们的例子中是活动内核。

因此,请务必先检查活动的内核,然后再尝试删除旧的内核