rpi-update後にRaspberry Piが起動しなくなってしまい困る

家で常時起動しているsingle-board computerのRaspberry Pi 3 model Bがkernel更新をした後再起動に失敗して起動しなくなりました．
長らく安定して動いていたので色々忘れていて解決まで時間がかかってしまいました．

追記)

その後しばらくしてまた起動しなくなりました．今度はmicroSD cardの読み込み，書き込みともにエラーとなりました．microSD自体が壊れてしまったようです．このときにはもう故障しかけていたのでしょうね……．

rpi-updateコマンドでkernelを更新した後から起動しなくなりました．
LEDの状態は赤点灯，緑不点灯でした．
UARTは何も出ず．(恐らくこのときにはUART-USBアダプタが故障していた)

たまに/bootの1つ目のFATパーティションにダーティビットが立って起動に失敗することがあるのでmicroSD cardをPCに繋いでfsckをかけましたが今回はこれは外れで問題ありませんでした．

$ sudo fsck -n /dev/mmcblk0p1
fsck from util-linux 2.40.4
fsck.fat 4.2 (2021-01-31)
/dev/mmcblk0p1: 394 files, 49156/261115 clusters

kernelのファイル群の展開や書き込み失敗したのかもと/bootを上書きすることに．
rpi-updateコマンドではバックアップもとっているようですがよく理解していないのでオリジナルイメージから書き込むことに．

Raspberry Pi OS bookworm armhfイメージの入手

$ lftp -c torrent https://downloads.raspberrypi.com/raspios_lite_armhf/images/raspios_lite_armhf-2024-11-19/2024-11-19-raspios-bookworm-armhf-lite.img.xz.torrent
Name: 2024-11-19-raspios-bookworm-armhf-lite.img.xz
dn:534M up:0 complete, ratio:0.00/0.00/0.00
peers:24 connected:0 active:0 complete:0
Seeding in background...
[215700] Moving to background to complete transfers...
$ wget https://downloads.raspberrypi.com/raspios_lite_armhf/images/raspios_lite_armhf-2024-11-19/2024-11-19-raspios-bookworm-armhf-lite.img.xz.sha256 \
https://downloads.raspberrypi.com/raspios_lite_armhf/images/raspios_lite_armhf-2024-11-19/2024-11-19-raspios-bookworm-armhf-lite.img.xz.sig
$ sha256sum -c 2024-11-19-raspios-bookworm-armhf-lite.img.xz.sha256
$ gpg --verify 2024-11-19-raspios-bookworm-armhf-lite.img.xz.sig

Note

gpg公開鍵はここのものを使いました．わかりやすいページが欲しいところです． https://www.raspberrypi.org/raspberrypi_downloads.gpg.key

Raspberry Pi OSイメージの展開とパーティションデバイスマップ

$ unxz 2024-11-19-raspios-bookworm-armhf-lite.img.xz
$ sudo kpartx -av ./2024-11-19-raspios-bookworm-armhf-lite.img
add map loop0p1 (254:3): 0 1048576 linear 7:0 8192
add map loop0p2 (254:4): 0 3923968 linear 7:0 1056768

1つ目のパーティションをmicro SDに上書き

$ sudo dd if=/dev/mapper/loop0p1 of=/dev/mmcblk0p1 bs=4M conv=fsync status=progress ; sync
$ sync

Note

if=::入力元デバイス
of=::出力先デバイス
bs=::ブロックサイズを4MBに変更
conv=fsync::ディスクへの書き出しを保証

この状態でRaspberry Piにmicro SDと接続して起動を試すとやはり失敗します．
そういえばUUIDが違うのではということで確認します．

Raspberry Pi OS bookworm armhf lite 2024-11-19でのUUID

$ sudo blkid /dev/mapper/loop0p2
/dev/mapper/loop0p2: LABEL="rootfs" UUID="bb15c8e6-d999-4838-be67-5ff200bffa46" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="57b902f5-02"
$ sudo mount -o ro /dev/mapper/loop0p1 /mnt
$ cat /mnt/cmdline.txt
console=serial0,115200 console=tty1 root=PARTUUID=57b902f5-02 rootfstype=ext4 fsck.repair=yes rootwait quiet init=/usr/lib/raspberrypi-sys-mods/firstboot

自分の環境のUUID

$ sudo blkid /dev/mmcblk0p2
/dev/mmcblk0p2: LABEL="rootfs" UUID="3a324232-335f-4617-84c3-d4889840dc93" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="71493291-02"

ずれているので1つ目のパーティションのcmdline.txtのroot=PARTUUID=の値をを利用中のrootになる2つ目のパーティションのPARTUUIDに書き換えます．

console=serial0,115200 console=tty1 root=PARTUUID=57b902f5-02 rootfstype=ext4 fsck.repair=yes rootwait quiet init=/usr/lib/raspberrypi-sys-mods/firstboot

↓

console=serial0,115200 console=tty1 root=PARTUUID=71493291-02 rootfstype=ext4 fsck.repair=yes rootwait quiet init=/usr/lib/raspberrypi-sys-mods/firstboot

これで起動するようになりました．

ddする前にcmdline.txt, config.txtを退避しておいてdd後に戻す方が良かったですね．ddを使わずファイルコピーでも大丈夫だったと思います．

例えばこのようにcmdline.txt, config.txt以外をコピー(未検証)

rsync -avcI –exclude=cmdline.txt –exclude=config.txt $FROM $TO

若しくはmicroSDしか使っていないのでroot=/dev/mmcblk0p2のほうがいいかもしれません．

うまく行ったかと思いましたが，無線LANデバイスのwlan0が見えません．
有線LANは利用できたので，そちらからrpi-updateでkernelを更新して再起動することでデバイスが見え，接続も出来るようになりました．

ちなみにこの状態や，別のmicro SDでOSを書き込んだばかりの状態でもUARTから何も表示できませんでした．どうも断線してしまったようです．USB側はOSからserialに見えるので多分ピンソケットあたりを買って付けかえることで治りそうな感じはします．
でも手間や送料を考えると以下のようなものを買ってしまったほうがいいかもしれません．

Amazon.co.jp: Rasbee USB-TTLシリアルコンソールのUSB変換COMケーブルモジュールのケーブル Raspberry Pi用 並行輸入品 : パソコン・周辺機器 ￥319※海外発送

Amazon.co.jp: waves 2個 USB シリアル 変換ケーブル TTL PL2303HX : パソコン・周辺機器 2つで￥680

PC環境

$ dpkg-query -W fdisk kpartx util-linux coreutils
coreutils 9.5-1+b1
fdisk 2.40.4-5
kpartx 0.11.1-1
util-linux 2.40.4-5
$ lsb_release -dr
Description: Debian GNU/Linux trixie/sid
Release: n/a
$ arch
x86_64

Raspberry Pi環境

$ lsb_release -dr
No LSB modules are available.
Description: Raspbian GNU/Linux 12 (bookworm)
Release: 12
$ uname -a
Linux raspberrypi 6.12.16-v7+ #1859 SMP Mon Feb 24 13:10:45 GMT 2025 armv7l GNU/Linux
$ grep "^Model" /proc/cpuinfo
Model : Raspberry Pi 3 Model B Rev 1.2