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 ファイルシステム使用量をある一定以上にならないように気をつけてログを消したりするようにしていればいいだろうということがわかります。