Ubuntu起動時のBusyBoxシェル問題の解決方法

## 状況 (Situation)

ようやく重い腰をあげて、Ubuntu22.04からUbuntu24.04にアップグレードをしました。

ただ、Ubuntu24.04を起動すると、通常のログイン画面やデスクトップ環境が表示されず、代わりに「BusyBox v1.36.1 built-in shell (ash) (initramfs)」というプロンプトが表示される状態に陥りました。この状態ではキーボード入力も反応せず、システムを使用できませんでした。

強制終了をするとBusyBoxの画面ではなく、[GRUB](https://www.gnu.org/software/grub/manual/grub/grub.html)メニューが開きました。そこからadvancedオプションで特定のカーネル（非リカバリモード）を選択すると正常に起動しますが、そこから再起動すると再びBusyBoxシェルに戻ってしまう状況が続いていました。

## 複雑さ (Complication)

この問題の複雑さは以下の点にありました：

1. 私の環境では[BusyBox](https://busybox.net)シェルでキーボード入力が効かないため、そこから復旧作業ができない
2. 毎回手動でカーネルを選択する必要があり、使い勝手が非常に悪い
3. 根本的な原因が不明確（ファイルシステムの問題か、[initramfs](https://www.linuxfromscratch.org/blfs/view/svn/postlfs/initramfs.html)の破損か、[カーネルモジュール](https://wiki.archlinux.org/title/Kernel_module)の問題か）

## 質問 (Question)

この問題を恒久的に解決し、Ubuntuが毎回正常に起動するようにするにはどうすればよいか？

## 回答 (Answer)

### 原因の特定プロセス

問題解決の第一歩として、まず正常に起動できるケースと起動できないケースの違いを分析しました：

1. GRUBメニューから特定のカーネルを選ぶと起動できる
2. 通常起動では起動できない

これは、デフォルトのカーネルが正常に動作しないことを示唆していると思いました。

システムが正常に起動している状態で、[カーネル情報を確認](https://man7.org/linux/man-pages/man2/uname.2.html)しました：

```bash
uname -r
```

結果は「[6.8.0-58-generic](https://launchpad.net/ubuntu/noble/amd64/linux-headers-6.8.0-58-generic)」でした。これは安定版のカーネルです。


次に、現在稼働しているinitrafmsが壊れている可能性があるため、[initramfsを更新](https://manpages.debian.org/testing/initramfs-tools/update-initramfs.8.en.html)をしました。その際のエラーメッセージから手がかりを得ました：

```bash
sudo update-initramfs -u -k all
```

実行結果：
```
W: missing /lib/modules/6.9.0-rc7-wt-ath+.old
W: Ensure all necessary drivers are built into the linux image!
depmod: ERROR: could not open directory /lib/modules/6.9.0-rc7-wt-ath+: No such file or directory
```

このエラーから、システムに6.9.0-rc7-wt-ath+というカーネルが存在するものの、必要なモジュールファイルが見つからないことがわかりました。さらに「rc7」という部分から、これはリリース候補（Release Candidate）の開発版カーネルであることが判明しました。

- 補足：この設定はあまり覚えていませんがUbuntu22.04の利用時にカーネルを6.9.0にアップグレードを試そうと春頃に設定したものが影響していたと思います。

さらに、[GRUBの更新結果](https://manpages.ubuntu.com/manpages/xenial/man8/update-grub.8.html)を確認すると：

```bash
sudo update-grub
```

出力：
```
Found linux image: /boot/vmlinuz-6.9.0-rc7-wt-ath+
Found initrd image: /boot/initrd.img-6.9.0-rc7-wt-ath+
Found linux image: /boot/vmlinuz-6.8.0-58-generic
```

これにより、システムがデフォルトで不完全な開発版カーネル（6.9.0-rc7-wt-ath+）を使用しようとしていることが明らかになりました。これが起動時にBusyBoxシェルに落ちる根本原因だと特定できました。

### 解決手順

この原因に基づき、以下の手順で問題を解決しました：

#### 1. initramfsの再生成

すべてのカーネルのinitramfs（初期RAMディスク）を再生成しました：

```bash
sudo update-initramfs -u -k all
```

開発版カーネルのモジュールディレクトリが見つからないエラーは出ましたが、安定版カーネルのinitramfsは正常に生成されました。

#### 2. GRUBの設定更新

GRUBブートローダーの設定を更新しました：

```bash
sudo update-grub
```

これにより、システム上のすべてのカーネルを検出し、ブートメニューに追加しました。

#### 3. デフォルトの起動カーネルを変更

[GRUBの設定ファイル](https://www.gnu.org/software/grub/manual/grub/html_node/Simple-configuration.html)を編集して、正常に動作する安定版カーネルをデフォルトに設定しました：

```bash
sudo vim /etc/default/grub
```

以下の行を追加または編集：

```
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 6.8.0-58-generic"
```

保存後、再度GRUBを更新：

```bash
sudo update-grub
```

これにより、GRUBの環境ブロックが更新され、`saved_entry`が「Ubuntu, with Linux 6.8.0-58-generic」に設定されました。

### 結果

再起動後、システムは自動的に安定版カーネル（6.8.0-58-generic）で起動するようになり、BusyBoxシェルの問題は解消されました。手動でカーネルを選択する必要がなくなり、毎回正常に起動するようになりました。

```bash
uname -r
```

### 教訓

1. 開発版/リリース候補（RC）カーネルを使用する場合は、システムの安定性に問題が生じる可能性がありそう
2. 問題が発生した場合は、GRUBメニューから異なるカーネルを選択して起動することで、問題の切り分けが可能
3. Warningのメッセージでも、問題の手がかりが得られることがある
4. GRUBのデフォルト設定を変更することで、起動時の動作を制御できる

この経験から、Linuxカーネルの更新や実験的なカーネルを導入する際は、安定版のカーネルを利用可能な状態に保っておくことの重要性を再認識しました。