pi 4 Raspbian OS のUSB-SSDからの起動化

投稿者: | 2019/11/28

背景

pi 4 は通常ボード上のマイクロSDカードから起動するようになっているけど、Raspbian のようなOS を24/7 稼働するとマイクロSDカードでは不安が大きい。

残念ながらRaspberry pi 4 Model B はファームウェアの関係から、現在USB-SSD から直接(マイクロSDカードを介さずに)起動する事は出来ないようだ。

なので起動時にマイクロSDカードから一旦ブートローダーを読み込み、そこからUSB-SSD のOS領域を起動するようにする。

この場合マイクロSDカードは起動時に読み込みだけが行われ、OS起動後は基本的に読み書きが発生しないので、マイクロSDカードの寿命を気にする必要が無くなる。

事前準備 ハードウェア

たまたまMacOS インストール・イメージに使っていた128GB SSD があったので、こちらを流用する事にした。
(MacOSインストールデバイスはUSB メモリスティックでも作成出来たので、SSD は必要なくなっていた)

pi 4 とはUSB-SATA ケーブルで、USB3.0 端子へ接続。

事前確認 パーティション構成

接続したSSD のパーティション構成を確認。

# fdisk -l

今回のSSD に関するパーティション情報は下記の通りであった。

Disk /dev/sda: 119.2 GiB, 128035676160 bytes, 250069680 sectors
Disk model: id State Disk   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 33553920 bytes
Disklabel type: gpt
Disk identifier: 6841264A-7343-40D3-AC7B-EE00D3815829

Device      Start       End   Sectors  Size Type
/dev/sda1      40    409639    409600  200M EFI System
/dev/sda2  409640 250069639 249660000  119G unknown

一応問題無さそうだったので、/dev/sda2 にOS領域を置くことにした。

マイクロSDカード側のパーティション構成は下記の通りであった。

Device         Boot   Start       End   Sectors   Size Id Type
/dev/mmcblk0p1        32768   5039062   5006295   2.4G  e W95 FAT16 (LBA)
/dev/mmcblk0p2      5039063 249737215 244698153 116.7G  5 Extended
/dev/mmcblk0p5      5046272   5111805     65534    32M 83 Linux
/dev/mmcblk0p6      5111808   5636093    524286   256M  c W95 FAT32 (LBA)
/dev/mmcblk0p7      5636096 249737215 244101120 116.4G 83 Linux

なので、OS領域は/dev/mmcblk0p7 にあるので、これをソースとし、ディスティネーションを /dev/sda2 とすれば良い事が判った。

OS領域をSD からUSB-SDD へコピー

下記をコマンド実行を実施

# OS root 領域をSD からUSB-SDD へコピー
dd if=/dev/mmcblk0p7 of=/dev/sda2 bs=32M conv=noerror,sync

# エラーチェック
e2fsck -f /dev/sda2
e2fsck -f /dev/sda2
resize2fs /dev/sda2

最初のe2fsck コマンドでの実行結果

# e2fsck -f /dev/sda2
e2fsck 1.44.5 (15-Dec-2018)
root: recovering journal
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
Free blocks count wrong (28287105, counted=28286695).
Fix<y>? yes
Free inodes count wrong (7446190, counted=7446155).
Fix<y>? yes

root: ***** FILE SYSTEM WAS MODIFIED *****
root: 188789/7634944 files (0.2% non-contiguous), 2225945/30512640 blocks
root@myos-pi4:/usr/share/wordpress# 
root@myos-pi4:/usr/share/wordpress# e2fsck -f /dev/sda2
e2fsck 1.44.5 (15-Dec-2018)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
root: 188789/7634944 files (0.2% non-contiguous), 2225945/30512640 blocks
root@myos-pi4:/usr/share/wordpress# 

root@myos-pi4:/usr/share/wordpress# resize2fs /dev/sda2
resize2fs 1.44.5 (15-Dec-2018)
Resizing the filesystem on /dev/sda2 to 31207500 (4k) blocks.
The filesystem on /dev/sda2 is now 31207500 (4k) blocks long.

