Read Only Raspberry Pi

Raspberry Piをいくつか運用していてよくSDCardが壊れるなと思ってより耐性の高いカードを買わないとと思っていたら、SDカードに書き込まずに運用するということが広く行われているということを発見してトライ。Docker対応する方法は簡単には見つからなかったので試行錯誤した。

以下作業メモ

  • 普通にセットアップ(事前に/boot/ssh, /boot/wpa_supplicant.conf を作成)

  • raspi-configでpassword, hostname, timezoneの設定

  • tmux, emacsをインストール

  • watchdogの設定 (1)

  • readonly modeにする基本設定 (2)

  • 外部ディスクの追加

    # /etc/fstab
    PARTUUID=abc-def    /media/foobar ext4                 defaults,auto,users,rw,nofail,x-systemd.device-timeout=5      0       0

    PARTUUIDはblkidで確認。

この辺りまでは既にやり方がネットに書かれていたのでそれに従っただけ。

  • containerdのファイルを外部ディスクに移動

    mv /var/lib/containerd /media/foobar
    ln -s /media/foobar/containerd /var/lib
  • dockerの作業フォルダも外部ディスクに

    # /lib/systemd/system/docker.service
    ExecStart=/usr/bin/dockerd --data-root /media/foorbar/docker --containerd=/run/containerd/containerd.sock
  • 時刻の設定 NTPは時間が違いすぎるとうまく動かないので、起動スクリプトの中でntpdateを呼ぶようにした。 ただし、まだhostname serviceが動いていないのでipで指定する必要がある(変わったらまずい)

    # /usr/lib/ntp/ntp-systemd-wrapper
    ntpdate 133.243.238.244

もちろんexternal driveが壊れる可能性もあるけど、docker-composeのファイルとかがSDCardにあればすぐに再構築できるのであまり問題はなさそう。