如何正确删除旧内核RHEL/CentOS 8
在早期的RHEL/CentOS发行版中,我们使用package-cleanup删除了旧的内核软件包。
但是在RHEL/CentOS 8的最新发行版中," package-cleanup"不能用于删除旧内核。
现在,我们有installonly_limit
和oldinstallonly
用于此目的。
在本教程中,我们将使用不同的示例来分析此选项。
删除旧内核的最佳实践
在删除内核之前,请始终检查当前处于活动状态的内核以及在重启后将被激活的内核,以确保我们不会删除错误的内核。
建议当前活动的内核和重新启动后要激活的内核版本都应该相同。
虽然这不是严格的依赖关系,但应视情况而定在未指定内核版本的情况下,切勿使用YUM或者DNF删除旧的内核软件包。
我们始终需要在服务器上至少安装一个内核软件包,而yum/dnf如果未指定版本,则可能会删除所有已安装的内核。我们可以使用rpm -e <kernel-version>来删除内核,但是必须确保我们也删除了映射依赖项。
对于每个用户而言,这可能很难检查,因此我们可以使用yum remove kernel- <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软件包",在我们的例子中是活动内核。
因此,请务必先检查活动的内核,然后再尝试删除旧的内核