■ 概要
Raspberry Pi 5は、「NVMe M.2 SSD」と「マイクロSD」とを内蔵でき、設定に応じていずれかからシステムを起動できる。
ところが、この起動ディスクの切り替えがうまくできない問題にみまわれ、その原因がディスクの内容(識別子)にあるとわかったので、今後の運用に備えて、周辺の事情についても併せて整理しておきたいと思う。
■ 起動ディスクの切り替えができない不具合が生じた環境とディスクの状態について
◯ 公式イメージを書き込んだ「マイクロSD」でシステムをブート
Raspberry Pi OS Lite(2024-03-15-raspios-bookworm-arm64-lite)の公式イメージを「マイクロSD」にddコマンドで書き込んだものを用意した。
本体Raspberry Pi 5には、拡張ボード(Geekworm X1001 V1.1 PCIe NVMe M.2 SSD 2280)空の「NVMe M.2 SSD」を取り付けた。
そこに、さきほど用意したブート可能な「マイクロSD」を挿し込み、システムを起動し、初期設定を済ませ、aptによるシステムの更新作業、ファームウェアの更新を行った。
◯ 「NVMe M.2 SSD」でシステムをブート
アップデートしたシステムを含む「マイクロSD」(/dev/mmcblk0)の全内容を、空の「NVMe M.2 SSD」(/dev/nvme0n1)にddコマンドで次のように丸ごとコピーした。
dd if=/dev/mmcblk0 of=/dev/nvme0n1 status=progress
「raspi-config」コマンドのTUI(テキストユーザーインターフェイス)で、「 Advanced Options →Boot Order」から「NVMe M.2 SSD」が起動ディスクとして優先的に選択される設定にした。
その後、poweroffして「マイクロSD」を取り外してから、起動すると「NVMe M.2 SSD」を起動ディスクとしてシステムがブートした。
◯ 「マイクロSD」で起動するように設定した上でシステムをブート(問題発生)
共にブート可能な「NVMe M.2 SSD」と「マイクロSD」とが、本体Raspberry Pi 5に接続された状態で、「raspi-config」コマンドのブート設定で「マイクロSD」が優先的に選択されるようにし、rebootした。
このとき、常に「NVMe M.2 SSD」でブートしてしまう問題にみまわれた。
■ この不具合の原因について
結論から言うと、これは、ディスク自体に保存されているDisk identifierの値が、これらの「NVMe M.2 SSD」と「マイクロSD」とで同じだからだとわかった。Disk identifierの値が同じである場合、システムが2つのディスクを区別できない状態になり、常に「NVMe M.2 SSD」でブートしてしまうことになったと考えられる。
実際、「NVMe M.2 SSD」と「マイクロSD」とでDisk identifierの値が異なる場合には、設定の通りに起動ディスクが選択され、意図したディスクから起動するようになった。
ディスク自体に保存されているDisk identifierの値が同じになってしまったのは、「NVMe M.2 SSD」の内容が、「マイクロSD」の内容からddコマンドで複製したからである。ディスクの中身がddコマンドで丸ごとコピーされたので、ディスク自体に保存されているDisk identifierの値が同じになってしまう。
■ 疑問点と検証
しかし、次の場合は、うまく「マイクロSD」からシステムが起動した。
今、本体Raspberry Pi 5には先程と同じ「NVMe M.2 SSD」だけが接続されたままであり、「raspi-config」コマンドのブート設定で「マイクロSD」が優先的に選択されるよう設定した上でシャットダウンしている。
同じ「マイクロSD」にRaspberry Pi OS Liteのオリジナルイメージデータをもう一度ddコマンドでもう一度書き込んで初期化したものをその本体Raspberry Pi 5に挿し込み起動した。
すると、「NVMe M.2 SSD」でなく、設定した通りに「マイクロSD」からシステムが起動して、初期設定のためのTUIダイアログに行き着いた。疑問点はここである。
「マイクロSD」の内容(Disk identifierの値)は、同一のRaspberry Pi OS Liteのオリジナルイメージからddで書き込んでいるので、一回目の書き込みと、二回目の書き込みとで同一であるはずである。そして、一回目の書き込みで作成した「マイクロSD」からddで丸ごとコピーしたので、「NVMe M.2 SSD」の内容(Disk identifierの値)は、二回目の書き込み「マイクロSD」の内容(Disk identifierの値)と同じはずである。
つまり、全て生まれはRaspberry Pi OS Liteのオリジナルイメージだから、書き込んだディスクのDisk identifierの値が同じになるはずである。しかし、オリジナルイメージでもう一度初期化(二回目の書き込み)を行った「マイクロSD」は「NVMe M.2 SSD」としっかり区別され、設定した通りに「マイクロSD」からシステムが起動したという点である。
そこで、次の手順で、Raspberry Pi OS Liteのオリジナルイメージで初期化した「マイクロSD」について、本体Raspberry Pi 5に挿し込み起動する前後で、ディスクの識別子(Disk identifier)の変化が生じているのか検証した。
■ 検証のための操作
□ 次の操作は、別のLinuxマシンでの操作である。
◯ ddコマンドでRaspberry Pi OS Liteのイメージデータを「マイクロSDカード(A)」に書き込み
# dd if='2024-03-15-raspios-bookworm-arm64-lite.img' of=/dev/sdb bs=20M status=progress
◯ ddコマンドで「SDカード(A)」を別の「マイクロSDカード(B)」に書き込み
# dd if=/dev/sdb of=/dev/sdg bs=10M status=progress
◯ 書き込み後、fdiskで「マイクロSDカード(A)」の情報を参照
# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.31.1).Changes will remain in memory only, until you decide to write them.Be careful before using the write command.Command (m for help): pDisk /dev/sdb: 29.7 GiB, 31914983424 bytes, 62333952 sectorsUnits: sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisklabel type: dosDisk identifier: 0xfb33757dDevice Boot Start End Sectors Size Id Type/dev/sdb1 8192 1056767 1048576 512M c W95 FAT32 (LBA)/dev/sdb2 1056768 5406719 4349952 2.1G 83 Linux
◯ 同様に、fdiskで「マイクロSDカード(B)」の情報を参照
# fdisk /dev/sdg
Welcome to fdisk (util-linux 2.31.1).Changes will remain in memory only, until you decide to write them.Be careful before using the write command.Command (m for help): pDisk /dev/sdg: 234.1 GiB, 251406581760 bytes, 491028480 sectorsUnits: sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisklabel type: dosDisk identifier: 0xfb33757dDevice Boot Start End Sectors Size Id Type/dev/sdg1 8192 1056767 1048576 512M c W95 FAT32 (LBA)/dev/sdg2 1056768 5406719 4349952 2.1G 83 Linux
(注意)
gdiskには非対応だった。当OSディスクイメージはGPTでなくMBRを使用しているようである。そのため次の警告が表示されて、gdiskで表示できる「Disk identifier (GUID)」や「Partition unique GUID」がgdiskの起動の度に毎回変化するという挙動となり混乱を招く。
gdiskには非対応だった。当OSディスクイメージはGPTでなくMBRを使用しているようである。そのため次の警告が表示されて、gdiskで表示できる「Disk identifier (GUID)」や「Partition unique GUID」がgdiskの起動の度に毎回変化するという挙動となり混乱を招く。
***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory. THIS OPERATION IS POTENTIALLY DESTRUCTIVE! Exit by
typing 'q' if you don't want to convert your MBR partitions
to GPT format!
***************************************************************
以上の結果から、ddコマンドでディスクイメージをコピーしても、「Disk identifier: 0xfb33757d」は変化しないことがわかった。
◯ 各「マイクロSDカード」のファイルシステムを指示する識別子を確認した
各「マイクロSDカード」について、各パーティションの中のファイルシステムを(一意に)指し示す「UUID」と、パーティションを指示する「PARTUUID」を確認した。
# blkid
/dev/sdb1: LABEL="bootfs" UUID="44FC-6CF2" TYPE="vfat" PARTUUID="fb33757d-01"/dev/sdb2: LABEL="rootfs" UUID="93c89e92-8f2e-4522-ad32-68faed883d2f" TYPE="ext4" PARTUUID="fb33757d-02"/dev/sdg1: LABEL="bootfs" UUID="44FC-6CF2" TYPE="vfat" PARTUUID="fb33757d-01"/dev/sdg2: LABEL="rootfs" UUID="93c89e92-8f2e-4522-ad32-68faed883d2f" TYPE="ext4" PARTUUID="fb33757d-02"
この結果から、ddコマンドでディスクイメージをコピーしても、パーティション中のファイルシステムを指示する識別子「UUID」は変化しないことがわかった。また、さきほどfdiskコマンドで確認した同一の「Disk identifier: 0xfb33757d」から「PARTUUID」が生成されていることがわかった。
実際、ググってみても「93c89e92-8f2e-4522-ad32-68faed883d2f」、「44FC-6CF2」、「fb33757d」という文字列でいくつかのページがヒットしたので、他の人も同じ識別子を持つディスクを生成していることがわかった。
また、これらの情報は、ディスクをマウント/アンマウントした後に確認しても変化しなかった。
◯「マイクロSDカード(B)」から「fstabファイル」の内容を確認した。
proc /proc proc defaults 0 0PARTUUID=fb33757d-01 /boot/firmware vfat defaults 0 2PARTUUID=fb33757d-02 / ext4 defaults,noatime 0 1
ddコマンドによるコピー元である「マイクロSDカード(A)」もこれと同一だと考えられる。
□ いったんRaspberry Pi 5で操作を行う。
1、「マイクロSDカード(A)」を、Raspberry Pi 5に挿し込み、このディスクから起動した。
2、初回設定ウィザードが動作し、キーボードの設定、ユーザー名とパスワードの設定を行った。
3、作成したユーザーでログインした後、すぐにpoweroffコマンドでシャットダウンした。
4、シャットダウンしたことを確認後、「マイクロSDカード(A)」をRaspberry Pi 5から取り外した。
□ 再び、最初のLinuxマシンでの操作を行う。
「マイクロSDカード(A)」を同じディスクスロットに挿し込んだ後、最初の手順と同様に情報を確認した。
# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.31.1).Changes will remain in memory only, until you decide to write them.Be careful before using the write command.Command (m for help): pDisk /dev/sdb: 29.7 GiB, 31914983424 bytes, 62333952 sectorsUnits: sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisklabel type: dosDisk identifier: 0x17ad7977Device Boot Start End Sectors Size Id Type/dev/sdb1 8192 1056767 1048576 512M c W95 FAT32 (LBA)/dev/sdb2 1056768 62333951 61277184 29.2G 83 Linux
すると、Raspberry Pi 5で初回起動する前の値「Disk identifier: 0xfb33757d」と、今回の値「Disk identifier: 0x17ad7977」は異なっていることがわかった。
# blkid
/dev/sdb1: LABEL="bootfs" UUID="44FC-6CF2" TYPE="vfat" PARTUUID="17ad7977-01"/dev/sdb2: LABEL="rootfs" UUID="93c89e92-8f2e-4522-ad32-68faed883d2f" TYPE="ext4" PARTUUID="17ad7977-02"/dev/sdg1: LABEL="bootfs" UUID="44FC-6CF2" TYPE="vfat" PARTUUID="fb33757d-01"/dev/sdg2: LABEL="rootfs" UUID="93c89e92-8f2e-4522-ad32-68faed883d2f" TYPE="ext4" PARTUUID="fb33757d-02"
Raspberry Pi 5で初回起動する前後で、ディスクのパーティションを識別する「PARTUUID」の値が変化していることがわかった。
さらに、この変化に併せて、「fstabファイル」の内容も調整されていることがわかった。
proc /proc proc defaults 0 0PARTUUID=17ad7977-01 /boot/firmware vfat defaults 0 2PARTUUID=17ad7977-02 / ext4 defaults,noatime 0 1# a swapfile is not a swap partition, no line here# use dphys-swapfile swap[on|off] for that
■ 結論
以上のことから、Raspberry Pi OS Liteのオリジナルディスクイメージで初期化した「マイクロSD」は、本体Raspberry Pi 5に挿し込み初回起動することによって、オリジナルディスクイメージとは異なるディスクの識別子(Disk identifier)を持つようになる。
またこれによって、ディスクのパーティションを識別する「PARTUUID」の値も変化し、さらにはそれに併せて「fstabファイル」の内容も書き換えられることがわかった。
■ まとめ
今回の環境と条件のような場合では、「NVMe M.2 SSD」は、ddによるコピー元の「マイクロSD」と同一のディスクの識別子(Disk identifier)を持ったままである。ddコピーしただけではディスク識別子の書き換えは起こらない。
ディスクの識別子(Disk identifier)が同一の「NVMe M.2 SSD」と「マイクロSD」とでは、起動ディスクの選択をしても区別ができずに、常に「NVMe M.2 SSD」でブートしてしまう。
Raspberry Pi OS Liteのオリジナルディスクイメージで初期化した「マイクロSD」は、本体Raspberry Pi 5に挿し込み初回起動することによって、オリジナルディスクイメージとは異なるディスクの識別子(Disk identifier)を持つようになるため、先のような状況においても、「NVMe M.2 SSD」でなく、設定した通りに「マイクロSD」からシステムが起動させられる。
「NVMe M.2 SSD」に対するコピー元の「マイクロSD」において、ディスクの識別子(Disk identifier)と、fstabの内容を変更すれば、先のような状況においても、「NVMe M.2 SSD」でなく、設定した通りに「マイクロSD」からシステムが起動させられるのはないかと思う。
(参考)
・Can't boot from SD card anymore?
< https://forums.raspberrypi.com/viewtopic.php?t=372103 > 2024年6月15日