ラズパイ:シャットダウンフリー tmpfs-bind編

もし、手の届かない離島に電源ブチ切りラズパイを置くなら、私ならばoverlayもfuseも使わない。理由は、デバイス屋/組込屋としての直感から来る警告だが、ここ に現実に沿ったコメントもある。
以下に紹介する方法は、X-Windowの利用が不要もしくは削除されているようなラズパイを、長期安定運用する場合などに適する。一方で、手に届く範囲の運用や趣味レベルならば、overlayfs方式を推奨する。overlayfs方式の方が起動は少し速い。なお、いずれも、ご利用は自己責任で。

前提1:tmpfsにコピーする領域は500MB未満で、なるべく小さくすること。そうできない場合には、overlayfs方式でとなる。
前提2:準備①〜③が完了していること。fuseとoverlayは不要。

~# mkdir /tmpfsroot
~# dosfslabel /dev/mmcblk0p1 boot
~# e2label /dev/mmcblk0p2 rootfs
~# mount -oremount,rw /boot
~# cp -a /boot/cmdline.txt /boot/cmdline_org.txt

/boot/cmdline.txt:

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

~# mount -oremount,ro /boot


/etc/fstab_tmpfsroot:

# tmpfsroot用の/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
## /tmpfsrootが存在すればtmpfsrootを構築する
if [ -d /tmpfsroot ] ; then
    ## tmpfsを作成
    mount -t tmpfs tmpfs /tmpfsroot
    ## 主要rwフォルダをtmpfsにコピーし、bindマウントで元位置に戻す。
    ## tmpfs容量(500MB)より小さくなるように調整すること。/varは別処置する。
    #for d in etc home root; do
    for d in etc root; do
        cp -a /${d} /tmpfsroot/
        mount -obind /tmpfsroot/${d} /${d}
    done
    ## /varは選択的に処置
    mkdir /tmpfsroot/var
    find /var/ -type d | cpio -pdm /tmpfsroot/
    find /var/ -type l | cpio -pdm /tmpfsroot/
    rm -rf /tmpfsroot/var/lib/*
    cp -a /var/lib/* /tmpfsroot/var/lib/
    mount -obind /tmpfsroot/var /var
    ## tmpfsroot用の/etc/fstabを設定。tmpfsroot化済みのため元ファイルは消えない。
    [ -e /etc/fstab_tmpfsroot ] && mv -f /etc/fstab_tmpfsroot /etc/fstab
    ## tmpfsroot用のログインロゴがあれば設定
    [ -e /etc/issue_tmpfsroot ] && mv -f /etc/issue_tmpfsroot /etc/issue
    [ -e /etc/motd_tmpfsroot  ] && mv -f /etc/motd_tmpfsroot  /etc/motd
fi
## Start Systemd
exec /sbin/init

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


元の環境に戻す場合:
~# mount -oremount,rw /boot
~# cp -a /boot/cmdline.txt /boot/cmdline_tmpfsroot.txt
~# cp -a /boot/cmdline_org.txt /boot/cmdline.txt
~# mount -oremount,ro /boot
~# reboot


デコレーション(任意):

/etc/issue_tmpfsroot:

 ______    _______  _______  _______  _______  ___   _______  __    _
|    _ |  |   _   ||       ||       ||  _    ||   | |   _   ||  |  | |
|   | ||  |  |_|  ||  _____||    _  || |_|   ||   | |  |_|  ||   |_| |
|   |_||_ |       || |_____ |   |_| ||       ||   | |       ||       |
|    __  ||       ||_____  ||    ___||  _   | |   | |       ||  _    |
|   |  | ||   _   | _____| ||   |    | |_|   ||   | |   _   || | |   |
|___|  |_||__| |__||_______||___|    |_______||___| |__| |__||_|  |__|

SSH/Telnetログインでは見れない。

/etc/motd_tmpfsroot:

  ,--.                    ,---.                              ,--.
,-'  '-.,--,--,--. ,---. /  .-' ,---. ,--.--. ,---.  ,---. ,-'  '-.
'-.  .-'|        || .-. ||  `-,(  .-' |  .--'| .-. || .-. |'-.  .-'
  |  |  |  |  |  || '-' '|  .-'.-'  `)|  |   ' '-' '' '-' '  |  |
  `--'  `--`--`--'|  |-' `--'  `----' `--'    `---'  `---'   `--'
                  `--'

↑ 環境が分かりやすくなるので推奨。