SDカードは読み書きを大量にすると寿命が短くなるので耐久性が問題になります。起動ディスクをHDDに変更できれば、SDカードの耐久性を心配する必要もなくなります。
そこで、今回はSDカードなしでUSB HDDから起動する方法を試したので紹介します。
【注意事項】
本設定ではファームウェアの更新を行っています。起動しなくなる可能性がありますので、ご自身の責任で行ってください。
設定手順は以下です。
- OS(Rasbian)のインストール
- OSを最新版にアップデート
- ファームウェアをHDDブート対応版にアップデート
- SDカードの中身をHDDにコピー
- 起動確認
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カードを抜きます。
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ブートに対応していないモデルでもこちらの方法だといけそうですね。
時間があるときにもう少し深堀してみようと思います。