Incremental backups with Btrfs snapshots
Posted by Alessio Ciregia on September 14, 2020
スナップショットはBtrfsの興味深い機能だ。
スナップショットはサブボリュームの複製です。
スナップショットの作成は即時です。しかし、スナップショットの作成はrsyncやcpのようなものではなく、スナップショットは作成と同時にスペースを占有するわけではありません。
編集者注:BTRFS Wikiより - スナップショットとは、BtrfsのCOW機能を使って他のサブボリュームとデータ(とメタデータ)を共有するサブボリュームのことです。
書き込み可能であれば、元のサブボリュームやスナップショット自体のデータ変更に伴って占有領域が増加します。 サブボリュームに追加/変更されたファイルや削除されたファイルは、スナップショットにも存在します。 これはバックアップを実行する便利な方法です。
Using snapshots for backups
スナップショットは、サブボリュームがあるのと同じディスク上に存在する。 通常のディレクトリのようにそれを表示して、スナップショットが実行されたときのファイルのコピーを復元することができる。 ところで、スナップショットされたサブボリュームの同じディスク上のスナップショットは、理想的なバックアップ戦略ではありません:ハードディスクが壊れた場合、スナップショットも失われます。 ハードディスクが壊れた場合、スナップショットも失われます。スナップショットの興味深い機能は、別の場所にスナップショットを送信できることです。スナップショットは外付けハードドライブやSSH経由でリモートシステムに送ることができます(送り先のファイルシステムもBtrfsとしてフォーマットする必要があります)。 そのためには btrfs send と btrfs receive というコマンドを使います。
Taking a snapshot
送信コマンドと受信コマンドを使用するには、スナップショットを読み取り専用で作成することが重要であり、スナップショットはデフォルトで書き込み可能です。
次のコマンドは、/home サブボリュームのスナップショットを作成します。読み取り専用の -r フラグに留意してください。
sudo btrfs subvolume snapshot -r /home /.snapshots/home-day1
day1 の代わりに、スナップショット名は home-$(date +%Y%m%d) のように現在の日付にすることができます。
スナップショットは通常のサブディレクトリのように見えます。
好きな場所に置くことができます。
混乱を避けるために /.snapshots というディレクトリを作成するとよいでしょう。
編集者注:スナップショットはそれ自身の再帰的スナップショットを作成しません。 サブボリュームのスナップショットを作成すると、そのサブボリュームに含まれるすべてのサブボリュームまたはスナップショットは、スナップショット内の同じ名前の空のディレクトリにマップされます。
Backup using btrfs send
この例では、USBドライブ内の保存先Btrfsボリュームは /run/media/user/mydisk/bk としてマウントされています。
スナップショットを宛先に送信するコマンドは次のとおりです:
sudo btrfs send /.snapshots/home-day1 | sudo btrfs receive /run/media/user/mydisk/bk
これは初期ブートストラップと呼ばれ、フルバックアップに相当します。
この作業には /home ディレクトリのサイズに応じて、時間がかかります。
もちろん、その後の増分送信にはもっと短い時間で済みます。
Incremental backup
スナップショットのもう一つの便利な機能は、送信タスクをインクリメンタルな方法で実行できることです。 別のスナップショットを取ってみよう。
sudo btrfs subvolume snapshot -r /home /.snapshots/home-day2
send コマンドをインクリメンタルに実行するにはベースとして前回のスナップショットを指定する必要があり、このスナップショットは送信元と送信先に存在する必要があります。
-p オプションに注意。
sudo btrfs send -p /.snapshot/home-day1 /.snapshot/home-day2 | sudo btrfs receive /run/media/user/mydisk/bk
そしてまた(その翌日):
sudo btrfs subvolume snapshot -r /home /.snapshots/home-day3
sudo btrfs send -p /.snapshot/home-day2 /.snapshot/home-day3 | sudo btrfs receive /run/media/user/mydisk/bk
Cleanup
操作が完了したスナップショットは保存しておけますが、日常的に行っているとスナップショットの数が多くなってします。 これは混乱につながる可能性があり、ディスクを消費します。 スナップショットが不要になったら削除することをお勧めします。
増分を送信するには、少なくとも最後のスナップショットが送信元と送信先に存在する必要があります。
sudo btrfs subvolume delete /.snapshot/home-day1
sudo btrfs subvolume delete /.snapshot/home-day2
sudo btrfs subvolume delete /run/media/user/mydisk/bk/home-day1
sudo btrfs subvolume delete /run/media/user/mydisk/bk/home-day2
注:day3 のスナップショットは送信元と送信先に残っているので明日(4日目)、新しい増分を送信することができる。
最後のアドバイスとして USB ドライブに容量がある場合、送信先は複数のスナップショットを保持し、送信元は最後のスナップショットだけを保持することもできる。