OrangePI5(Armbian)でOS再起動後に、OSが立ち上がらない

【環境】

OrangePI5 (MicroSDへインストール)
OS:Armbian 23.02.0-trunk.0112 Bullseye
ベース: Armbian_23.02.0-trunk.0112_Orangepi5_bullseye_legacy_5.10.110_minimal.img.xz
OS連続稼働(約12日間程度)中であった。

【状況】

apt update/upgradeにて、パッケージをUpdate。
OS再起動後に、OSが起動しなくなった。

  • ディスプレイ接続。OrangePi5電源ONしても、HDMI信号無状態で画面は真っ黒
  • OrangePI上のLEDは赤点灯のみ。
     → 正常起動時は、赤LED点灯。赤LED横の緑LEDが点滅状態となる 

    →つまり、MicroSDカードに読込にいっていない模様。

  • 別端末のLinux(RockyLinux)に、当該のMicroSDカードをUSBカードリーダー挿して、USBソケットに挿す。
    → MicroSDカード上のファイルシステムは、mount出来て、lsでファイル一覧が出る事を確認。

おそらく、何らかの理由でMicroSDのMBR領域が破損しており、再起動タイミングで発症。
boot出来なくなっていたものと思われる。

MicroSDカードは年末に購入。年明けに開封して使用しており、構築数日+連続稼働(12日)で総使用時間は、24HX12日+α = 300時間程度。
故障するには早すぎる印象。

【復旧手順】

データ領域は読み込めるようなので、MicroSDカードをバックアップして、
新MicroSDカードへリストアする方針で進める。
作業端末として、WindowsPCとLinuxPCで作業する。

最初は、MicroSDをdump後に、新品メディアにrestore予定だったが、dumpコマンドの進捗速度で、
進捗表示に 残り10時間と出た時点で強制終了。こんなに待ってられない。

(1) 情報取得

故障MicroSDカード(USBカードリーダー)をLinux機へ挿し込む

# fdisk -l /dev/sdj

ディスク /dev/sdj: 14.9 GiB, 15938355200 バイト, 31129600 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: gpt
ディスク識別子: 7B1D8540-A4BF-FA4B-AEE5-9CE0FF2DDF0C

デバイス 開始位置 終了位置 セクタ サイズ タイプ
/dev/sdj1 32768 557055 524288 256M Linux 拡張起動
/dev/sdj2 557056 30801920 30244865 14.4G Linux ファイルシステム

# blkid -o list /dev/sdj1

device fs_type label          mount point              UUID
---------------------------------------------------------------------------------------------
/dev/sdj1 ext4 armbi_boot (マウントされていません) 4df504c6-1128-4e4d-aae9-012e346055d7

 # blkid -o list /dev/sdj2

device fs_type label          mount point              UUID
---------------------------------------------------------------------------------------------
/dev/sdj2 ext4 armbi_root (マウントされていません) 9c0b2228-0de6-4207-b1d5-6b655d76f817

(2) バックアップ

# dd if=/dev/sdj of=/root/orangepi.img status=progress
完了したら、MicroSDカードを抜いておく。

(3) 新MicroSDカードへイメージデータを書込み

[Windows機で操作]
当初OrangePI5インストール時に使用したイメージデータ
Armbian_23.02.0-trunk.0112_Orangepi5_bullseye_legacy_5.10.110_minimal.img.xz
を解凍し、「Win32DiskImager」で新MicroSDカードへ書込み。

(4) OrangePI5へ新MicroSDカードを挿し込み起動

一度起動して、初期設定(パスワードとロケール設定等)のみ終わらせる。
プロンプトが出たら、shutdownコマンドで終了
→ ファイルシステムの自動拡張を終わらせるのが目的

(5) 新MicroSDカード(USBカードリーダー)をLinux機へ挿し込む

新MicroSDカードのファイルシステムをフォーマット
# mkfs.ext4 -L armbi_boot /dev/sdj1
# mkfs.ext4 -L armbi_root /dev/sdj2

→ (3)の操作は、MBR領域とパテーション作成が目的で、ファイルシステム内のデータは不要。
データは、全てバックアップデータから戻す。

(6) 新MicroSDカード 情報取得

# fdisk -l /dev/sdj

ディスク /dev/sdj: 29.18 GiB, 31331450880 bytes, 61194240 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: gpt
ディスク識別子: 118f5c48-eacf-317b-cfd8-c7fd542c51b3

デバイス 開始位置 終了位置 セクタ サイズ タイプ
/dev/sdj1 32768 557055 524288 256M Linux 拡張起動
/dev/sdj2 557056 60555264 59998209 28.6G Linux ファイルシステム

# blkid -o list /dev/sdj1

