はじめに (対象読者・この記事でわかること)

本記事は、Arch Linux を日常的に使用している中級者以上のユーザーを対象としています。特に、頻繁にカーネルをアップデートした結果、不要になった古いカーネルが GRUB の起動メニューに残り、選択肢が増えてしまう状況に悩んでいる方に最適です。この記事を読むことで、以下ができるようになります。

  • pacman でカーネルを削除した後に残る GRUB エントリを安全に除去する手順
  • /etc/grub.d//etc/mkinitcpio.conf の関係を理解し、手動でエントリを生成しない方法
  • 削除作業を自動化するスクリプトの作成例と、システムアップデート時の注意点

背景として、Arch Wiki でも「古いカーネルが残る」問題は触れられていますが、具体的な手順が散在しているため、体系的にまとめました。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。

  • Arch Linux の基本的なインストールと pacman によるパッケージ管理
  • GRUB の設定ファイル (/etc/default/grub, /etc/grub.d/) の構造
  • mkinitcpio の役割と設定ファイル (/etc/mkinitcpio.conf) の基本的な書式

GRUB エントリが残る仕組みと削除の方針

Arch Linux では、カーネルパッケージ(例: linux, linux-lts)がインストールまたは削除されるたびに、/etc/grub.d/30_os-prober10_linux スクリプトが自動的に GRUB メニュー用のエントリを生成します。pacman -Rns でカーネルをアンインストールしても、/boot/grub/grub.cfg に残ったエントリは手動で削除しなければ画面に表示されたままです。

なぜ手動削除だけでは不十分か

  • パッケージ削除時に自動的に grub-mkconfig が走らない(linux パッケージは post_remove フックで実行しない設定がある)
  • 10_linux スクリプトは /boot/vmlinuz-* の実体が存在すればエントリを生成するため、残っている古いカーネルのイメージファイルが削除されていなければ再生成される

したがって、以下の二段階アプローチ が推奨されます。

  1. 残っている古いカーネルイメージとヘッダーパッケージを完全に削除
  2. GRUB 設定を再生成し、不要エントリを除外する設定を追加

具体的な手順と実装方法

以下では、実際にコマンドを入力しながら手順を追っていきます。途中で実行例や注意点も併記します。

ステップ 1 – 現在インストール済みカーネルと GRUB エントリの確認

Bash
# インストール済みカーネルパッケージの一覧 pacman -Qs '^linux' # /boot ディレクトリに残っているカーネルイメージ ls -l /boot/vmlinuz-* # 現在の GRUB メニューを一度テキストで出力して確認 grep -E "menuentry|linux" /boot/grub/grub.cfg
  • pacman -Qs '^linux'linux, linux-lts, linux-zen などのパッケージが残っているか確認
  • ls -l /boot/vmlinuz-* で実際に残っているイメージファイルを把握
  • grep による grub.cfg の検索で、メニューに何が表示されているか可視化

ステップ 2 – アンインストール済みカーネルの残骸を完全に削除

例として、linux パッケージの古いバージョン 5.15.97.arch1-1 が残っているケースを考えます。

Bash
# パッケージ名だけで削除 sudo pacman -Rns linux-5.15.97.arch1-1 # 古いイメージファイルが残っていれば手動で削除 sudo rm /boot/vmlinuz-5.15.97-arch1 sudo rm /boot/initramfs-5.15.97-arch1.img

ポイント:

  • -Rns オプションで依存関係と設定ファイルも一緒に削除
  • 手動で /boot 以下の残骸を削除しないと、10_linux が再度検出してエントリが復活します

ステップ 3 – GRUB 設定に除外ルールを追加

10_linux スクリプトは GRUB_DISABLE_RECOVERY="true" などの環境変数で制御できますが、特定バージョンを除外したい場合は GRUB_DISABLE_OS_PROBER="true" と併せて、/etc/grub.d/40_custom に手動でエントリを作成し、10_linux の自動生成部分を無効化する方法が有効です。

3‑1. 自動生成をスキップ

Bash
# 10_linux の実行権限を外す(自動生成を無効化) sudo chmod -x /etc/grub.d/10_linux

※ ただし、他のカーネルも自分でエントリを作成する必要があります。

3‑2. 手動エントリを作成

/etc/grub.d/40_custom に以下を追記します(例: linux-lts のみを表示)。

Bash
#!/bin/sh exec tail -n +3 $0 # Custom GRUB entries for Arch Linux menuentry "Arch Linux (Linux LTS)" { insmod part_gpt insmod ext2 set root='hd0,gpt2' # 実際のパーティションに合わせて変更 linux /boot/vmlinuz-linux-lts root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx rw initrd /boot/initramfs-linux-lts.img }
  • exec tail -n +3 $0 はスクリプトヘッダーを無視するための標準的な書き方です
  • set root 部分は lsblk -f で確認したルートパーティションの UUID に合わせて変更

3‑3. GRUB 設定の再生成

Bash
sudo grub-mkconfig -o /boot/grub/grub.cfg

このコマンドにより、10_linux が無効化されている分、40_custom のエントリだけが反映されます。

ステップ 4 – 自動化スクリプトの作成(オプション)

手動で除外設定を行うのは手間がかかります。以下は、pacman -Rns 後に自動的に残骸を削除し、grub.cfg を再生成する簡易スクリプトです。

Bash
#!/usr/bin/env bash # remove-old-kernel.sh set -e # 引数で削除したいカーネルパッケージ名(例: linux, linux-lts) PKG=$1 if [[ -z "$PKG" ]]; then echo "Usage: $0 <kernel-package>" exit 1 fi echo "Removing $PKG and related files..." sudo pacman -Rns "$PKG" # 残っているイメージファイルを削除 for img in /boot/vmlinuz-* /boot/initramfs-*.img; do if [[ $img == *"$PKG"* ]]; then echo "Deleting $img" sudo rm -f "$img" fi done # GRUB 設定再生成 echo "Regenerating GRUB configuration..." sudo grub-mkconfig -o /boot/grub/grub.cfg echo "Done."

使い方:

Bash
chmod +x remove-old-kernel.sh ./remove-old-kernel.sh linux

このスクリプトは パッケージ名 を引数に取り、削除、残骸のクリア、GRUB 再生成を一括で行います。sudo のパスワード入力が必要になる点に注意してください。

ハマった点やエラー解決

発生した問題 原因 解決策
grub-mkconfig 実行時に error: file not found: /boot/vmlinuz-5.15.97-arch1 古いカーネルイメージが削除されていなかった 手動で残っているイメージファイルを rm した上で再度実行
10_linux を無効化したが、起動時にカーネルが見つからない 40_customset root が誤っていた lsblk -f で正しいパーティションを確認し、set root='hdX,gptY' を修正
スクリプト実行中に pacman -Rns が失敗 依存関係パッケージが残っていた pacman -Rns 前に pacman -Qdt で孤立パッケージを確認し、必要に応じて pacman -Rns で削除

まとめ

本記事では、Arch Linux の GRUB メニューに残っている不要なカーネルエントリを安全に除去する手順 を体系的に解説しました。

  • カーネル削除後の残骸を手動またはスクリプトで完全に削除
  • GRUB の自動生成スクリプト (10_linux) を無効化し、40_custom に必要なエントリだけを手動で作成
  • grub-mkconfig で設定を再生成し、不要エントリが消えていることを確認

これにより、起動メニューが整理され、選択ミスのリスクが低減し、ブート時間の若干の短縮も期待できます。今後は、systemd-boot への移行や、grub-customizer といった GUI ツールを用いた更なるカスタマイズ方法についても検証していく予定です。

参考資料