dnackのブログ

コード書く仕事の間にコード書いてる知命目前のおっさんです。

Raspberry Pi:SSDブートしたい。

※結局なんだかんだごちゃごちゃしてしまったので、手順をまとめました。 手順のまとめ

μSD構成のコンパクトさは魅力ではあるけれど、このままではストレージの遅さがシステムのパフォーマンスの足を引っ張ってもったいないことこの上ないので、ストレージをμSDからSSDに変更する。

当然先人がたくさんいたので、まずは手順をなぞってしまおう。お勉強はそのあと。写経は大事。

というわけで、今回参考にした先人様はこちら。 raspida.com

このサイトでは64bit版のOSでやっていたけれど、 64bit版はまだ安定版がリリースされていないようなので、OSはこのままでいきましょうかね。 (OS入れ替えるにしても、SSDにしてからのほうが速いんじゃね?とも思うし)

ところで本筋全然関係ないけどローダーというとこの本はいい本なんだけど、もう20年前なんだよな。 いい感じのもうちょい新しい感じの本とかないのかな。まあこの辺は特に新しくなるものでもないから 今でもこの知識でほぼ通用するんだろうけど。

books.rakuten.co.jp

まあ寄り道はさておき始めましょうかね。

準備

SSDと、SATA-USB変換ケーブルを用意。

私のところでは以下の環境で確認しています。

Raspberry piRaspberry Pi 4 8GB (OS等は、2022/9/20時点でapt でとれる最新版に更新済)

SSDTRANSCEND トランセンド TS240GSSD220S

SATA-USB変換ケーブル:NewLife NewDesing社製、SB3 to SATA アダプター (ケーブルは、チップの相性があるらしく、外れ引くと大変っぽいので、上のリンクにあるラズパイダさんところでおすすめされていたものを買った。)

https://www.yodobashi.com/product/100000001003104707www.yodobashi.com

www.amazon.co.jp

家から一歩も出ずにこれがそろうのだから便利な時代だなぁ。。

ブートローダーの更新

raspberry pi 4のブートローダーは古いものはSSDブートに対応しないようなので、まずは確認。

dnack@raspberrypi:~ $ vcgencmd bootloader_version
Sep  3 2020 13:11:43
version c305221a6d7e532693cc7ff57fddfc8649def167 (release)
timestamp 1599135103
update-time 0
capabilities 0x00000000

ブートローダを確認してみたが2020年9月のバージョン。

いろいろなサイトを見ると多分このバージョンでもUSBブートは対応していそうなのだけど (この辺ってリリースノート見てもわかるように書かれていないみたいなんだよな…)、 1年前のままってのもなんだし、更新しておく。

dnack@raspberrypi:~ $ ls /lib/firmware/raspberrypi/bootloader/stable/pie* -la
-rw-r--r-- 1 root root 524288  424  2020 /lib/firmware/raspberrypi/bootloader/stable/pieeprom-2020-04-16.bin
-rw-r--r-- 1 root root 524288  617  2020 /lib/firmware/raspberrypi/bootloader/stable/pieeprom-2020-06-15.bin
-rw-r--r-- 1 root root 524288  720  2020 /lib/firmware/raspberrypi/bootloader/stable/pieeprom-2020-07-16.bin
-rw-r--r-- 1 root root 524288  810  2020 /lib/firmware/raspberrypi/bootloader/stable/pieeprom-2020-07-31.bin
-rw-r--r-- 1 root root 524288  97  2020 /lib/firmware/raspberrypi/bootloader/stable/pieeprom-2020-09-03.bin
-rw-r--r-- 1 root root 524288 1215  2020 /lib/firmware/raspberrypi/bootloader/stable/pieeprom-2020-12-11.bin
-rw-r--r-- 1 root root 524288  114  2021 /lib/firmware/raspberrypi/bootloader/stable/pieeprom-2021-01-11.bin
-rw-r--r-- 1 root root 524288  117  2021 /lib/firmware/raspberrypi/bootloader/stable/pieeprom-2021-01-16.bin
-rw-r--r-- 1 root root 524288  223  2021 /lib/firmware/raspberrypi/bootloader/stable/pieeprom-2021-02-16.bin
-rw-r--r-- 1 root root 524288  319  2021 /lib/firmware/raspberrypi/bootloader/stable/pieeprom-2021-03-18.bin
-rw-r--r-- 1 root root 524288  430 20:57 /lib/firmware/raspberrypi/bootloader/stable/pieeprom-2021-04-29.bin
-rw-r--r-- 1 root root 524288  77 22:25 /lib/firmware/raspberrypi/bootloader/stable/pieeprom-2021-07-06.bin

