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 少し改良しました。