zfs send recv incremental backup 差分バックアップ

-Fオプションによりrecv側は最新snapshotに強制rollbackして、それからsnapshotを受け取る。

zfs snapshotの差分send/recvについて | nobwak's Lair 2014

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の組み合わせだと、受信側は受け取ったスナップショットストリームに厳密に合わせたスナップショット構成に変更してしまうようです。

b00t's noteb00k!: zfs send/recvについての考察 2013

zfsnap2と組み合わせる場合は受信側のスナップショットが消えた方が都合がよい

差分バックアップ
2回目以降は, 差分だけを送信するようにする。zfs send のオプションに -I と -i があって, ややこしい。

zfs send -I @snapA pool/fs@snapD

snapA の次からsnapDまでのすべてのスナップショットが送信される。

zfs send -i @snapA pool/fs@snapD

snapDだけが送信される。
バックアップ用途では, 大文字の -I を使うこと。
FreeBSD Continuous ZFS Replication | Netsphere Laboratories 2015

zfs receiveのオプション
zfs receive は zfs recv と省略可能

  • -F 既存ファイルシステムを上書き
  • -d 送信側で使用していた名前でスナップショットを復元

このオプションを使うときはzpoolのみを指定

  • -u 復元されたアーカイブzfs receive 処理の完了時にマウントしない
  • -v 転送後に受信時間と容量を表示

send/recvでデータ移行 [メモとかメモのようなものとか(By ルーキーの中のひと)] 2017

 -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