ラズパイ4を完全USB Boot化

SDカードは読み書きを大量にすると寿命が短くなるので耐久性が問題になります。起動ディスクをHDDに変更できれば、SDカードの耐久性を心配する必要もなくなります。

そこで、今回はSDカードなしUSB HDDから起動する方法を試したので紹介します。

【注意事項】
本設定ではファームウェアの更新を行っています。起動しなくなる可能性がありますので、ご自身の責任で行ってください。

設定手順は以下です。

  1. OS(Rasbian)のインストール
  2. OSを最新版にアップデート
  3. ファームウェアをHDDブート対応版にアップデート
  4. SDカードの中身をHDDにコピー
  5. 起動確認

1.OS(Rasbian)のインストール

NOOBS(New Out Of Box Software) を使った場合は、起動用のSDカードが必要でした。(やる方法はあるかもしれませんが断念)今回は完全USB Boot(SDカードなし)を行うために、NOOBSを使わずにRasbianのみをインストールしました。せっかくなので公式サイトの「Rasberry Pi Imager」という便利なツールを使用しました。

※NOOBSとはラズパイのOSをインストールするためのインストーラです。Raspbianだけでなく他のOSもインストールすることが可能ですが、パティ―ションが複雑になるので、USB 単体での起動を考えている場合は「Rasberry Pi Imager」を使ったインストールがおすすめです。

まず、公式サイトからWindows用の「Rasberry Pi Imager」をダウンロードします。

Raspberry Pi OS – Raspberry Pi

「Rasberry Pi Imager」の起動画面は以下です。
とてもシンプルで悩むところがないです。これぞ究極のインストーラだと思います。

まずはフォーマット済のSDカードをPCに挿します。

次に「CHOOSE OS」ボタンを押してインストールするOSを選択します。今回は「Raspberry Pi OS(32-bit)」を選択しました。

あとは、「CHOOSE SD CARD」ボタンを押してインストール先を選択します。

最後に、「WRITE」を押して、SDカードに書き込めば完了です。

2.OSを最新版にアップデート

書き込みが完了したSDカードをラズパイに挿します。

念のためパッケージ一覧を最新版にアップデートしておきます。

$ sudo apt-get update
$ sudo apt-get full-upgrade

3.ファームウェアをHDDブート対応版にアップデート

Raspberry Pi 4 Model BからBoot用EEPROMが新規搭載されているので、EEPROMを更新することでUSBストレージからの起動が可能になります。

調べてみると、RaspberryPiのブートプロセスは以下のようです。

①ラズパイに電源を入れます。
②GPUが起動して、SoC内のROMに格納されているプログラムを実行します。
③ROM内のプログラムは、SDカードから第一ステージのブートローダ(bootcode.bin)を読み込みL2キャッシュにロードして実行します。
④ bootcode.bin では、SDRAMを有効にして、SDカードからGPUファームウェア(start.elf)をSDRAMにロードして実行します。
※起動時の虹色画面はこのGPUファームウェア読み取った後に表示されているようです。
⑤ start.elfでは、SDカードからconfig.txtを読み出し、CPUの設定を行います。
⑥次に、SDカードからカーネル(kernel*.img)をSDRAMにロードします。
⑦CPUのリセットを解除して、SDRAMにロードしたカーネルの起動処理を開始します。

Raspberry PiのBoot用EEPROMをUSB Boot対応版にすれば、ブートプロセス③~⑥で、SDカード内から読み出しているプログラムがUSBストレージから読み出されるので、起動時のSDカードも必要なくなりますね。

まずファームウェアのバージョンを確認して、必要に応じてアップデートします。

【注意事項】
本設定ではファームウェアの更新を行っています。起動しなくなる可能性がありますので、ご自身の責任で行ってください。

確認時のファームウェアバージョンは「2020-09-03」でした。

$ sudo rpi-eeprom-update
BCM2711 detected
 Dedicated VL805 EEPROM detected
 BOOTLOADER: up-to-date
 CURRENT: 2020年  9月  3日 木曜日 12:11:43 UTC (1599135103)
  LATEST: 2020年  9月  3日 木曜日 12:11:43 UTC (1599135103)
  FW DIR: /lib/firmware/raspberrypi/bootloader/default
 VL805: up-to-date
 CURRENT: 000138a1
  LATEST: 000138a1

アップデートできるファームウェアの種類は以下の設定で変更可能です。

今回は”critical”を選択しました。

アップデートするファームウェアは「/etc/default/rpi-eeprom-update」ファイルで選択できます。また、ファームウェア自体は「/lib/firmware/raspberrypi/bootloader」に格納されています。ファームウェアの種類は以下のようです。

  • critical:最新リリース版で重要なセキュリティやハードウェア互換性のバグ修正
  • stable:ベータテスト後の新機能が含まれている。次期リリース候補
  • beta:開発テスト目的でのバク修正版※自己責任で使用
FIRMWARE_RELEASE_STATUS="critical"

更新プログラムがある場合は、以下コマンドでアップデートできます。
【注意事項】起動しなくなる可能性があるので、アップデートはご自身の責任で行ってください。

