CUBE SUGAR CONTAINER

技術系のこと書きます。

Raspberry Pi のファイルシステムを RAM ディスクで運用する

一般的に Raspberry Pi は SD カードにファイルシステムを構築して動作させることが多い。 ただ、SD カードには書き込み回数に制限があるため、製品やワークロードによっては寿命に到達するリスクがある。 また、SD カードに固有の問題ではないものの、不意の電源断などでファイルシステムが破損するリスクもある。

上記のようなリスクを低減するためにファイルシステム全体を RAM ディスクで運用する方法が考えられる。 SD カードのファイルシステムを読み取り専用にした上で、そこからの差分をオンメモリのファイルシステム (tmpfs) で読み書きする。 こうしておくと、普段は SD カードへの書き込みが生じないため SD カードの書き込み回数を消費しない。 また、SD カードのファイルシステムは読み取り専用なので、電源断が生じても破損するリスクを下げられる。

デメリットとして、当然のことながらオンメモリで管理している差分は電源が切れると揮発してしまう。 つまり、RAM ディスクを有効にしている間に書き込んだログや設定は消えてしまう。

Raspberry Pi OS (Trixie) にはファイルシステム全体を RAM ディスクで運用するための機能が公式で用意されている。 今回はその使い方を見ていく。

使った環境は次のとおり。 筐体は Raspberry Pi 5 のメモリが 8GB のモデルになる。

$ cat /etc/*-release
PRETTY_NAME="Debian GNU/Linux 13 (trixie)"
NAME="Debian GNU/Linux"
VERSION_ID="13"
VERSION="13 (trixie)"
VERSION_CODENAME=trixie
DEBIAN_VERSION_FULL=13.2
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
$ uname -srm
Linux 6.12.47+rpt-rpi-2712 aarch64

もくじ

RAM ディスクを有効にする

RAM ディスクを有効にするには、管理者権限で raspi-config コマンドを実行する。

$ sudo raspi-config

以下のように選択肢を選んでいく。

4 Performance Options

P2 Overlay File System Enable/disable read-only file system

Would you line the overlay file system to be enabled?

<はい>

The overlay file system is enabled.

<了解>

Would you like the boot partition to be write-protected?

どちらでも良いが安全側に倒すのであれば <はい>

The boot partition is read-only.

<了解>

<Finish>

Would you like to reboot now?

<はい>

ここまででデバイスが再起動する。

動作を確認する

再起動後にファイルシステムの状態を確認すると /overlayroot のファイルシステムで 4GB の容量になっている。

$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
udev             3.9G     0  3.9G    0% /dev
tmpfs            1.6G   15M  1.6G    1% /run
/dev/mmcblk0p2   117G  8.4G  104G    8% /media/root-ro
tmpfs-root       4.0G  4.6M  4.0G    1% /media/root-rw
overlayroot      4.0G  4.6M  4.0G    1% /
tmpfs            4.0G  368K  4.0G    1% /dev/shm
tmpfs            5.0M   48K  5.0M    1% /run/lock
tmpfs            1.0M     0  1.0M    0% /run/credentials/systemd-journald.service
tmpfs            4.0G   16K  4.0G    1% /tmp
...

/etc/fstab を見ると、どのように実現されているかが分かりやすい。

$ grep overlay /etc/fstab 
#  This fstab is for overlayroot. The real one can be found at
#      sudo overlayroot-chroot
proc /proc proc defaults 0 0 # overlayroot:fs-virtual
PARTUUID=edd367c7-01 /boot/firmware vfat defaults,ro 0 2 # overlayroot:fs-unsupported
/media/root-ro/ / overlay lowerdir=/media/root-ro/,upperdir=/media/root-rw/overlay/,workdir=/media/root-rw/overlay-workdir/_ 0 1

OverlayFS を使って、次のようにディレクトリを重ね合わせている。

  • lowerdir
    • /media/root-ro/
  • upperdir
    • /media/root-rw/overlay/,
  • workdir
    • /media/root-rw/overlay-workdir/_

マウントされている状態を確認すると、/media/root-ro が SD カードのファイルシステムになっている。 ro フラグがついているので読み取り専用でマウントされている。

$ mount | grep root-ro
/dev/mmcblk0p2 on /media/root-ro type ext4 (ro,relatime)
overlayroot on / type overlay (rw,relatime,lowerdir=/media/root-ro,upperdir=/media/root-rw/overlay,workdir=/media/root-rw/overlay-workdir/_,uuid=on)

/media/root-rw の方は tmpfs で作成されたファイルシステムになっている。 こちらは rw フラグなので読み書きができる。

$ mount | grep root-rw
tmpfs-root on /media/root-rw type tmpfs (rw,relatime)
overlayroot on / type overlay (rw,relatime,lowerdir=/media/root-ro,upperdir=/media/root-rw/overlay,workdir=/media/root-rw/overlay-workdir/_,uuid=on)

以上のように、SD カードのファイルシステムをベースにして、その上に tmpfs のファイルシステムを重ねているようだ。

RAM ディスクを無効にする

RAM ディスクの状態を解除したいときは、有効にしたときと逆をすれば良い。

つまり、管理者権限で raspi-config を実行する。

$ sudo raspi-config

そして Would you line the overlay file system to be enabled?<いいえ> を選択すれば良い。

デバイスを再起動すれば RAM ディスクの状態が解除されている。

参考

なお、OverlayFS 自体への理解は以下が参考になるかもしれない。

blog.amedama.jp

いじょう。