なんかいっぱいいるけど、最新版焼けばいいよね。

dnack@raspberrypi:~ $ sudo rpi-eeprom-update -d -f /lib/firmware/raspberrypi/bootloader/stable/pieeprom-2021-07-06.bin
*** INSTALLING /lib/firmware/raspberrypi/bootloader/stable/pieeprom-2021-07-06.bin  ***

   CURRENT: 202093日 木曜日 12:11:43 UTC (1599135103)
    UPDATE: 202176日 火曜日 10:44:53 UTC (1625568293)
    BOOTFS: /tmp/tmp.00VqIMxn84

EEPROM updates pending. Please reboot to apply the update.
To cancel a pending update run "sudo rpi-eeprom-update -r".

再起動しろとのことなのでリブートして待つことしばし。

dnack@raspberrypi:~ $ vcgencmd bootloader_version
Jul  6 2021 11:44:53
version c258ef8fe1d2334a750078b17dab5e2c1a1787fc (release)
timestamp 1625568293
update-time 1632126508
capabilities 0x0000007f

確かに更新されている。

SSDに環境をコピー

μSDからSSDに環境をコピーするのはGUIにあるツールを使うらしい。VNCいれといてよかった。 VNC接続して、GUIのメニューから”SD Card Copier”を選択。

f:id:dnack:20210920180504p:plain

New Partition UUIDsにチェックを入れてStartボタンを押下。 しばしそのまま放置すると、終了ダイアログが出るので、それまで待つ。

ブート順の設定

ブート順は、万一トラブったらμSDからブートするだろうから SD→USBの順でいいだろう。

dnack@raspberrypi:~ $ sudo raspi-config

から

6.Advanst Options → A6 Boot Order → B1 SD Card Boot Boot from SD Card if available, otherwise boot from USB

を選択。

私のところでは最初からそうなってたので何もせずに抜けた。

これで、SDカードがあればSDカードから、なければUSBからブートしてくれる設定になっているはず。

設定を変えた場合は、Finishでraspi-configから抜けると自動でリブートする(はず)。

設定ファイルの変更

Shutdownして電源落として、uSDカードを抜いてから起動してみると、、、

起動しねえ。。。

このままでは「起動しない」以上の情報量がないので 以前しまい込んだモバイルディスプレイを引っ張ってきて繋いでみると、 SCSIがどうたらという行でつんのめってるっぽい。

以前にいろいろいじってるうちに画面解像度をモバイルディスプレイに表示するにはあまりに細かくしてしまったので読めない。。

SDカードからブートして、画面解像度を字が読めるところ(800x600くらい?)に設定して、 そのSDからSSDへ環境のコピーからやり直し。これで起動時のメッセージ読めるはず。

そうすると、ディスクをマウントしようとしてるところでつんのめってるっぽいことがわかる。 ということで、もう一度SSD挿して、fstabを見てみると、

dnack@raspberrypi:~ $ cat /etc/fstab
proc                      /proc           proc    defaults               0       0
/dev/mmcblk0p6  /boot           vfat    defaults                0       2
/dev/mmcblk0p7  /                  ext4    defaults,noatime  0       1

ちょまてよ(キムタク顔)

これをそのままコピーしたってことは、 SSD起動でもmmclkほげほげを探しに行って (SD引っこ抜いてるから当然存在しないので) つんのめっているのではないかしら。

ということで、ビルド周りでストレージのデバイス名を変更。

SSDをマウント

dnack@raspberrypi:~ $  sudo mkdir /mnt/ex_ssd6
dnack@raspberrypi:~ $  sudo mkdir /mnt/ex_ssd7
dnack@raspberrypi:~ $  sudo mount -t vfat /dev/sda6 /mnt/ex_ssd6
dnack@raspberrypi:~ $  sudo mount -t ext4 /dev/sda7 /mnt/ex_ssd7

/boot/cmdline.txtの修正

