コンテンツへスキップ

Raspberry Pi 3B + SDカードブートからUSBブートへ変更

SDカードからUSB接続ブートへ変更

古い情報も多く、結構苦労しました。2019年8月時点の情報となります。
SDカードでの運用による信頼性は多くの人が気にしているようです。
ディスクへのアクセス速度もUSB接続にした方が早くなると思います。

以下、一般的な規格などからくる速度目安。
USB接続として、SSDかHDDは、静音、消費電力、温度、耐久性より、ニーズに合わせた選択になると思います。

SDカード
CLASS6
6MB/S
SDカード
CLASS10
10MB/S
USB2.060MB/S
SSD470MB/S
HDD140MB/S
USB3.0(参考)640MB/S

注意事項

今回、SDカードなしのUSBデバイスのみの構成とはしませんでした。
SDカードなしのUSBデバイスの直接ブートは、センシティブでした。
Raspberry Pi 3B +は、標準でUSBブート対応という内容も散見されましたが、他USB接続しているデバイスや、接続ポート、USBハブ経由、直接接続など条件によりブート可能であったり不可能であったりしました。
SDカードなしのUSBデバイスのみ構成構築時には、Raspberry PiUSBデバイスに綺麗なブートイメージを作成し、他USBデバイスを接続せずに、SDカードなしでブート可能か確認し、最終的な接続機器を設定・接続した状態での再起動テストをお勧めします。
試行錯誤の結果、ブート時間起動処理の信頼性を考え、SDカードにブートコードを格納し、USBデバイスを利用する方法での運用に移行しました。

USBデバイスへのブートイメージ作成には、Etcherを利用します。

SDカードブート構成からUSBデバイス構成への移行

  1. SDカード情報のコピー
  2. コピーしたデータのデバイスファイル関係設定変更
  3. 新規SDカードに「bootcode.bin」を書込み  GitHub

SDカード情報のコピー

新規SDカードにパーティションを作成します。

  • /dev/sda ブート領域、100M
  • /dev/sdb ルート領域、ブート領域100Mを除いた残りのディスクスペース
root@raspberrypi:~# parted /dev/sda
GNU Parted 3.2
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mktable msdos
Warning: The existing disk label on /dev/sda will be destroyed and all data on
this disk will be lost. Do you want to continue?
Yes/No? yes
(parted) mkpart primary fat32 0% 100M
(parted) mkpart primary ext4 100M 100%
(parted) print
Model: StoreJet StoreJet Transce (scsi)
Disk /dev/sda: 120GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number Start End Size Type File system Flags
1 1049kB 99.6MB 98.6MB primary fat32 lba
2 99.6MB 120GB 120GB primary ext4 lba

(parted) quit
Information: You may need to update /etc/fstab.

作成したパーティションをフォーマットします。

  • /dev/sda FAT32のWindowsフォーマット
  • /dev/sdb Ext4の標準的なLinuxフォーマットinode, jounalなどは標準で良いです
root@raspberrypi:~# mkfs.vfat -n BOOT -F 32 /dev/sda1
mkfs.fat 4.1 (2017-01-24)
root@raspberrypi:~# mkfs.ext4 /dev/sda2
mke2fs 1.44.5 (15-Dec-2018)
Creating filesystem with 29280768 4k blocks and 7323648 inodes
Filesystem UUID: 8becaa42-5ad3-4bca-bcb2-6bdf1f371aeb
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872

Allocating group tables: done
Writing inode tables: done
Creating journal (131072 blocks): done
Writing superblocks and filesystem accounting information: done

ファイル内容のコピーに向けて、コピー元、コピー先のマウントを実施。
現在のルート領域と作成したファイル領域をマウントするために、マウントフォルダを作成し、それぞれ、マウントします。

$ sudo mkdir /tmp/usd #作業ディレクトリ
$ sudo mount /dev/mmcblk0p7 /tmp/usd #MicroSDのRaspbianをマウント
$ sudo mkdir -p /mnt/ssd
$ sudo mount /dev/sda2 /mnt/ssd/
$ sudo mkdir /mnt/ssd/boot
$ sudo mount /dev/sda1 /mnt/ssd/boot/

/ Rootルート領域および /bootブート領域をコピーします。

$ (cd /tmp/usd; sudo tar --backup -c *)|sudo tar -C /mnt/ssd -xv
$ (cd /boot; sudo tar --backup -c *)|sudo tar -C /mnt/ssd/boot -xv

コピーしたデータのデバイスファイル関係設定変更

コピーした領域のブート関連ファイルの修正を行います。
comdline.txtファイルの「root」ディレクトリを「 /dev/sda2」へ変更します。

root@raspberrypi:/mnt/ssd/boot# vi cmdline.txt
root@raspberrypi:/mnt/ssd/boot# cat cmdline.txt
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/sda2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

fstabの「/boot」および 「/」ルートディレクトリを、それぞれ、「 /dev/sda1」および「/dev/sda2」へ変更します。

root@raspberrypi:/mnt/ssd/boot# vi /mnt/ssd/etc/fstab
root@raspberrypi:/mnt/ssd/boot# cat /mnt/ssd/etc/fstab
proc /proc proc defaults 0 0
/dev/sda1 /boot vfat defaults 0 2
/dev/sda2 / ext4 defaults,noatime 0 1

新規SDカードに「bootcode.bin」を書込み GitHub

容量の小さなSDカードに、「bootcode.bin」を書き込みます。
※ 他ファイルを書き込む必要はありません。/bootの内容も不要です。

「bootcode.bin」は、GitHubよりダウンロードし、SDカードに書き込んでください。

参考にさせて頂いたサイト

USB接続のSSDデバイス

USB Type-Cにも対応、今後の使いまわしなども考えても、コストパフォーマンスが良いと思いました。

コメントを残す

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

CAPTCHA