AlmaLinux/RockyLinux 8 で古いカーネルを削除する方法

以前に、次のような記事を書いたが、使えないパターンがあった。

shobon.hatenablog.com

エラーになるパターン

こんな感じにカーネルがインストールされた状態で、最も古いカーネルで起動中。

# rpm -qa | grep kernel | sort
kernel-4.18.0-348.2.1.el8_5.x86_64
kernel-4.18.0-348.20.1.el8_5.x86_64
kernel-4.18.0-348.23.1.el8_5.x86_64
・・・略

# uname -r
4.18.0-348.2.1.el8_5.x86_64

以前のコマンドでは、次のようなエラーになる。

# dnf remove $(dnf repoquery --installonly --latest-limit=-2)
エラー:
 問題: 操作は結果的に以下の保護されたパッケージを削除します: kernel-core
(インストール不可のパッケージをスキップするには、'--skip-broken' を追加してみてください または、'--nobest' を追加して、最適候補のパッケージのみを使用しないでください)

古いカーネルを削除する方法・改良版

代わりに、次のようなコマンドで削除する。

# dnf remove --oldinstallonly --setopt installonly_limit=2 kernel
依存関係が解決しました。
===========================================================================================
 パッケージ          アーキテクチャー    バージョン                リポジトリー    サイズ
===========================================================================================
削除中:
 kernel              x86_64              4.18.0-348.20.1.el8_5     @baseos         0
 kernel-core         x86_64              4.18.0-348.20.1.el8_5     @baseos         68 M
 kernel-modules      x86_64              4.18.0-348.20.1.el8_5     @baseos         22 M

トランザクションの概要
===========================================================================================
削除  3 パッケージ

解放された容量: 90 M
これでよろしいですか? [y/N]: 


これならエラーは出ない。
削除対象になるのは、起動中を除いた最も古いカーネルからカウントして決定される。

指定されたdnfのオプションの意味は以下の通り。

  • remove --oldinstallonly:古いinstallonlyパッケージを削除
  • --setopt:/etc/dnf/dnf.confのデフォルト値を変更(installonly_limitの値を2にした)