Btrbkを使ったバックアップ

前回、BtrfsなサーバにHDDを増設し、RAIDを組んだという記事を書きました。
(参考: btrfsでHDDを増設してRAID1に変換する)

今回はRAIDを組んだときに設定した、バックアップについてまとめます。

ツールの選定

せっかくBtrfsを使用しているので、その機能を利用した方法でバックアップをとりたいです。
高速にバックアップできるようなので。

Incremental Snapshot Transfer
[...]. This is far quicker than e.g. rsync could, especially on large file systems.


Incremental Backup - btrfs Wiki

ノートPCではsnapperを利用してスナップショットをとっていますが、外部HDDへの転送は別途ツールをインストールする必要があるため1、今回は利用を見送りました。

今回は、上記引用ページにも記載のある、btrbkを利用します。

インストール

ソースコードをビルドします2
バージョンは0.29.1です。

# cd /usr/local/src
# wget https://digint.ch/download/btrbk/releases/btrbk-0.29.1.tar.xz
# tar xf btrbk-0.29.1.tar.xz
# cd btrbk-0.29.1/
# make install

設定

トップレベルサブボリュームのマウント

btrbkはトップレベルサブボリューム(btrfsのルート)をマウントしていると設定が楽です。
そうでない場合の設定については、まだドキュメント3を正確に理解していないため試していません。
Snapperの推奨ファイルシステムレイアウトのようにサブボリュームをマウントして使用している場合は、ルートをマウントします。

$ sudo mount -t btrfs /dev/sda /mnt/raid

起動時にマウントするように、/etc/fstabに記述しておくとよいでしょう。
私の場合は以下のような感じです。

LABEL=hdd /mnt/raid/ btrfs defaults,noatime,autodefrag,compress-force=zstd,space_cache 0 2

btrbk

解凍したディレクトリ内の設定ファイルのサンプルをコピーし、設定を記述します。

# cp /usr/local/src/btrbk-0.29.1/btrbk.conf.example /etc/btrbk/btrbk.conf

私は下記のような設定を加えました。

snapshot_preserve_min   2d
snapshot_preserve       14d

target_preserve_min     no
target_preserve         20d 10w *m

archive_preserve_min    latest
archive_preserve        12m 10y

# ↓以下を追記

volume /mnt/raid/
  target send-receive /mnt/backup/internal/
  subvolume @videos
    snapshot_dir @snapshots
  subvolume @nextcloud
    snapshot_dir @snapshots

/mnt/raid/ の2つのサブボリュームを、それぞれバックアップ用HDD( /mnt/backup/internal/)にバックアップしています。

下記スクリプトを /etc/cron.daily/btrbkに記述し、毎日バックアップするようにしました。

#!/bin/sh
exec /usr/sbin/btrbk -q run

btrbk runでは、以下の処理が行われます4

デフォルトの設定では増分バックアップが行われます。

設定ファイルの読み方

設定ファイルの一部の記述について、その意味を記します。

snapshot_preserve_minやsnapshot_preserveなどの設定は、サンプルファイルのまま使用しています。 このあたりの設定で、スナップショットやバックアップをどの程度残すかを決めるのですが、イマイチ挙動を理解できていません。

動作例

ある日の動作ログです。

2020-03-14T06:25:01+0900 startup v0.29.1 - - - # btrbk command line client, version 0.29.1
2020-03-14T06:25:02+0900 snapshot starting /mnt/raid/@snapshots/@videos.20200314 /mnt/raid/@videos - -
2020-03-14T06:25:03+0900 snapshot success /mnt/raid/@snapshots/@videos.20200314 /mnt/raid/@videos - -
2020-03-14T06:25:03+0900 snapshot starting /mnt/raid/@snapshots/@nextcloud.20200314 /mnt/raid/@nextcloud - -
2020-03-14T06:25:03+0900 snapshot success /mnt/raid/@snapshots/@nextcloud.20200314 /mnt/raid/@nextcloud - -
2020-03-14T06:25:03+0900 send-receive starting /mnt/backup/internal/@videos.20200314 /mnt/raid/@snapshots/@videos.20200314 /mnt/raid/@snapshots/@videos.20200313 -
2020-03-14T06:33:18+0900 send-receive success /mnt/backup/internal/@videos.20200314 /mnt/raid/@snapshots/@videos.20200314 /mnt/raid/@snapshots/@videos.20200313 -
2020-03-14T06:33:18+0900 send-receive starting /mnt/backup/internal/@nextcloud.20200314 /mnt/raid/@snapshots/@nextcloud.20200314 /mnt/raid/@snapshots/@nextcloud.20200313 -
2020-03-14T06:33:38+0900 send-receive success /mnt/backup/internal/@nextcloud.20200314 /mnt/raid/@snapshots/@nextcloud.20200314 /mnt/raid/@snapshots/@nextcloud.20200313 -
2020-03-14T06:33:38+0900 delete_snapshot starting /mnt/raid/@snapshots/@videos.20200228 - - -
2020-03-14T06:33:38+0900 delete_snapshot success /mnt/raid/@snapshots/@videos.20200228 - - -
2020-03-14T06:33:38+0900 delete_snapshot starting /mnt/raid/@snapshots/@nextcloud.20200228 - - -
2020-03-14T06:33:38+0900 delete_snapshot success /mnt/raid/@snapshots/@nextcloud.20200228 - - -
2020-03-14T06:33:38+0900 finished success - - - -

やはりスナップショットの作成は早いですね。
バックアップは別HDDに転送しているので、データ量に応じて時間がかかっています。

また、設定通り保持期間を過ぎたスナップショット(20200228)が削除されています。
バックアップの削除ログがありませんが、どうも10wや*mの方の設定が効いている??
20日前よりも古いバックアップがまだ残っているんですよね。

btrbk run -n -Sでスケジュールを表示できるので、btrbkがどのようにスナップショットやバックアップの保持を決めているのか、今後調査してみたいと思います。

おわりに

btrbkを用いたバックアップについてまとめました。
自宅サーバは私がDockerで遊ぶだけでなく、家族のデータ保管の役割を担うようになっていたので、バックアップの自動化ができて満足しています。

HDDを定期的に新しいものに交換することを忘れないようにしたいです。