問題発生
本サイトを運用しているRaspberry Pi 5(以下ラズパイ)で、
Bash
sudo apt update && sudo apt upgrade -yでアップデートしたところ、カーネルのアップデートも含まれていたのですが、これが原因で起動できなくなりました。
環境としては、
- Raspberry Pi 5 8GB
- seed studiaのPCIe to dual M.2 hat for Raspberry Pi 5
- M.2 SSD Samsung 980 と Netac NVMe SSDのRAID1
以下でRAID1から起動できるようにしています
復旧しようといろいろ試みましたが、結局はバックアップしてあった/boot/firmware に戻す結果になりました。(実際は旧カーネルバージョンで起動していた時にバックアップしてあったmicroSDカードに変えて起動)
原因
GoogleのAIモードで質問したところ、
- PCIe パケットスイッチ配下の「デバイス列挙(Enumeration)バグ」
カーネル 6.18 以降、PCIe コアドライバおよび初期化シーケンスのコードが刷新されました。これにより、1本の PCIe バスを複数に分岐させるスイッチチップ(Seeed の ASM1182e などのパケットスイッチ)の配下にあるデバイスを、起動初期(initramfs 段階)の限られた時間内に2台とも正しく認識(スキャン)しきれないバグが混入しています。
1台目の SSD が認識された数ミリ秒〜数秒後に2台目が遅れて認識されるため、mdadm(RAID1)が「相方が見つからない」と判断し、タイムアウトして起動エラー(initramfs シェルへの脱落)になります。- NVMe 電源管理(ASPM)のデグレードバグ
GitHub の公式リポジトリ等での議論によると、カーネル 6.18.29 での PCIe 省電力(ASPM)制御の変更に伴い、「起動時や高負荷時に、NVMe ドライブの電源状態を正しく移行できない(D3hot ➔ D0 への復帰失敗)」という致命的なエラー(unable to change power state)が発生することが確認されました。これにより、ハードウェア的には正常でも、ソフトウェア側でランダムにドライブが切断されたり、初期認識に失敗する現象が多発しています。- EEPROM(ブートローダー)との互換性
問題最新カーネル 6.18.29 の PCIe 初期化ロジックは、ラズパイ 5 の EEPROM(ブートローダーファームウェア)のバージョンに強く依存していることが判明しました。EEPROM が古いバージョンのままカーネルだけを 6.18 にアップデートした場合、初期の PCIe リンクアップ自体に失敗して NVMe から一切ブートできなくなるケースも追加で報告されています。
だそうです。修正をまつしかなさそうです。
カーネルバージョン
×:6.18.29
〇:6.12.75
対策
apt-markでのホールド
Raspberry Piの公式GitHubにも挙がっており、修正を待つしかなさそうなので、カーネルとrpi-eepromのアップデートはロックしておきます。
カーネルアップデートをロック
sudo apt-mark hold linux-image-rpi-2712 linux-headers-rpi-2712 raspi-firmware
sudo apt-mark hold linux-image-rpi-v8 linux-headers-rpi-v8 rpi-eeprom
追加対策「APTピン留め」
apt-markでホールドしたあったのにも関わらず、ある日
Bash
sudo apt update && sudo apt upgrade -yで、カーネルがアップデートされてしまい、起動できなくなってしまいました。
再び、バックアップしてあった/boot/firmware に戻して起動し、以下の追加対策を行いました。
設定ファイルを/etc/apt/preferences.d/block-kernel を作成
sudo nano /etc/apt/preferences.d/block-kernel
以下をはり付けます。(ここでは、カーネル6.18系、6.19系まで対象とします)
/etc/apt/preferences.d/block-kernel の内容
Package: linux-image-* linux-headers-* raspi-firmware rpi-eeprom
Pin: version 6.18.*
Pin-Priority: -1
Package: linux-image-* linux-headers-* raspi-firmware rpi-eeprom
Pin: version 6.19.*
Pin-Priority: -1
将来カーネルアップデートしたくなった場合
上でやったロックを解除します
/etc/apt/preferences.d/block-kernel を削除
設定ファイルを/etc/apt/preferences.d/block-kernel を削除
sudo rm /etc/apt/preferences.d/block-kernel
apt-markでのホールド解除
カーネルアップデートをロック
sudo apt-mark unhold linux-image-rpi-2712 linux-headers-rpi-2712 raspi-firmware
sudo apt-mark unhold linux-image-rpi-v8 linux-headers-rpi-v8 rpi-eeprom
アップデート(アップグレード)
Bash
sudo apt update && sudo apt upgrade -y




コメント