Raspberry Piと同じようにPINE64はSDカードを起動及び保存用のストレージとして利用します。
家庭内サーバーとして利用する場合にはSDカードの寿命が気になります。
今回はSDカードを延命させるため、Raspberry Pi等で行われているunionfs-fuseを用いたRead-Only化を実施してみました。
事前準備
- 公式Wikiを参考にDebianまたはUbuntuを導入
以下の作業はUbuntu環境で確認しています。
unionfs-fuseをインストール
# apt-get install unionfs-fuse
/etc/fstabを編集
更新前
/etc/fstab
# <file system> <dir> <type> <options> <dump> <pass>
/dev/mmcblk0p1 /boot vfat defaults 0 2
/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
更新後
/etc/fstab
# <file system> <dir> <type> <options> <dump> <pass>
/dev/mmcblk0p1 /boot vfat ro,defaults 0 2
/dev/mmcblk0p2 / ext4 ro,defaults,noatime 0 1
mount_unionfs /etc fuse defaults 0 0
mount_unionfs /var fuse defaults 0 0
tmpfs /tmp tmpfs defaults,size=64m,noatime,mode=1777 0 0
マウント用スクリプト作成
/usr/local/bin/mount_unionfs
#!/bin/sh
DIR=$1
ROOT_MOUNT=$(awk '$2=="/" {print substr($4,1,2)}' < /etc/fstab)
if [ $ROOT_MOUNT = "rw" ]
then
/bin/mount --bind ${DIR}_org ${DIR}
else
/bin/mount -t tmpfs ramdisk ${DIR}_rw
/usr/bin/unionfs-fuse -o cow,allow_other,suid,dev,nonempty ${DIR}_rw=RW:${DIR}_org=RO ${DIR}
fi
実行権限設定
# chmod +x /usr/local/bin/mount_unionfs
ディレクトリ準備
# cp -a /etc /etc_org
# cp -a /var /var_org
# mkdir /etc_rw
# mkdir /var_rw
書き込み/更新用スクリプト作成
/usr/local/bin/rwmount
mount -o remount,rw /
mount -o remount,rw /boot
fusermount -u -z /var
fusermount -u -z /etc
/usr/local/bin/cporg
cp -a /etc/* /etc_org
cp -a /var/* /var_org
sync
実行権限設定
# chmod +x /usr/local/bin/rwmount
# chmod +x /usr/local/bin/cporg
再起動
# reboot
Read-Onlyの確認
# mount
/dev/mmcblk0p2 on / type ext4 (ro,noatime,stripe=1024,data=ordered)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devtmpfs on /dev type devtmpfs (rw,nosuid,size=984988k,nr_inodes=246247,mode=755)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,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)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
mqueue on /dev/mqueue type mqueue (rw,relatime)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime)
tmpfs on /tmp type tmpfs (rw,noatime,size=65536k)
fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime)
configfs on /sys/kernel/config type configfs (rw,relatime)
ramdisk on /etc_rw type tmpfs (rw,relatime)
ramdisk on /var_rw type tmpfs (rw,relatime)
unionfs-fuse on /var type fuse.unionfs-fuse (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other)
unionfs-fuse on /etc type fuse.unionfs-fuse (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other)
/dev/mmcblk0p1 on /boot type vfat (ro,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro)
tmpfs on /run/user/108 type tmpfs (rw,nosuid,nodev,relatime,size=203708k,mode=700,uid=108,gid=114)
gvfsd-fuse on /run/user/108/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=108,group_id=114)
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=203708k,mode=700,uid=1000,gid=1000)
書き込みモードへの変更し、更新を実施する手順
# rwmount
# -- 書き込み作業 --
# cporg
# reboot
最後に
買ったは良いが使い方がイメージ出来ていなかったPINE64を家庭内サーバーとして使用するためにRead-Only環境を準備してみました。
まだ理解できていない部分があり、余計なことをしているかもしれませんので、こうしたら良いよ!等のツッコミをお待ちしております。
Raspberry Piも同様の手順でRead-Only環境を準備可能ですので参考にどうぞ。