かってきままな日々
2019-12-02 (Mo) [長年日記]
_ zfs のバックアップを構築した
昨日から今日にかけて、 家庭内サーバの 3TB のストレージを一旦消して、zfs で作り直して、 そこに手元 PC から zfs を send/recv で replication する仕組みを作った。
ローカルからは、systemd の timer から service を起動して、 service は shell script を起動する。
その shell script は、zfs snapshot を作って、前回の snapshot から今回の snapshot までを zfs send して、gzip して netcat で家庭内サーバに送る。
この時に使う netcat は、openbsd-netcat。gnu のやつだと、データ送信後に shutdown するオプションが見当たらなかった。
サーバ側は、systemd の socket で待ち受けてて、接続があったら service を起動。 その service は shell script を実行して、その shell script は zcat して zfs recv する。
概ねこんな感じ。気をつけないといけないのは、PC が resume した直後に送ろうとして、 まだネットワークが復活してなくて送信できないとか、そういったエラーの場合に、 送り終わったことにしてしまうと、次から受信側で zfs recv できないこと。 どこまで送って完了したか、ちゃんとファイルに記録しておく必要があるし、 エラーになったらちゃんと中断して、そのファイルに記録してしまわないようにしないと いけない。
その辺、zfs 的には zfs send -R
と zfs recv -F
が便利。
というか、それ以外の使い方はどう使うのかわからなかった。
ここ数年、私は ruby な人なので、今回も ruby で作ろうかと思ったんだけど、
今回においては bash の set -e
が便利で、
shell script 実行中にエラーが発生したら、
そこで実行を中断してくれる、というオプション。
set -o pipefail
と共に。
あー。ローカルで snapshot を削除すると、 レプリカでも消えるんだな……。 ほんとにただのレプリカになってしまうんだな。まぁいいかな…
失敗時の通知も作った。slack に投げるようにした。