SDカードからUSB接続ブートへ変更
古い情報も多く、結構苦労しました。2019年8月時点の情報となります。
SDカードでの運用による信頼性は多くの人が気にしているようです。
ディスクへのアクセス速度もUSB接続にした方が早くなると思います。
以下、一般的な規格などからくる速度目安。
USB接続として、SSDかHDDは、静音、消費電力、温度、耐久性より、ニーズに合わせた選択になると思います。
SDカード CLASS6 | 6MB/S |
SDカード CLASS10 | 10MB/S |
USB2.0 | 60MB/S |
SSD | 470MB/S |
HDD | 140MB/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デバイス構成への移行
- SDカード情報のコピー
- コピーしたデータのデバイスファイル関係設定変更
- 新規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にも対応、今後の使いまわしなども考えても、コストパフォーマンスが良いと思いました。