-Fオプションによりrecv側は最新snapshotに強制rollbackして、それからsnapshotを受け取る。
zfs send -Ri "zdata/vm/test-vm@d-2024-07-21_03.56.00--7d" "zdata/vm/test-vm@d-2024-07-22_03.34.00--7d" | ssh backup.example.com zfs recv -F "zdata/vm/test-vm"
vm-bhyveのmigration
https://github.com/churchers/vm-bhyve/blob/master/lib/vm-migration
send -R recv -F
pool/tgt側の過去スナップショット(@00a、@01a)が消えています。名前が戻るだけならまだしもこれはマズイです。
どうやらsend -Rとrecv -Fの組み合わせだと、受信側は受け取ったスナップショットストリームに厳密に合わせたスナップショット構成に変更してしまうようです。
zfsnap2と組み合わせる場合は受信側のスナップショットが消えた方が都合がよい
差分バックアップ
2回目以降は, 差分だけを送信するようにする。zfs send のオプションに -I と -i があって, ややこしい。zfs send -I @snapA pool/fs@snapDsnapA の次からsnapDまでのすべてのスナップショットが送信される。
zfs send -i @snapA pool/fs@snapDsnapDだけが送信される。
バックアップ用途では, 大文字の -I を使うこと。
FreeBSD Continuous ZFS Replication | Netsphere Laboratories 2015
■ zfs receiveのオプション
zfs receive は zfs recv と省略可能
- -F 既存ファイルシステムを上書き
- -d 送信側で使用していた名前でスナップショットを復元
このオプションを使うときはzpoolのみを指定
-F Force a rollback of the file system to the most recent snapshot
before performing the receive operation. If receiving an
incremental replication stream (for example, one generated by zfs
send -R [-i|-I]), destroy snapshots and file systems that do not
exist on the sending side.
-d Discard the first element of the sent snapshot's file system name,
using the remaining elements to determine the name of the target
file system for the new snapshot as described in the paragraph
above.
差分をファイルにバックアップ、リストア
ZFSデータ領域 バックアップガイド
https://www.fujitsu.com/jp/documents/products/computing/servers/unix/sparc/technical/document/solaris11_zfs_backup_gde00.pdf
ロールバック 再起的
注意すべき点として、現在のZFSには再帰的にロールバックする仕組みが存在しません。
第597回 UbuntuのルートファイルシステムをZFSにしてみる | gihyo.jp 2019
It would be great to have the option to rollback a complete dataset subtree, similar to zfs snapshot/destroy -r .
Sadly for zfs rollback -r is already used for recursive on the specified dataset (insted of the children, which is counterintuitive since on all other functions -r operates on child datasets).
Nevertheless, a way to rollback a complete subtree would be handy.
add a recursive option to zfs rollback · Issue #2958 · openzfs/zfs · GitHub
hourly incremental
#!/usr/bin/env bash fs=zroot/vm # Destroy before create, just in case the pool is out of space /usr/local/sbin/zfsnap destroy -s -S -v -p 'hourly-' -r $fs && \ /usr/local/sbin/zfsnap snapshot -s -S -z -v -p 'hourly-' -a 1d -r $fs date1=`date -v -1H +%Y-%m-%d_%H` date2=`date +%Y-%m-%d_%H` snap1=`zfs list -t snapshot $fs | grep hourly-${date1} | awk '{print \$1}'` snap2=`zfs list -t snapshot $fs | grep hourly-${date2} | awk '{print \$1}'` zfs send -Ri ${snap1} ${snap2} | ssh backup.example.com zfs recv -F $fs