Raspberry Pi 3B Arch Linux USB起動 (microSD無)

## 序
　Raspberry Pi 3 では、microSD無しのUSB[メモリ/HDD/SSD]だけでの起動に対応しています。[Rasibianで実施したサイト][link-1]や[Raspberry pi 公式サイト(英文)][link-3]でも記されています。ただ、その他のデストリビューションで行ったものが見つけられなかったので、私自身の忘備録もかねてArch Linuxで実施してみた結果を記しておきます。

## 結果
　・最初にUSBブートを有効化する必要があるが、有効化以降なら可能。
　・Arch Linux ARM 32bit版(armv7),64bit版(aarch64)の両方ともできた。

## 確認環境
　・Raspberry Pi 3B (初期の+のつかない方）
　・2.5inch sata HDD を USB2.0  で接続
　・USB 日本語キーボード
　・[WQHDモニター(HDMI接続)](https://qiita.com/pona_per/items/61ca7d40093ca69ac3eb)
　・電源 5V 2.5A、USB-MicroB端子より給電

## 手順

###1.USBブートの有効化
　最初にArch Linux ARM 32bit版か公式OS RasbianをmicroSDカードにインストールする必要があります。USBブートの有効化程度にしか使わないので、アップデートなどの処置はしなくてもいいでしょう。尚、インストール方法はここでは省略しますので、それぞれの公式サイト等の手順を確認して下さい。
　インストール完了、rootでログイン後、`/boot/config.txt`へ以下の２行をテキストエディタ等で追加します。

```config.txt
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では影響があるようですので、[参考サイト][link-1]や[Raspberry pi 公式サイト(英文)][link-3]で確認ください(3B系はほとんど影響ない)。又、上記内容の`config.txt`の追加はこの時だけで、新規インストールしたUSBでは`timeout`を調整する以外は追加する必要ないです。

#####　※補足
　3B+では初期からUSBブートが有効化されているとのことで、`program_usb_boot_mode`に関する事は不要です。ただ、USB HDDを使う場合は上記理由から`timeout`を追加し大きな値に変更した方がよいでしょう（デフォルト値は2）。~~又、4Bは起動方法が変わり、まだUSBだけでの起動ができないようです(2020.05.10時点)。この辺は[参考サイト][link-1]や[Raspberry pi 公式サイト(英文)][link-3]に詳しく載っています。~~私はいずれも実機を所有しておらずあまり情報を追ってないので、最新情報は各自で確認下さい。

2021.7.09追加：4BでArch linux のUSB boot も2020.8頃から出来るようです。[ここ](https://qiita.com/yoshiki9636/items/f1290930f848b1ab2bb0)が参考になると思います。
2020.6.25修正：4Bでも2020.5.中頃から公式のRasberry Pi OS(64bit)では`rpi-eeprom`をアップデートすることで可能とのことです。

###2.USBブートの有効化の確認
　再起動で有効になるので再起動後、`vcgencmd`コマンドで有効になったか確認します。尚、Arch Linux ARM 32bit版では`vcgencmd`コマンドへのパスが設定されてないので、フルパスで実行します。

```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版を[公式サイト手順][link-2]の通りに`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とデバイス名等、各自の環境で設定してください。

```PARTUUID確認とfstabの編集例
# 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)`に変更します。

```cmdline.txtの編集例
#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 起動後
　[公式サイトの手順][link-2]のとおり、`pacman-key の初期化`を実施し、その後通常どおり自分に必要なパッケージをインストールし環境構築していってください。
　ちなみに私の環境のスクリーンショットは以下のようになります。
![screenshot_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621328/f6d4e69c-3a3e-f151-fb49-50ee1441cc3c.png)
![screenshot_64.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621328/ca57a3ee-ca3d-85cb-b3b5-28920b56b75b.png)

##所感
　今までアクセス速度が普通の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

[link-1]:https://jyn.jp/raspberrypi-usb-only-boot/
[link-2]:https://archlinuxarm.org/platforms/armv8/broadcom/raspberry-pi-3
[link-3]: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情報修正。リンク追加。