Raspberry Pi で Overlay File System (read-only file system) を試す

Raspberry Pi で通常は SD カード中にファイルシステムが入っているが、破損を防ぐために Read Only にしたい。
Read Only といっても、通常使用と同じようにアプリケーションからはファイルシステムに書き込みができているように見える。その際実際に書き込みしているのは RAM ディスクであり、変更を加えたところだけ RAM ディスクが Overlay となる。

実現方法にはいろいろあるが、最近の RaspberryPi では raspi-config で簡単に設定できるようだ。
そうやって実現した Overlay File System、長期で動かしたらどうなるのだろうか? Overlay 容量はどのように使われていくのか、容量を超えた場合にどうなるか試してみました。


# 環境

```
$  lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 11 (bullseye)
Release:	11
Codename:	bullseye
$ cat /proc/device-tree/model
Raspberry Pi 3 Model B Plus Rev 1.3
```

メモリは1GBytes実装されています。

# 設定

```
$ sudo raspi-config
```


「 4 Performance Options  Configure performance settings」
↓
「P3 Overlay File System Enable/disable read-only file system」
↓
「Would you like the overlay file system to be enabled?」 を 「Yes」 
↓
「 Would you like the boot partition to be write-protected?」 を 「Yes」

として、再起動します。


# 再起動後の状況

```
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            329M     0  329M   0% /dev
tmpfs            93M  768K   92M   1% /run
overlay         462M  261M  202M  57% /
tmpfs           462M     0  462M   0% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
/dev/mmcblk0p1  253M   59M  194M  24% /boot
tmpfs            93M     0   93M   0% /run/user/1000
```

これの、overlay のサイズが 462M、57%利用中と出てきます。

# 書き込みすると

これ、書き込み・消去を繰り返しているとどんどん overlay が消費されてしまうのではないかな?

10MBytes のファイルを書き込んでみます。

```
$ dd if=/dev/zero of=tempfile bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.0547623 s, 191 MB/s
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            329M     0  329M   0% /dev
tmpfs            93M  768K   92M   1% /run
overlay         462M  271M  192M  59% /
tmpfs           462M     0  462M   0% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
/dev/mmcblk0p1  253M   59M  194M  24% /boot
tmpfs            93M     0   93M   0% /run/user/1000
```
10MBytes 分 overlay が減ってますね。
書き込んだファイルを削除してみます。

```
$ rm tempfile
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            329M     0  329M   0% /dev
tmpfs            93M  768K   92M   1% /run
overlay         462M  261M  202M  57% /
tmpfs           462M     0  462M   0% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
/dev/mmcblk0p1  253M   59M  194M  24% /boot
tmpfs            93M     0   93M   0% /run/user/1000
```
空きは元に戻りました。ファイル削除すれば、その分すぐ開放となるようですね。
では容量ギリギリまで書き込んでみます。

```
$ dd if=/dev/zero of=tempfile bs=1M count=200
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 0.608022 s, 345 MB/s
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            329M     0  329M   0% /dev
tmpfs            93M  768K   92M   1% /run
overlay         462M  461M  1.6M 100% /
tmpfs           462M     0  462M   0% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
/dev/mmcblk0p1  253M   59M  194M  24% /boot
tmpfs            93M     0   93M   0% /run/user/1000
```

特に問題なくファイル書き込みできました。では、空き容量以上に書き込んでみましょう。

```

$ dd if=/dev/zero of=tempfile bs=1M count=202
dd: error writing 'tempfile': No space left on device
202+0 records in
201+0 records out
211300352 bytes (211 MB, 202 MiB) copied, 0.581513 s, 363 MB/s
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            329M     0  329M   0% /dev
tmpfs            93M  768K   92M   1% /run
overlay         462M  462M     0 100% /
tmpfs           462M     0  462M   0% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
/dev/mmcblk0p1  253M   59M  194M  24% /boot
tmpfs            93M     0   93M   0% /run/user/1000
```
No space で中断したみたいです。もっと書き込んでみます。


```
$ dd if=/dev/zero of=tempfile bs=1M count=1000
dd: error writing 'tempfile': No space left on device
202+0 records in
201+0 records out
211300352 bytes (211 MB, 202 MiB) copied, 0.567772 s, 372 MB/s
```
容量以上に書き込んでも、あらかじめ確保した容量のところでエラーとなるみたいですね。

```
$ free
               total        used        free      shared  buff/cache   available
Mem:          945292      107132       90268      475788      747892      306696
Swap:              0           0           0
```

空き容量はゼロですが、メモリ自体は空きがあり、オペレーションはそのまま継続できます。

以上のことから、長期で使用する場合は overlay ファイルシステム使用量をある一定以上にならないように気をつけてログを消したりするようにしていればいいだろうということがわかります。