タイトルの通りです。Rasberry PiがKernel Panicを起こして立ち上がらなくなった時の対処記録です。Chat GPT君と相談しながら作業・ドキュメント化しています。ちなみに対処方法の内容上あまり根本解決になっていない気がします。
筆者はLinuxをそこそこ使っていましたが起動やシステム周りであまり苦しんだことがなかったですのでKernel周りなどの事情はよくわかっていません。仕組みの話で誤ったことを書いていればコメントいただけると嬉しいです。
本記事は「原因などの理解はともかく解決した方法」を掲載します。
結論
Kernel Panicの原因はinitramfsファイルの圧縮形式がOS側の設定と実態とで整合していなかったことのようです。
結果として以下の作業をしています。
- RAMのSDカードをWindowsに挿入し、ドライブとして読み込む。
- Kernelのバックアップを復元し、不具合を起こしたKernelを退避させる。
- SDカードをRasberry Piに戻し、正常に起動することを確認する。
- OS boot時の初期化ファイルの圧縮方法の設定をZSTDからGZIPに固定する。
- boot 初期化ファイルを再生成する。
- 再起動し、問題ないことを確認したら再度Kernelのバックアップを取り、
apt update & upgradeを行い、再度再起動確認/バックアップを取る。
作業環境
H/W: Rasberry pi5 (メモリ16 GB)
OS: Ubuntu 24.04.4 LST (noble)
症状/前提
ある日Raspberry piを起動しようとしたらUbuntuロゴも出ず起動もせず、黒い画面に白文字でエラーを出し起動せず、動作を停止してしまいました。エラーで重要そうな場所をピックアップすると以下のような文章がありました。
Initramfs unpacking failed: ZSTD-compressed data is corrupt
Kernel panic - not syncing: No working init found.
前提として、最後に起動した際にapt update & upgradeをしていました。
原因? / 対処方針
エラーメッセージ的におそらく「BOOT時に解凍/展開すべきinitramfsをZSTD形式で展開できなかった」のが原因です。展開できずにイニシャライズプロセスが走った結果イニシャライズファイルが見つからなかったのかと…
未検証ですがおそらく apt upgrade実行時にinitrsmfsの圧縮方式が変更になったのかと思います。apt upgrade実行時にはinitramfsの再生成を行うようですので、再生成時の圧縮方式と起動時の解凍方式が噛み合わない組み合わせになってしまったのが原因だと考えられます。今回ZSTDで正常に解凍できなかったので、本記事では 「とりあえず動くKernelバージョンに戻し、initramfsの解凍方式をGZIPに固定」 します。
ちなみに別個Ubuntuマシンが存在した場合、Ubuntuに用意されているKernel修復ツールを使用することで動く状態に復元できる可能性があります。(↓参考)
今回の場合、Rasberry pi以外にUbuntuをBootできるデバイスがありませんでしたので、手元のWindowマシンで対応できる内容に限ります。
復旧手順
今回取り組んだ手順を順番に書いているだけなので、もっと良い順番があるかもしれないです。
1.RAMブート用のSDカードの内容を確認
Windows PC に SD カードを挿入し中身の確認とバックアップの復元を行う。Bootドライブ扱いになっているのでそのままでは中身を見ることはできない。ドライブレター (CドライブとかDドライブとかのアルファベットのこと)の割り当て操作を行うことでUbuntuのBootドライブとなっているSDカードをストレージとして読み込むことができる。
ドライブレターの割り当て参考情報↓
割り当てると中身を見ることができる。Ubuntuの場合、system-bootディレクトリに行くことでKernelを確認可能。
中身の例: initrd.img, vmlinuz, config.txt, cmdline.txt
2. 不具合を起こした initrd を退避
initrd.imgをinitrd.img.badなどに名前を変更し再起動時に使用されないように退避。
3. backup を復元
initrd.imgはinitrd.img.bakという名前で定期的にバックアップが取られている。バックアップのimgならうまく起動できると信じてこのファイルをinitrd.imgに名前を変更する。
次回以降の起動ではこのファイルが使用されるはず。
4. Raspberry Pi を reboot
これで Ubuntu が正常起動。
ここまでの操作でとりあえず起動できる状態になりました。
起動後に行ったこと
圧縮形式を gzip に固定
/etc/initramfs-tools/initramfs.confにinitrd.imgの圧縮形式が設定されているらしいのでCOMPRESS=gzipとする。なければ追記。症状のセクションにあるようなエラーが出ている場合、COMPRESS=zstdとなっている可能性があるのでgzipに変更。
initramfs 再生成
sudo update-initramfs -u -k all
これ大事らしい (Chat-GPT談)。設定ファイル側で圧縮形式の変更をしたので対応する設定にinitramfsを書き換える模様。
操作の確認方法
initrd の圧縮形式確認
file /boot/initrd.imgまたはfile /boot/initrd.img-*を実行する。
gzip compressed dataと表示されれば成功。
GZIPで展開可能か確認
以下コマンドで展開/中身の確認ができるかを確認する。
lsinitramfs /boot/initrd.img | head
正常ならbin, etc, init, lib...などが表示される。
reboot テスト
念のためrebootしておきましょう。 正常に起動したらOKです。
おつかれさまでした。
おまけ
記事を書くにあたってついでにUnuntuの起動プロセスを軽く調べたので時間あれば追記します。
余談ですがこのあとこのKernelは謎の再起動ができなくなる不具合に当たりました。不具合の内容上この操作後原因ではなさそうです。
今後新しく記事を書きます。
コメントや指摘などあればコメントよろしくお願いします。