root@myos-pi4:/usr/share/wordpress# 

幸いな事に問題の出たファイルは少なく、2度目のe2fsck はノーエラーであった。

起動設定ファイルの修正

マイクロSDカード

マイクロSDカードにある’cmdline.txt’ を編集して、USB-SSD 上のパーティションを指すように変更

console=serial0,115200 console=tty1 root=/dev/sda2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles

/etc/fstab の更新

USB-SSD 側の /etc/fstab ファイルを更新しておく。

# mount /dev/sda2 /mnt
# vi /mnt/etc/fstab

編集前

proc            /proc           proc    defaults          0       0
/dev/mmcblk0p6  /boot           vfat    defaults          0       2
/dev/mmcblk0p7  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that

編集後

proc            /proc           proc    defaults          0       0
/dev/mmcblk0p1  /boot           vfat    defaults          0       2
/dev/dsa2       /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that

以上でUSB-SSD から起動するようになった。

# lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda           8:0    0 119.2G  0 disk 
├─sda1        8:1    0   200M  0 part 
└─sda2        8:2    0   119G  0 part /
mmcblk0     179:0    0  29.7G  0 disk 
└─mmcblk0p1 179:1    0  29.7G  0 part /boot

注:後ほどブート用のマイクロSDカードを128GBの物から32GBへ変更した為、マイクロSDカードのパーティションがmmcblk0p7 からmmcblk0p1へ変わっている。

/dev/sda2 のようなデバイス名は、デバイスの差し替え等で変わる事がある為UUID を使った方が良いみたいだけど、今回はこのままで…

# lsblk -o UUID /dev/sda2
UUID
4a260d54-dda3-4ee8-957a-e3679cd17918

変更結果

起動をSSD に変更してから、少しレスポンスが良くなったような気がする。
元々レスポンスはそれなりに良かったので、プラシーボ効果かもしれない。
ただ書き込みは明白に早くなったと感じる。
モジュールのアップデート等がより高速になった気がするからである。

pi 4 Raspbian OS のUSB-SSDからの起動化」への2件のフィードバック

  1. 通りすがりの者

    貴重な情報(USB_SSD 活用索)を公開いただき、ありがとうございました。

    事前によく調べもせず、てっきりRPI 4Bであれば 最初からUSBブートできるものなのだと、、思い込んでいました。 実際に、それを購入して実機で試して あれーーー???
     それゆえ、遅い伝送スピード、さらに経年変化で信頼性に疑問符がつく ”SDカード”からの脱皮(?)を目指して、SDカードをブート専用にして、USB-SSDでのROOTファイルアクセスを試みました。

    当該 投稿内容に救われて、無事 Raspbian Busterのシステムにくわえて、 Ubuntu Server+Mateシステムの両方で、USB-SSDを活用できました。 I/Oスピードが迅速になり、快適なPC代用のRPIデスクトップシステムを享受しており、あきらめずにがんばったことで 良い成果を残せました。
     感謝!!!

    返信
    1. マッタカ 投稿作成者

      コメント頂きありがとうございます。
      私の備忘録がお役に立ちました様で嬉しい限りです。
      本当にPRI4B で直接USBブート出来ないのは謎ですよね。
      将来ファームアップで対応される事を切に願っています。

      仰る様にRPI4B のI/O(USB3, GB Earthernet)強化は、
      PCやサーバーとして充分なもので活用のしがいがあると思います。
      安価、コンパクトで小消費電力、安定したハードウェア・ソフトウェア環境等
      使い出があり、IoT 等の機器制御まで楽しめる素晴らしいプラットフォーム
      であると今でも実感しています。

      下記URLにて、RPI4B WEBサーバーを立ち上げています。
      7/24 で数ヶ月運用していますが全く問題無く稼働しています。
      お時間がありましたらアクセスしてみて下さい。
      WEBサーバーとして全く遜色の無いレスポンスだと思います。

      http://pi4.mattaka.com:8080/wp/

      返信

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください