Raspberry PiをROM化しつつ読み書き用パーティションを追加する

## 動機 ##
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が自動でマウントされるのを確認。
![Screen Shot 2021-11-14 at 21.50.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/a4634ddd-53ee-0581-46a1-8cdbb9428efd.png)

### gpartedをインストール、起動 ###
```
$ sudo apt-get update
$ sudo apt-get gparted -y
$ sudo gparted
```

### パーティションの作成とフォーマット ###
gpartedの右上のメニューからSDカードを選択。
![Screen Shot 2021-11-14 at 21.56.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/f85b589a-52b6-d76d-3a78-2c6fcb16cb01.png)
rootfs(File Systemがext4のもの)をクリックして選択。
![Screen Shot 2021-11-14 at 22.00.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/419e06a7-4ae8-4380-64dc-b28eafff691e.png)
rootfs右クリックしてメニューからunmountを選択。
![Screen Shot 2021-11-14 at 22.04.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/13cd6146-7bdb-2f05-fb5f-c63fd554b9cf.png)
rootfsを右クリックしてメニューからResize/Moveを選択。
![Screen Shot 2021-11-14 at 22.01.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/2e260cc8-e54e-d6e6-10f3-80e91e9789e0.png)
rootfsのサイズを縮小してResize/Moveボタンをクリック。この例では1024MB縮小。
![Screen Shot 2021-11-14 at 22.05.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/5ce149a9-1281-003a-643f-8ac8693cc541.png)
PartitionメニューからNewを選択、File systemをfat32に、LabelをmydataとしてAddをクリック。
![Screen Shot 2021-11-14 at 22.09.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/790492ac-c2f1-dfa4-293c-37863be4466a.png)
ここまでで下記の様になっているはず。
![Screen Shot 2021-11-14 at 22.10.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/4efdb95e-9f89-fab7-6877-889018c0f6e9.png)
EditメニューからApply All Operationsを選択。
![Screen Shot 2021-11-14 at 22.11.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/f670c6f8-95a8-9368-cce0-6160f6618e15.png)
Applyをクリック。
![Screen Shot 2021-11-14 at 22.12.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/ea076fcc-47fc-31bc-ce66-d965d114ecf6.png)
処理が終わるまで待つ。時間がかかるかもしれない。
![Screen Shot 2021-11-14 at 22.13.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/9a78ad21-0171-fdbb-d902-9e6e289997fa.png)
終わったら、Closeをクリック。
![Screen Shot 2021-11-14 at 22.14.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/0dd859f7-b73b-177c-ef99-0a9fc8573f1a.png)
パーティションの作成とフォーマットが完了。
![Screen Shot 2021-11-14 at 22.14.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/5f731206-a282-061c-ac8e-fe105ce616fd.png)
SDカードを取り出しMacに挿し直し、接続先をMacに変更。ディスクユーティリティを起動してできたパーティションを確認。
![Screen Shot 2021-11-14 at 22.19.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/b1a9e1f6-cd69-f29e-8c9d-a27c4ecb0563.png)
SDカードをMacから取り外す。

### Raspberry Piで自動マウントする ###
Raspberry PiにSDカードを挿して電源を入れ、sshでログインする。このままではマウントされないので、/etc/fstabで設定をする。

```
$ sudo nano /etc/fstab
```

下記の様になっていると思うので、1行追加する。

```/etc/fstab.
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足した値にする。

```/etc/fstab.
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が読み書き可能でマウントされていることを確認。
![Screen Shot 2021-11-14 at 22.46.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/8a80835d-e886-7d58-0906-6873d5378e65.png)

### Overlay FSを使用してROM化 ###

```
$ sudo raspi-config
```
Performance Optionsを選択。
![Screen Shot 2021-11-14 at 22.37.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/d7bf76b6-1b7f-1335-f764-0e26b7b57898.png)
P3 Overlay File Systemを選択。
![Screen Shot 2021-11-14 at 22.38.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/d8066ff2-7557-85d0-6a3c-b6d200d1448f.png)
Yesで。
![Screen Shot 2021-11-14 at 22.42.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/53a75593-a939-7d81-f459-86852109bb22.png)
終わったらOkで。
![Screen Shot 2021-11-14 at 22.42.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/57ac7279-bced-a3ff-f72c-f60700458646.png)
Would you like the boot partition to be write-protected?と聞かれるのでNoで。
![Screen Shot 2021-11-14 at 22.43.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/ac1b6f0a-dc8a-dce5-4557-e4c8bb05c55a.png)
その後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でビルド。
![Screen Shot 2021-11-15 at 2.10.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/0b58bb35-dd6f-155e-0b9c-3ac477c6351e.png)
↑こんな風にできあがってるので、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の一番最初の行を

```main.c
#include <libusb-1.0/libusb.h>
↓
#include <libusb.h>
```

に変更、保存。次にMakefileを

```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の部分から同じ）。