dnack@raspberrypi:~ $  sudo nano /mnt/ex_ssd6/cmdline.txt 

console=serial0,115200 console=tty1 root=/dev/mmcblk0p7  rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

root=/dev/mmcblk0p7root=/dev/sda7 に変更。

fstabの修正

dnack@raspberrypi:~ $  sudo nano /mnt/ex_ssd7/etc/fstab で

/dev/mmcblk0p6  /boot           vfat    defaults                0       2
/dev/mmcblk0p7  /                  ext4    defaults,noatime  0       1

mmcblk0p6sda6mmcblk0p7sda7にそれぞれ変更。

これでSDカード引っこ抜いて起動して、無事起動を確認。

f:id:dnack:20210920231327j:plain

先人のブログを見てもこんなところで苦労していた形跡はないので、 この辺はSD Card Copierくんがよろしくやってくれたりするのかなとか思ってたんだけど、そんなことはなかったらしい。 いやそれにしたって、前にやってうまくいっていた人たちと何が違うんだろうなぁ。

densi.biz

この苦境を救ってくれたのはこちらの先人様でした。 この人はSD Card Copierつかわずにやってたけど、 こうやって見るとつかわないほうが簡単だったのかも。

まあなにはともあれ、なんとかうまくいったわけだけど SDをコピーしただけなので、もとのSDのサイズ以外使われてないわけですよね。

f:id:dnack:20210920212733p:plain

なにこれすげえもったいない。 ちょっと後でええようにしないと。

とりあえずsda8,9をつぶしてsda7ひろげて、 前のほうは適当にswapだけつくって残りはどこかにマウントしてしまえばいいのかな。 bootとルートだけつぶさなきゃいいんだよな?

まあ今度にします。細かい字を読んだの目が疲れた。(持病の老眼が…)

※追記 ひょっとしてNew Partition UUIDsにチェックを入れたのがわるかったのかな。 ここにチェックを入れなかったらデバイス名にsdaじゃなくて、 SDカードと同じmmcblkほげほげがはいって、 なんもしなくてもうまくいってくれたのかもしれんな。

手順のまとめ

1. ブートローダーの更新

(最近買ったものだと、出荷時からSSDブートに対応しているブートローダーが入っている可能性が高いが、 確実を期して最新の安定版にしておくといい)

dnack@raspberrypi:~ $ ls /lib/firmware/raspberrypi/bootloader/stable/pie* -la
dnack@raspberrypi:~ $ sudo rpi-eeprom-update -d -f /lib/firmware/raspberrypi/bootloader/stable/pieeprom-2021-07-06.bin
dnack@raspberrypi:~ $ sudo reboot

(pieeprom-2021-07-06.bin のところは、上の行のlsコマンドで表示されたもののうち最新のファイル名を入れる)

2. ブート順の設定

dnack@raspberrypi:~ $ sudo raspi-config

から 6.Advanst Options → A6 Boot Order → B1 SD Card Boot Boot from SD Card if available, otherwise boot from USB を選択。 ※ メニューツリーはバージョンによって異なる可能性があります。

3. ブート環境のコピー

リモートからVNCで接続して、メニューから”SD Card Copier”でSDからSSDへコピー

4. cmdline.txt,fstabの修正

SSDをマウント
dnack@raspberrypi:~ $  sudo mkdir /mnt/ex_ssd6
dnack@raspberrypi:~ $  sudo mkdir /mnt/ex_ssd7
dnack@raspberrypi:~ $  sudo mount -t vfat /dev/sda6 /mnt/ex_ssd6
dnack@raspberrypi:~ $  sudo mount -t ext4 /dev/sda7 /mnt/ex_ssd7
/boot/cmdline.txtの修正

/mnt/ex_ssd6/cmdline.txt

console=serial0,115200 console=tty1 root=/dev/mmcblk0p7  rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

root=/dev/mmcblk0p7root=/dev/sda7 に変更。

fstabの修正

/mnt/ex_ssd7/etc/fstab

/dev/mmcblk0p6  /boot           vfat    defaults                0       2
/dev/mmcblk0p7  /                  ext4    defaults,noatime  0       1

mmcblk0p6sda6mmcblk0p7sda7にそれぞれ変更。

5. SDを引っこ抜いてリブート

これでSSDから起動できるはず。