CentOS 8 で古いカーネルを削除する方法

この記事には改訂版あり
shobon.hatenablog.com

以上、2022/5/4 追記。


長いので結論を先に。

# dnf remove --oldinstallonly
(最新の世代だけ残す)
 または
# dnf remove $(dnf repoquery --installonly --latest-limit=-2)
(最新の2世代だけ残す)

なぜ上記のようになるかは、以下の通り。

CentOS 7 までは、

# package-cleanup --oldkernels --count=2

などとして古いカーネルを削除できた。

CentOS 8で同じようにやっても、package-cleanup の引数に --oldkernels が無いエラーとなる。

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

CentOS 8では、dnfコマンドのオプションで古いカーネルを削除できる。

dnfコマンドでは、パッケージを検索する repoquery オプションとともに、検索オプションを指定できる。

これを使って、インストール済みカーネルのリストを確認する。

# dnf repoquery --installonly
kernel-0:4.18.0-147.3.1.el8_1.x86_64
kernel-0:4.18.0-147.5.1.el8_1.x86_64
kernel-0:4.18.0-193.6.3.el8_2.x86_64
kernel-core-0:4.18.0-147.3.1.el8_1.x86_64
kernel-core-0:4.18.0-147.5.1.el8_1.x86_64
kernel-core-0:4.18.0-193.6.3.el8_2.x86_64
kernel-modules-0:4.18.0-147.3.1.el8_1.x86_64
kernel-modules-0:4.18.0-147.5.1.el8_1.x86_64
kernel-modules-0:4.18.0-193.6.3.el8_2.x86_64

以下のようにすると、最新の世代だけを残して、古いカーネルを削除できる。

# dnf remove --oldinstallonly

ある世代数を残したければ、repoquery と併せて、--latest-limit オプションを指定する事で、古い世代を取得する事もできる。
書式としては、--latest-limit=世代 のように指定する。

# dnf repoquery --installonly
kernel-0:4.18.0-147.3.1.el8_1.x86_64
kernel-0:4.18.0-147.5.1.el8_1.x86_64
kernel-0:4.18.0-193.6.3.el8_2.x86_64
kernel-core-0:4.18.0-147.3.1.el8_1.x86_64
kernel-core-0:4.18.0-147.5.1.el8_1.x86_64
kernel-core-0:4.18.0-193.6.3.el8_2.x86_64
kernel-modules-0:4.18.0-147.3.1.el8_1.x86_64
kernel-modules-0:4.18.0-147.5.1.el8_1.x86_64
kernel-modules-0:4.18.0-193.6.3.el8_2.x86_64

# dnf repoquery --installonly --latest-limit=1
kernel-0:4.18.0-193.6.3.el8_2.x86_64
kernel-core-0:4.18.0-193.6.3.el8_2.x86_64
kernel-modules-0:4.18.0-193.6.3.el8_2.x86_64
 →最新の世代

# dnf repoquery --installonly --latest-limit=2
kernel-0:4.18.0-147.5.1.el8_1.x86_64
kernel-0:4.18.0-193.6.3.el8_2.x86_64
kernel-core-0:4.18.0-147.5.1.el8_1.x86_64
kernel-core-0:4.18.0-193.6.3.el8_2.x86_64
kernel-modules-0:4.18.0-147.5.1.el8_1.x86_64
kernel-modules-0:4.18.0-193.6.3.el8_2.x86_64
 →最新から2世代

# dnf repoquery --installonly --latest-limit=-1
kernel-0:4.18.0-147.3.1.el8_1.x86_64
kernel-0:4.18.0-147.5.1.el8_1.x86_64
kernel-core-0:4.18.0-147.3.1.el8_1.x86_64
kernel-core-0:4.18.0-147.5.1.el8_1.x86_64
kernel-modules-0:4.18.0-147.3.1.el8_1.x86_64
kernel-modules-0:4.18.0-147.5.1.el8_1.x86_64
 →最新以外の世代

# dnf repoquery --installonly --latest-limit=-2
kernel-0:4.18.0-147.3.1.el8_1.x86_64
kernel-core-0:4.18.0-147.3.1.el8_1.x86_64
kernel-modules-0:4.18.0-147.3.1.el8_1.x86_64
 →最新から2世代以外


これを利用して、冒頭の記載のようにすると、最新から2世代以外を削除できる。