Raspberry Piのファイルシステムのリードオンリー化[OverlayFS]

2020年7月30日木曜日

Raspberry Pi

t f B! P L
Raspberry Piの電源をシャットダウンしないで落としたい場合、ファイルシステムのリードオンリー化という手法が良く用いられます。以前はいろいろと設定が面倒な感じだったのですが、最近はraspi-configでサポートされているようなので(https://www.raspberrypi.org/forums/viewtopic.php?f=63&t=253104&sid=15b0f9ae99fdae0cd18f9d21e56df4e3#p1549117)試してみました。

変更前の状態

変更前のRaspbianはstretchでした。

$lsb_release -a
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 9.6 (stretch)
Release:	9.6
Codename:	stretch
しかし、raspi-configのAdvanced OptionsにOverlay FSというメニューが存在しません。そのため、まずRasbianをbusterにバージョンアップすることにします。

stretchからbusterにアップデート

公式サイトのドキュメントにアップデート方法の記載があります(https://www.raspberrypi.org/documentation/raspbian/updating.md)。この方法でアップデートすると、環境によって何らかの問題が発生するかもしれないといった注意書きがありますが、今回はこの方法でアップデートを行いました。まず、/etc/apt/sources.listと/etc/apt/sources.list.d/raspi.listのstretch部分をbusterに変更します。

$sudo vi /etc/apt/sources.list
deb http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi

$sudo vi /etc/apt/sources.list.d/raspi.list
deb http://archive.raspberrypi.org/debian/ buster main ui
次に、apt updateとapt dist-upgradeを実行します。アップデート後、lsb_releaseの表示がbusterになることを確認します。

$sudo apt update
$sudo apt -y dist-upgrade
$lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 10 (buster)
Release:	10
Codename:	buster
実際にアップデートしてみると、かなり時間がかかりました。素直にSDカードに新しくbusterを入れ直した方が良いかも知れません。

OverlayFSの有効化と無効化

有効化

raspi-configからOverlayFSを有効化します。まず、raspi-configを起動して(sudo raspi-config)、Advanced Optionsを選択します。
Overlay FSを選択します。
Overlay FSを有効化します。
有効化されました。
bootパーティションを書き込み禁止にするかどうか選択します。
書き込み禁止にした場合、bootパーティションはリードオンリーになります。

無効化

無効化する場合は、raspi-configで有効化の場合と同様の手順でOverlay FSの項目を選択して無効化します。

dfとmountの差

OverlayFSを有効化すると、dfコマンドのルートファイルシステムがoverlayと表示されます。また、mountコマンドでもルートファイルシステムがoverlayと表示されます。


$df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            427M     0  427M   0% /dev
tmpfs            93M  2.7M   90M   3% /run
overlay         464M  102M  362M  22% /
tmpfs           464M     0  464M   0% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           464M     0  464M   0% /sys/fs/cgroup
/dev/mmcblk0p1   44M   32M   12M  74% /boot
tmpfs            93M     0   93M   0% /run/user/1000

$mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,relatime)
udev on /dev type devtmpfs (rw,nosuid,relatime,size=436832k,nr_inodes=109208,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=94904k,mode=755)
overlay on / type overlay (rw,noatime,lowerdir=/lower,upperdir=/upper/data,workdir=/upper/work)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup2 on /sys/fs/cgroup/unified type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,name=systemd)
none on /sys/fs/bpf type bpf (rw,nosuid,nodev,noexec,relatime,mode=700)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/net_cls type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=27,pgrp=1,timeout=0,minproto=5,maxproto=5,direct)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
sunrpc on /run/rpc_pipefs type rpc_pipefs (rw,relatime)
mqueue on /dev/mqueue type mqueue (rw,relatime)
configfs on /sys/kernel/config type configfs (rw,relatime)
/dev/mmcblk0p1 on /boot type vfat (ro,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro)
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=94900k,mode=700,uid=1000,gid=1000)
OverlayFSを無効化すると、dfコマンドのルートファイルシステムが/dev/rootと表示されます。また、mountコマンドのルートファイルシステムが/dev/mmcblk0p2と表示されます。

$df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root       7.1G  1.6G  5.2G  23% /
devtmpfs        431M     0  431M   0% /dev
tmpfs           464M     0  464M   0% /dev/shm
tmpfs           464M   12M  452M   3% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           464M     0  464M   0% /sys/fs/cgroup
/dev/mmcblk0p1   44M   24M   20M  54% /boot
tmpfs            93M     0   93M   0% /run/user/1000

$mount
/dev/mmcblk0p2 on / type ext4 (rw,noatime)
devtmpfs on /dev type devtmpfs (rw,relatime,size=441236k,nr_inodes=110309,mode=755)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,nodev,mode=755)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup2 on /sys/fs/cgroup/unified type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,name=systemd)
none on /sys/fs/bpf type bpf (rw,nosuid,nodev,noexec,relatime,mode=700)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/net_cls type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=32,pgrp=1,timeout=0,minproto=5,maxproto=5,direct)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
sunrpc on /run/rpc_pipefs type rpc_pipefs (rw,relatime)
mqueue on /dev/mqueue type mqueue (rw,relatime)
configfs on /sys/kernel/config type configfs (rw,relatime)
/dev/mmcblk0p1 on /boot type vfat (ro,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro)
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=94900k,mode=700,uid=1000,gid=1000)

QooQ