背景

Raspberry Piという性質上、シャットダウンを行うことができない環境に置く場合があると思う。
一般的にOSを使用するシステムは、シャットダウンを行ってから電源を切らないと、システムが破損することがある。
これを防ぐために、Raspberry Pi OSでは、「オーバーレイファイルシステム」(Overlay File System)という機能が備わっている。
これを有効にすると、物理ストレージを読み取り専用にしつつ、書き込み要求をRAMに逃がすことができる。
OSから見ると通常通り書き込みを行えるが、実際にはストレージを書き換えていない為、シャットダウンせずに電源を切ってもシステムが壊れにくくなる。(注意:全く壊れないことを保証するものではない)

一方、「シャットダウンが行えないが、書き込み可能な領域がほしい」という需要もあると思う。この場合、システムとは別に書き込み可能な領域を確保することを考えると思う。
ただ、Raspberry Pi OSの「オーバーレイファイルシステム」を通常通り有効化すると、rootファイルシステムだけでなく、その配下にあるマウントポイントまでオーバーレイの影響を受けるようである。
(Debian Bookworm (Debian 12) をベースとするRaspberry Pi OSにて確認)(見かけ上ファイルの保存ができてるため、再起動後にファイルが元に戻っていることに気づいたのは運用して数週間後の話………)

記事の内容

今回は、rootのみを「オーバーレイファイルシステム」とし、他の領域は通常通り利用できるように設定する方法を備忘録としてメモしておく。

注意事項

システムストレージ(一般的にはRaspberry Piに直接接続したMicroSDカード)と書き込み可能な領域は、物理的に別の記憶媒体を使うことを推奨。
システムをインストールしたMicroSDカードをパーティション分けして書き込み可能な領域を作るという話もあるが、NAND Flashを使用する記憶媒体では、論理的なパーティション境界と、物理的なNAND Flashの書き換え単位が一致するとは限らない。そのため、システム領域と書き込み領域を同一の記憶媒体に置いた場合、オーバーレイファイルシステムを使っていても破損することが原理的にありえると私は考えている。

書き換え可能領域において、書き換え途中に電源を切るとファイルは破損するので、破損したファイルを処理に使わないように、アプリケーション側でフェイルセーフの実装(ファイルの破損検知と、それを検知した場合の修復または破棄の実装)は別途必須。btrfsなどのCoWなFSを使うなども選択肢かも。

rootファイルシステムをオーバーレイ化

sudo vi /etc/overlayroot.conf
#overlayroot=""
overlayroot="tmpfs:recurse=0"
sudo reboot

通常化

sudo overlayroot-chroot
vi /etc/overlayroot.conf
overlayroot=""
#overlayroot="tmpfs:recurse=0"
sudo reboot