SDカード(システムディスク)をリードオンリーで運用したい場合のお手軽な方法を紹介。
/etc/fstab に対するSystemdの処理なので、Raspberry Pi 以外でも使えます!
尚、 このサイトのサーバー 及び ルーター は、ここで紹介する方法でシャットダウンフリー化したRaspberry Pi 2 Model B(2018年2月~ Raspbian Stretch,2019年7月~ Raspbian Buster,2021年12月~ Raspbian Bullseye)上で動作しています。
○.概要
・システムSDカードを読み取り専用とした上で、書き込み処理が必要なディレクトリーを選択してOverlayfsによりtmpfs上で運用する。
・Filesystem in Userspace (FUSE)を活用し、fstabにて上記Overlayfsをマウント指示。
・fstabのルートパーティションのマウントオプションが読み取り専用"ro"で無い場合は通常起動。
swapの無効化、/fsprotectの作成等は済んでいる事が前提です。
また、/proc/filesystemsにoverlayが無い場合は、モジュールのロード(modprobe overlay)が必要です。
1.パッケージの追加
FUSEマウントのためにfuseを追加。
sudo apt-get install fuse
/sbin/mount.fuse をoverlayマウント時に使用します。
2./usr/local/bin/mount_overlay の配置
fstabでのfuseマウントで使用するスクリプトを以下の様な内容で配置。
----------------------
#!/bin/sh
DIR="$1"
ROOT_MOUNT=$( awk '$2=="/" { print substr($4,1,2) }' /proc/mounts )
if [ "$ROOT_MOUNT" = "ro" ]; then
if [ -e "${DIR}" ]; then
# tmpfsを/fsprotect にマウント(注1)
/bin/mount -t tmpfs -o size=320m tmpfs ${DIR}
for d in usr lib etc home root var
do
/bin/mkdir ${DIR}/${d}
/bin/mkdir ${DIR}/${d}_rw
OPTS="-o lowerdir=/${d},upperdir=${DIR}/${d},
workdir=${DIR}/${d}_rw"
/bin/mount -t overlay ${OPTS} overlay /${d}
done
fi
fi
# /var/logを独立してtmpfsに配置したい場合はここでマウント(注2)
/usr/local/bin/make_log_files
exit 0
----------------------