Help us understand the problem. What is going on with this article?

Raspberry Pi 4 Model B で USB ブート(1)

Raspberry Pi 4 には microSD カードスロットが用意されており、ここに Linux をインストールした microSD カードを挿して運用するのがオフィシャルな使い方と思われる。
microSD は安い、消費電力が低いなどの利点はあるものの、

  • 遅い(数十MB/sec)
    • SSD が 数百〜数千MB/sec オーダー、HDD でも 200MB/sec 以上なので桁違いに遅い
  • 書き込み回数制限がきつめ
    • TCL なら 1,000回

といった欠点もあり、サーバーとして使うには不満を感じることは否定できない。

しかししばらく前からRaspberry Pi 4 Model B向けにベータ版として USB マスストレージからブートできる EEPROMが公開されており、最後にリリースされたものが最近正式版に格上げされた。
これを利用し USB 接続の SSD や HDD で運用することができればこの不安を解消できる。
作業的な意味でも心理的な意味でもハードルが下がったので、実際にやってみることにした。

用意するもの

  • Raspberry Pi 4 Model B
  • microSD(2GB以上)
    • EEPROM を更新するための Raspberry Pi OS の必要容量が 2GB
    • USB マスストレージからブートできる EEPROM が工場出荷時にインストールされるようになったら必須でなくなるかもしれない
  • USB 接続のストレージ
    • 今回は以下のものを使用したが、Linux で認識できるものなら多分なんでも
      • SATA-USB 変換器 KURO-DACHI/CLONE/U3
      • SATA HDD
  • PC
    • microSD に EEPROM を更新するための Raspberry Pi OS をインストールするのに必要
    • USB マスストレージのパーティションを作成・編集するのにも使う
  • Raspberry Pi 操作用のディスプレイ、キーボード
    • EEPROM 更新の際、コマンドを入力するのに使う(Raspberry Pi OS に SSH サーバーを立てられるなどの場合はなくてもいいかも)。ディスプレイ接続は Micro HDMI。

EEPROM の更新

EEPROM の更新は Raspberry Pi OS から行う。

https://www.raspberrypi.org/downloads/raspberry-pi-os/ からイメージをダウンロードする。多分どれでも問題ないが、EEPROM の更新しかしないので、もっとも容量の少ない Raspberry Pi OS (32-bit) Lite がおすすめ(EEPROM のリカバリーイメージを使えばもっと簡単に更新が行えそうだが、現在のところ未確認。)。
イメージがダウンロードできたら Raspberry Pi Imager(以下 rpi-imager。公式ダウンロードページからダウンロードできる)で microSD にインストールし、これで Raspberry Pi を起動する。

USB マスストレージブートに対応した EEPROM は、正式リリース前は GitHub のページからベータ版をダウンロードする必要があったようだが、現在ではパッケージマネージャー apt でアップデートを行えば自動的に更新される。
手順は以下のとおり。

$ sudo apt update
# rpi-eeprom パッケージに EEPROM が含まれているので、ここで更新される
$ sudo apt full-upgrade
$ sudo reboot

# 再起動後に EEPROM が 2020-09-03 に更新されたことを確認する
$ vcgencmd bootloader_version
Sep  3 2020 13:11:43
version c305ZZ1a6d7e532693cc7ff57fddfc8649def167 (release)
timestamp 1599135103

起動デバイス設定の変更

2020-09-03 の EEPROM からは起動デバイスとして USB マスストレージが最優先になるようだが、それ以前のものではデフォルトが microSD になっているので、この設定の確認と変更を行う。

$ sudo raspi-config

3 Boot OptionsB4 Boot Order から B1 USB Boot を選択し、設定を保存。

USB マスストレージへの Linux のインストール

Raspberry Pi OS (64bit) と Ubuntu 20.04.1 LTS (64bit) での動作を確認した。それぞれで手順が少し異なるので、個別に記載する。

Raspberry Pi OS のインストール

rpi-imager を使う場合

PC に USB マスストレージを接続し、rpi-imager で Raspberry Pi OS をインストールする。
メニューからは 32bit 版しか選択できないので、以下の場所からあらかじめ 64bit 版のイメージをダウンロードしておきこれを使用する。

インストールが終わったら Raspberry Pi 4 に USB マスストレージを接続すれば起動できる。

rpi-imager を使わない場合

前述のイメージは単なるストレージのダンプなので、rpi-imager を使わず dd コマンドなどで代替可能。
但しコマンドの入力ミスがあると PC のデーターを消去してしまう恐れがあるため、各コマンドの実行内容を理解している人限定。

# /dev/sdb の部分は適宜変更
$ unzip -p 2020-08-20-raspios-buster-arm64.zip | sudo dd of=/dev/sdb bs=128M
0+57209 レコード入力
0+57209 レコード出力
3779067904 bytes (3.8 GB, 3.5 GiB) copied, 35.0279 s, 108 MB/s

ブートローダーの設定と fstab を書き換える。

# 各パーティションの PARTUUID を確認
$ blkid /dev/sdb*
/dev/sdb1: LABEL_FATBOOT="boot" LABEL="boot" UUID="54E3-79CE" TYPE="vfat" PARTUUID="ad09722e-01"
/dev/sdb2: LABEL="rootfs" UUID="c6dd3b94-a789-4d57-9080-1472f721804b" TYPE="ext4" PARTUUID="ad09722e-02"

$ mkdir boot root
$ sudo mount /dev/sdb1 boot
$ sudo mount /dev/sdb2 root

# root=PARTUUID= の値を rootfs の PARTUUID にする
$ cat boot/cmdline.txt
console=serial0,115200 console=tty1 root=PARTUUID=ad09722e-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet init=/usr/lib/raspi-config/init_resize.sh splash plymouth.ignore-serial-consoles

# PARTUUID= の値を boot, rootfs の PARTUUID にする
$ cat root/etc/fstab
proc            /proc           proc    defaults          0       0
PARTUUID=ad09722e-01  /boot           vfat    defaults          0       2
PARTUUID=ad09722e-02  /               ext4    defaults,noatime  0       1

# 作業が終わったら後片付け
$ sudo umount boot root
$ rmdir boot root

パーティションの拡張

rpi-imager を使うかどうかにかかわらず、インストール直後のパーティションは以下の通り。

$ sudo gdisk -l /dev/sdb
:
Number  Start (sector)    End (sector)  Size       Code  Name
   1            8192          532479   256.0 MiB   0700  Microsoft basic data
   2          532480         7380991   3.3 GiB     8300  Linux filesystem

root の使用率は 88% という窮屈な状態なので、parted コマンドなどでパーティションを拡張する。

Ubuntu 20.04.1 LTS のインストール

rpi-imager でイメージを作成するのは Raspberry Pi OS と同様。
イメージの場所は以下。

rpi-imager を使わない方法も、パーティションを変更する必要があるのも Raspberry Pi OS のインストール時と同様。

追加で、以下の情報を参考にカーネル周りを調整する。

$ mkdir boot
$ zcat boot/vmlinuz | sudo dd of=boot/vmlinux

$ cat boot/config.txt
 :
[pi4]
max_framebuffers=2
dtoverlay=vc4-fkms-v3d
boot_delay
kernel=vmlinux
initramfs initrd.img followkernel
 :

$ sudo umount boot
$ rmdir boot

これで起動は可能になる。
ただし boot/vmlinux 更新の際には vmlinuz も追随させる必要があるので、前述のフォーラムにあるように auto_decompress_kernel のようなスクリプトを登録しておくといいと思われる。


Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away