PINE64

PINE64にunionfs-fuseでRead-Onlyな環境を作る

More than 1 year has passed since last update.

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環境を準備可能ですので参考にどうぞ。

参考