ラズパイ:シャットダウンフリー overlay編(fuse無し)

Linuxで最初に動くプログラムである/sbin/initは、/lib/systemd/systemdへのシンボリックリンクになっているが、これをスクリプトにして調整事項を挟み込んでしまえば、fuseは不要となる。fuse+overlay編よりも調整の手間が少ないので、私はこちらの方が好きだが、こちらも実績は薄いので、自己責任で、ラズパイが手に届く範囲での利用を推奨する。
なお、元の環境でapt updateを実施すると、/sbin/initはシンボリックリンクに戻ることがある。これで環境が崩れるのを避けるため、ここでは、/sbin/myinitを起動調整スクリプトとし、/boot/cmdline.txtに「init=/sbin/myinit fastboot ro」を追記することとする。fstabもoverlay専用のものを作り、元のfstabには触れないこととする。

前提:準備①〜③、⑤が完了していること。fuseは不要。

~# dosfslabel /dev/mmcblk0p1 boot
~# e2label /dev/mmcblk0p2 rootfs

~# mount -oremount,rw /boot
~# cp -a /boot/cmdline.txt /boot/cmdline.txt.orig

/boot/cmdline.txt:

・・・・・ init=/sbin/myinit fastboot ro


/etc/fstab_overlay:

# overlay用の/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
# /tmpもroになるのでtmpfsにする
tmpfs         /tmp     tmpfs defaults             0 0


/sbin/myinit:

#!/bin/bash
## /.overlayが存在すればoverlayにする。
if [ -e /.overlay ] && [ -d /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
    ## overlay用の/etc/fstabを設定。overlay化済みのため元ファイルは消えない。
    [ -e /etc/fstab_overlay ] && mv -f /etc/fstab_overlay /etc/fstab
    ## overlay用のログインロゴがあれば設定
    [ -e /etc/issue_overlay ] && mv -f /etc/issue_overlay /etc/issue
    [ -e /etc/motd_overlay ] && mv -f /etc/motd_overlay /etc/motd
    #### 任意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/
fi
## Start Systemd
exec /lib/systemd/systemd

~# chmod +x /sbin/myinit ← 忘れずに!


シャットダウンフリー環境へ移行:
~# mkdir /overlay
~# touch /.overlay
~# reboot


元の環境に戻す:
~# mount -oremount,rw /
~# rm /.overlay
~# reboot
または、/boot/cmdline.txtを元に戻してreboot。



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

# 非インタラクティブではechoしない方がいいので
if [[ $- != *i* ]]; then return; fi

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




2019-02-16 少し改良しました。