ラズパイ:シャットダウンフリー fuse+overlay編

調整の手間が若干少ないoverlay編(fuse無し)も参照の上、どちらを使うか検討下さい。本編では、overlayとfuseFilesystem in Userspace)を使います。ご利用は自己責任で。

前提:準備①〜⑤が終わっていること。

ここで作成・編集するフォルダ/ファイル:

フォルダ/ファイル名 内容
/etc/fstab デフォルトマウントの定義
/usr/local/bin/mount_ov.sh /etc/fstabから呼び出すシェル
/overlay/
/.overlay
overlayの実体
overlayマウントする時のフラグ


⑥ /etc/fstabの調整

LABELで認識させるのは私の趣味だが、raspbianのkernel起動パラメータ(/boot/cmdline.txt)では対応できない様子で中途半端な対応となる。必要に応じてアレンジすること。

準備:

# バックアップ
mv /etc/fstab /etc/fstab_org
cp -a /etc/fstab_org /etc/fstab
# BLocK device IDを確認(任意)
blkid
# ラベル付与
dosfslabel /dev/mmcblk0p1 boot
e2label /dev/mmcblk0p2 rootfs


/etc/fstabを編集(rw→ro):

# overlayfs/fuse用の/etc/fstab
# proc
proc          /proc    proc  defaults             0 0

# 軟弱なFAT領域はroマウント
LABEL=boot    /boot    vfat  ro,defaults          0 2

# rootfsはコメントアウト
#LABEL=rootfs  /        ext4  ro,defaults,noatime  0 1

# fuse+overlay
mount_ov.sh   /overlay fuse nofail,defaults       0 0

# /tmpもroになるのでtmpfsにする
tmpfs         /tmp     tmpfs defaults             0 0


⑦ /usr/local/bin/mount_ov.shを作成

ここではoverlayでrwとするフォルダは/usr /etc /home /root /varとするが、必要に応じてFHSを確認すること。

#!/bin/bash
## /.overlayが存在すればoverlayにする。
if [ -e /.overlay ]; then
    ## /var/logのツリー構成だけを退避
    find /var/log/ -type d | cpio -pdm /dev/shm/
    find /var/log/ -type l | cpio -pdm /dev/shm/
    ## overlayのrw実体となるtmpfsを作成
    mount -t tmpfs tmpfs /overlay
    ## 主要フォルダをoverlay化
    for d in usr etc home root var; do
        mkdir -p /overlay/${d} /overlay/${d}_rw
        OPTS="-o lowerdir=/${d},upperdir=/overlay/${d},workdir=/overlay/${d}_rw"
        mount -t overlay ${OPTS} overlay /${d}
    done
    #### Option-A:退避した/var/logをtmpfsに移動
    mount -t tmpfs tmpfs /var/log
    mv /dev/shm/var/log/* /var/log/
    rm -rf /dev/shm/log
    #### Option-B:退避した/var/logをoverlayfsに移動
    ## rm -rf /var/log
    ## mv /dev/shm/var/log /var/
else
    ## rootfsをrw,noatimeに設定
    mount -o remount,rw,noatime /
fi
exit 0

念の為:

chmod +x  /usr/local/bin/mount_ov.sh


⑧ シャットダウンフリー起動の設定
mkdir /overlay
touch /.overlay
# ↓ディスクチェック無効設定。rwマウント時には消去される。忘れても問題無い。
touch /fastboot 


⑨ その他

元の環境に戻す時:

mount -oremount,rw /
rm /.overlay
reboot

/boot/config.txt, cmdline.txt 編集 or raspi-config実行時:

mount -oremount,rw /boot

$HOME/.bashrcへの追記(任意):

## 非対話モードでは標準出力しない方がいいので
if [[ $- != *i* ]]; then return; fi

findmnt /etc | grep overlay > /dev/null
[ $? == 0 ] && printf "\n<<<< The Overlay Environment! >>>>\n\n"


Reference:
Setting up overlayFS on Raspberry Pi - Domoticz
FilesystemHierarchyStandard - Debian Wiki