動機
Raspberry Piをいつでも強制電源オフしてよいシステムにしつつデータの読み書きはできるパーティションが欲しかった。
用意するもの
- Raspberry Pi
- Micro SD Card
- Linuxが起動するマシンもしくは仮想マシン
準備
RaspbianをSDカードに焼いてRaspberry Piに挿して起動し、パーティションが自動で拡張されるところまでやっておく。そしたら電源をオフしてSDカードを取り外す。
パーティションの作成
Raspberry Pi上ではパーティションの操作ができないので、Linuxが動くマシンもしくは仮想マシンで行う。ここではmacOSのParallels上にインストールしたUbuntu 20.04の例で行う。
SDカードを確認
MacにSDカードを挿し、Parallels上のUbuntuに接続、bootとrootfsが自動でマウントされるのを確認。
gpartedをインストール、起動
$ sudo apt-get update
$ sudo apt-get gparted -y
$ sudo gparted
パーティションの作成とフォーマット
gpartedの右上のメニューからSDカードを選択。
rootfs(File Systemがext4のもの)をクリックして選択。
rootfs右クリックしてメニューからunmountを選択。
rootfsを右クリックしてメニューからResize/Moveを選択。
rootfsのサイズを縮小してResize/Moveボタンをクリック。この例では1024MB縮小。
PartitionメニューからNewを選択、File systemをfat32に、LabelをmydataとしてAddをクリック。
ここまでで下記の様になっているはず。
EditメニューからApply All Operationsを選択。
Applyをクリック。
処理が終わるまで待つ。時間がかかるかもしれない。
終わったら、Closeをクリック。
パーティションの作成とフォーマットが完了。
SDカードを取り出しMacに挿し直し、接続先をMacに変更。ディスクユーティリティを起動してできたパーティションを確認。
SDカードをMacから取り外す。
Raspberry Piで自動マウントする
Raspberry PiにSDカードを挿して電源を入れ、sshでログインする。このままではマウントされないので、/etc/fstabで設定をする。
$ sudo nano /etc/fstab
下記の様になっていると思うので、1行追加する。
proc /proc proc defaults 0 0
PARTUUID=9729c2e1-01 /boot vfat defaults 0 2
PARTUUID=9729c2e1-02 / ext4 defaults,noatime 0 1
# a swapfile is not a swap partition, no line here
# use dphys-swapfile swap[on|off] for that
PARTUUIDの前半部分は前の2つのコピーで、後半の数字は1足した値にする。
proc /proc proc defaults 0 0
PARTUUID=9729c2e1-01 /boot vfat defaults 0 2
PARTUUID=9729c2e1-02 / ext4 defaults,noatime 0 1
PARTUUID=9729c2e1-03 /mydata vfat auto,exec,umask=000 0 1
ここで保存。Raspberry Piを再起動し、sshでログインし直して/mydataが読み書き可能でマウントされていることを確認。
Overlay FSを使用してROM化
$ sudo raspi-config
Performance Optionsを選択。
P3 Overlay File Systemを選択。
Yesで。
終わったらOkで。
Would you like the boot partition to be write-protected?と聞かれるのでNoで。
その後raspi-configを終了して再起動。これ以後、書込みはすべてRAMディスク上に行われるので再起動すると保存されていないので注意。元に戻すには、raspi-configのPerformance OptionsでOverlay FSを無効にして再起動。
eMMCの場合
seeed reTerminalのようにRaspberry PiがCompute Module版でeMMCの場合、rpibootでストレージとして認識できるようにしてから行う。
Linuxの場合
$ sudo apt-get install libusb-1.0.0-dev
$ sudo apt-get install git
$ git clone https://github.com/raspberrypi/usbboot
$ cd usbboot
$ make
$ sudo make install
$ rpiboot
あとは上記のgpartedの部分から同じ。
macOS Big Surの場合
brewでlibusbがインストールできないので、ソースからビルド。
$ git clone https://github.com/libusb/libusb.git
中にXcodeのプロジェクトが入っているので、それをXcodeで開いてProduct->Archiveでビルド。
↑こんな風にできあがってるので、libusb.hを/usr/local/includeにコピー、libusb-1.0.0.dylibを/usr/local/libにコピー。
次にrpibootをビルド
$ git clone https://github.com/raspberrypi/usbboot
$ cd usbboot
main.cの一番最初の行を
#include <libusb-1.0/libusb.h>
↓
#include <libusb.h>
に変更、保存。次にMakefileを
rpiboot: main.c msd/bootcode.h msd/start.h msd/bootcode4.h msd/start4.h
$(CC) -Wall -Wextra -g -o $@ $< -lusb-1.0
↓
rpiboot: main.c msd/bootcode.h msd/start.h msd/bootcode4.h msd/start4.h
$(CC) -Wall -Wextra -g -o $@ $< -lusb-1.0.0
に変更、保存。
$ make
$ sudo cp ./rpiboot /usr/local/bin/
$ rpiboot
すると、
Waiting for BCM2835/6/7/2711...
となるので、eMMCが載ってるCompute Moduleをストレージモードにして接続(reTerminalの場合、裏開けてスイッチを変更してから繋ぐ)。
ただし、Macからはなぜかbootパーティションしか見えなかったので、Parallels上でUbuntuを起動してそちらに繋いでgpartedしたらできた(以降は上記のgpartedの部分から同じ)。