device fs_type label          mount point              UUID
---------------------------------------------------------------------------------------------
/dev/sdj1 ext4 armbi_boot (マウントされていません) 24d9d921-5af7-33b8-a353-2b53fb3be0da

# blkid -o list /dev/sdj2

device fs_type label          mount point              UUID
---------------------------------------------------------------------------------------------
/dev/sdj2 ext4 armbi_root (マウントされていません) 02c288bb-34d8-86bc-3def-ea8f075b676a

(7) バックアップデータ 情報取得

(8)にて、マウント時にoffset値を算出する為に、下記値を利用する。
利用する値は、開始位置の値
1番目パテーション 32768
2番目パテーション 557056

# fdisk -l /root/orangepi.img

ディスク /root/orangepi.img: 14.9 GiB, 15938355200 バイト, 31129600 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: gpt
ディスク識別子: 7B1D8540-A4BF-FA4B-AEE5-9CE0FF2DDF0C

デバイス 開始位置 終了位置 セクタ サイズ タイプ
/root/orangepi.img1 32768 557055 524288 256M Linux 拡張起動
/root/orangepi.img2 557056 30801920 30244865 14.4G Linux ファイルシステム

(8) リストア

# mkdir /mnt/{old,new}

〇 1番目のパテーションのリストア
# mount -t ext4 -o loop,offset=$((32768*512)) /root/orangepi.img /mnt/old
   → 32768 は、(7)で取得した値 [/root/orangepi.img1]
# mount /dev/sdj1 /mnt/new
# cd /mnt/old
# rsync -av . /mnt/new/
# cd /mnt/new
# vi armbianEnv.txt
「rootdev=UUID=」行のUUID値を変更。値は、(6)で取得した /dev/sdj2のUUID

verbosity=1
bootlogo=false
overlay_prefix=rockchip-rk3588
fdtfile=rockchip/rk3588s-orangepi-5.dtb
rootdev=UUID=02c288bb-34d8-86bc-3def-ea8f075b676a
rootfstype=ext4

# umount /mnt/new
# umount /mnt/old

〇 2番目のパテーションのリストア
# mount -t ext4 -o loop,offset=$((557056*512)) /root/orangepi.img /mnt/old
   → 557056は、(7)で取得した値 [/root/orangepi.img2]
# mount /dev/sdj2 /mnt/new
# cd /mnt/old
# rsync -av . /mnt/new/
# cd /mnt/new
# vi etc/fstab
mountポイント「/」を (6)で取得した /dev/sdj2のUUID
mountポイント「/boot」を (6)で取得した /dev/sdj1のUUID へ変更

UUID=02c288bb-34d8-86bc-3def-ea8f075b676a / ext4 defaults,noatime,commit=600,errors=remount-ro 0 1
UUID=24d9d921-5af7-33b8-a353-2b53fb3be0da /boot ext4 defaults,commit=600,errors=remount-ro 0 2
tmpfs /tmp tmpfs defaults,nosuid 0 0

# umount /mnt/new
# umount /mnt/old

(8) 新MicroSDカードをOrangePiへ挿して起動

【原因は?】

確証はありませんが、思い当たる節があるとすれば「MicroSDカード」

言い訳になるが・・・・
SBC(シングルボードコンピュータ)は、Xwindowを入れなければ、8GBで十分すぎる。
しかし、MicroSDカードも大容量化が進み、(店舗で)売られている最低容量は32GBから。
ネット通販で探せば、8GB/16GBもまだ販売されているが、8GB/16GBの値段と32GBの値段は、
(ノーブランドで)数十円程度だったりする。

だったら・・・と思って、(思いっきり)中華製の安いSDカード(16GB)に手を出したのが敗因かも。

以前は、上海問屋のノーブランドを長年使ってきたが、上海問屋がドスパラに吸収されて
最近は、ノーブランドのMicroSDカードは販売されていない模様。(SANディスクOnly)

中華製の大容量メディア(MicroSDやSSD)は、容量偽装のパチモンが出回っているが、
16GBや32GB程度の容量では大丈夫だろうと、タカをくくっていた。
今回をきっかけに、同メディア(新品)を「h2testw」でチェックしたが容量偽装はない。
「h2testw」の最終結果で表示された値では、Write 約11MB/s Read 約17MBと表示。
一応 Class10なので転送速度は及第点だと思う。

故障したMicroSDのバックアップ中の転送速度が怪しかった(遅い)
ddコマンドで、最初、転送速度2MB/s、1GB程度完了で 1MB/s 5GB程度完了では4MB/s
ddコマンドで転送速度ってこんなに変わるもの? いや、10MB/s出ない時点で怪しいか。
故障メディアは廃棄して、未開封の同製品は完全にテスト用にしないといけない。