トップ «前の日記 最新 次の日記»

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 -Rzfs recv -F が便利。 というか、それ以外の使い方はどう使うのかわからなかった。

ここ数年、私は ruby な人なので、今回も ruby で作ろうかと思ったんだけど、 今回においては bash の set -e が便利で、 shell script 実行中にエラーが発生したら、 そこで実行を中断してくれる、というオプション。 set -o pipefail と共に。

あー。ローカルで snapshot を削除すると、 レプリカでも消えるんだな……。 ほんとにただのレプリカになってしまうんだな。まぁいいかな…

失敗時の通知も作った。slack に投げるようにした。


編集 パスワード変更