序
Raspberry Pi 3 では、microSD無しのUSB[メモリ/HDD/SSD]だけでの起動に対応しています。Rasibianで実施したサイトやRaspberry pi 公式サイト(英文)でも記されています。ただ、その他のデストリビューションで行ったものが見つけられなかったので、私自身の忘備録もかねてArch Linuxで実施してみた結果を記しておきます。
結果
・最初にUSBブートを有効化する必要があるが、有効化以降なら可能。
・Arch Linux ARM 32bit版(armv7),64bit版(aarch64)の両方ともできた。
確認環境
・Raspberry Pi 3B (初期の+のつかない方)
・2.5inch sata HDD を USB2.0 で接続
・USB 日本語キーボード
・WQHDモニター(HDMI接続)
・電源 5V 2.5A、USB-MicroB端子より給電
手順
1.USBブートの有効化
最初にArch Linux ARM 32bit版か公式OS RasbianをmicroSDカードにインストールする必要があります。USBブートの有効化程度にしか使わないので、アップデートなどの処置はしなくてもいいでしょう。尚、インストール方法はここでは省略しますので、それぞれの公式サイト等の手順を確認して下さい。
インストール完了、rootでログイン後、/boot/config.txt
へ以下の2行をテキストエディタ等で追加します。
program_usb_boot_mode=1
program_usb_boot_timeout=10
2行目のtimeout
の値10
は、HDDを使用する場合の電源ONからスピンアップ時間をとる為(実質的に使えるようになるまで)の待ち時間で、かなり大きくしています。USBメモリやSSDの場合は値をもっと小さくしても大丈夫だとは思います。起動できる様になったらconfig.txt
に追加し小さい値にしてみて調整してください(2020.6.25追記:timeout値を小さくしても、他のwaitがあるのかあまり変わらないようです。適当でいいかもしれません)。
尚、有効化すると元に戻せなくなり、一部modelでは影響があるようですので、参考サイトやRaspberry pi 公式サイト(英文)で確認ください(3B系はほとんど影響ない)。又、上記内容のconfig.txt
の追加はこの時だけで、新規インストールしたUSBではtimeout
を調整する以外は追加する必要ないです。
※補足
3B+では初期からUSBブートが有効化されているとのことで、program_usb_boot_mode
に関する事は不要です。ただ、USB HDDを使う場合は上記理由からtimeout
を追加し大きな値に変更した方がよいでしょう(デフォルト値は2)。~~又、4Bは起動方法が変わり、まだUSBだけでの起動ができないようです(2020.05.10時点)。この辺は参考サイトやRaspberry pi 公式サイト(英文)に詳しく載っています。~~私はいずれも実機を所有しておらずあまり情報を追ってないので、最新情報は各自で確認下さい。
2021.7.09追加:4BでArch linux のUSB boot も2020.8頃から出来るようです。ここが参考になると思います。
2020.6.25修正:4Bでも2020.5.中頃から公式のRasberry Pi OS(64bit)ではrpi-eeprom
をアップデートすることで可能とのことです。
2.USBブートの有効化の確認
再起動で有効になるので再起動後、vcgencmd
コマンドで有効になったか確認します。尚、Arch Linux ARM 32bit版ではvcgencmd
コマンドへのパスが設定されてないので、フルパスで実行します。
# /opt/vc/bin/vcgencmd otp_dump | grep 17:
17:3020000a
17:3020000a
となったらUSBブートが有効化され、準備完了となります。
ちなみに変更前は、17:1020000a
でした。
3.USB[メモリ/HDD/SSD]への Arch Linux ARM 新規インストール
microSDカードへのインストール方法と変わりません。別Linuxマシンに新規インストール用のUSB[メモリ/HDD/SSD]を接続しlsblk
コマンドでデバイス名を確認します。後は確認したデバイス名を使い32bit版か64bit版を公式サイト手順の通りにumount
前までの作業を行います(mv root/boot/* boot
まで実施)。
3.1 32bit版(armv7),64bit版(aarch64)共通設定
ls
コマンドで、USB[メモリ/HDD/SSD]のパーテイションID(PARTUUID)
を確認し、起動ディスクとなるUSB[メモリ/HDD/SSD]内の、etc/fstab
に「/
」、「/boot
」のパーテイションID(PARTUUID)
をテキストエディタ等で追加します。以下は概要で、実際には確認したPARTUUIDとデバイス名等、各自の環境で設定してください。
# ls -l /dev/disk/by-partuuid/
・・・・・ (USBのPARTUUID-01) -> ../../sda1
・・・・・ (USBのPARTUUID-02) -> ../../sda2
# vi (USBの/マウントポイント)/etc/fstab
PARTUUID=(USBのPARTUUID-01) /boot vfat defaults 0 2
PARTUUID=(USBのPARTUUID-02) / ext4 defaults,noatime 0 1
64bit版(aarch64)では以上で設定は終わりです。
※64bit版(aarch64) Arch Linux補足
64bit版(aarch64)では起動方法がu-boot方式に変更されており、32bit版のcmdline.txt
に相当するものはboot.txt
になっています。64bit版ではこの段階で修正する必要はないと思われます。ちなみに、このファイルはスクリプトになっていますが、この段階でテキストエディタでboot.txt
を修正しても反映されません。反映するようにするためには、64bit環境で起動後、uboot-tools
をインストールしboot.txt
を編集した後、mksr
を実行する必要があります。
私の場合は、32bit版をインストール後、64bit版にトライした為か、fstab
の設定だけで起動できました。いきなり64bit版を入れた場合や、他のディストリビューションは確認してませんので、自身で確認して下さい。
3.2 32bit版(armv7)のcmdline.txtの修正
起動ディスクとなるUSB[メモリ/HDD/SSD]内の、boot/cmdline.txt
内の root=/dev/mmcbloc02p
となっている部分を、USB[メモリ/HDD/SSD]のパーテイションID(PARTUUID)
に変更します。
# vi (USBの/マウントポイント)/boot/cmdline.txt
root=PARTUUID=(USBのPARTUUID-02) rw rootwait ・・・・・
3.3 USB[メモリ/HDD/SSD]のアンマウント
上記設定が終わったら、母艦のLinuxマシンから USB[メモリ/HDD/SSD]をunmount
、取り外し、 Raspberry Pi 3に接続します。そして Raspberry Pi 3からmicroSDカードを抜き、電源を入れます。これで起動すると思われます。
上手く起動できない場合は、電源容量が不足していないか、タイムアウトの時間が短すぎないか、PARTUUID
が間違ってないか等確認してください。
3.4 起動後
公式サイトの手順のとおり、pacman-key の初期化
を実施し、その後通常どおり自分に必要なパッケージをインストールし環境構築していってください。
ちなみに私の環境のスクリーンショットは以下のようになります。
所感
今までアクセス速度が普通のmicroSDカード使っていたので、ディスクまわりが絡む処理はあまり速くありませんでした。USB HDDにする事でこの辺が改善され以前より速くなりました。又、microSDカードの読み書きの扱いを心配しなく済むので精神的にも気楽にパッケージのインストール・アンインストールやswap領域の設定もできます。ノートPCのストレージ交換で容量の小さなHDD/SSDが余っているようならトライしてみてはいかがでしょうか。
参考サイト
純規の暇人趣味ブログ:https://jyn.jp/raspberrypi-usb-only-boot/
公式サイト(関連部分)
Arch Linux ARM (英文):https://archlinuxarm.org/platforms/armv8/broadcom/raspberry-pi-3
Raspberry Pi (英文):https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/msd.md
修正履歴
2021.07.09:Arch linux での raspberry pi 4b のusb bootの関連情報を追加。
2020.06.25:timeout部分追記。raspberry pi 4情報修正。リンク追加。