$ sudo rpi-eeprom-update -a
$ sudo reboot

現在のEEPROMのバージョンを確認するのは以下のコマンドです。

$ vcgencmd bootloader_version

4.SDカードの中身をHDDにコピー

今回は「SD Card Copier」を使って、SDカードの中身をHDDにコピーします。

Copy From Device(コピー元)でSDカードを指定、
Copy To Device(コピー先)でUSB HDDを指定します。

最後にNew Partition UUIDsにチェックを入れて、startボタンを押します。
※HDDは初期化されるので中身が消えるのでご注意ください。
 SDカードを併用しない場合はNew Partition UUIDsにチェックは不要です。

コピーが完了したらCompleteボタンを押して終了です。

5.起動確認

ラズパイのSDカードを抜きます。

SDカードスロットからSDカードを抜きます。

USB HDDを接続して起動します。

外付けのUSB HDDを接続して起動します。

SDカードなしでUSB HDDから起動できました。

ラズパイのBoot設定を確認してみると、SDカードがない場合はUSBデバイスで起動するようになっています。SDカード戻せば、SDカード優先で起動できます。

$ sudo raspi-config

6 Advanced Options → A6 Boot Order → B1 USB Boot

とりあえず、1TBのHDDを使用したので使用率も1%程度です。HDDの容量的にも心配する必要がないですね。

$ df -h
 ファイルシス   サイズ  使用  残り 使用% マウント位置
 /dev/root        916G  3.1G  867G    1% /
 devtmpfs         1.8G     0  1.8G    0% /dev
 tmpfs            1.9G     0  1.9G    0% /dev/shm
 tmpfs            1.9G   17M  1.9G    1% /run
 tmpfs            5.0M  4.0K  5.0M    1% /run/lock
 tmpfs            1.9G     0  1.9G    0% /sys/fs/cgroup
 /dev/sda1        253M   46M  207M   18% /boot
 tmpfs            378M     0  378M    0% /run/user/1001
 tmpfs            378M     0  378M    0% /run/user/109

stable(安定版)でUSBブートができるようになったので、あっさりと起動することができました。

これでSDカードの寿命を気にせずに使用することができます。

暫く稼働させてから安定性を確認してみようと思います。

消費電力を考えるとSDカードの方が優位性があるけど、耐久性を考えると・・・

選択の幅が広がったので用途に応じて使い分けができそうです。

SDカードの長寿命化については、以下記事を参照ください。

以下は、再インストールが手間だったので、NOOBS版でUSB HDDブートを試した時のメモです。

【おまけ】NOOBS版でのUSB HDDブート設定

NOOBS を使ってインストールしたものをUSB HDDブートしようと試したときのメモです。起動用のSDカードを併用すれば、USB HDDから起動することは可能です。

ただ、SDカードなしの完全ブートはできませんでした・・・

その時にやったことをメモとして残しておきます。SDカードは起動用にしか使用しないので、SDカードの延命には有効だと思います。

やり方としては、

①UUID と PARTUUID を blkid コマンドで確認

$ blkid
 /dev/sda6: LABEL_FATBOOT="boot" LABEL="boot" UUID="EC3D-B9BC" TYPE="vfat" PARTUUID="000260e2-06"
 /dev/sda7: LABEL="root" UUID="9b9eb9ed-4955-4443-a89d-4b388cc8f64d" TYPE="ext4" PARTUUID="000260e2-07"

②blkidコマンドで調べた内容を元に、SD カード内の /boot/cmdline.txtを編集します。
 ”boot=/dev/sda6/”と”root=/dev/sda7″を追記

console=tty1 boot=/dev/sda6 root=/dev/sda7 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-seria    l-consoles

USB HDD内の/etc/fstabをUSB HDD領域に変更します。

/dev/sda6  /boot           vfat    defaults          0       2
/dev/sda7  /               ext4    defaults,noatime  0       1

「SD Card Copier」を使って、SDカードの内容をUSB HDDにコピーします。

コピー後のUSB HDDを確認

$ sudo fdisk -l
Disk /dev/sda: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
 Disk model: Generic
 Units: sectors of 1 * 512 = 512 bytes
 Sector size (logical/physical): 512 bytes / 4096 bytes
 I/O size (minimum/optimal): 4096 bytes / 4096 bytes
 Disklabel type: dos
 Disk identifier: 0x000260e2
 Device     Boot   Start        End    Sectors   Size Id Type
 /dev/sda1          8192    5015625    5007434   2.4G  c W95 FAT32 (LBA)
 /dev/sda2       5015626 1953525167 1948509542 929.1G  5 Extended
 /dev/sda5       5021696    5087229      65534    32M 83 Linux
 /dev/sda6       5087232    5611517     524286   256M  c W95 FAT32 (LBA)
 /dev/sda7       5611520 1953525167 1947913648 928.9G 83 Linux

SDカードを併用することで、USB HDDからの起動が可能になりました。USBブートに対応していないモデルでもこちらの方法だといけそうですね。

時間があるときにもう少し深堀してみようと思います。

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA