ZFSロールバックが中間スナップショットを削除するのはなぜですか?

ZFSロールバックが中間スナップショットを削除するのはなぜですか?

私は以前にbtrfsを使用したことがありますが、ZFSでスナップショットをロールバックすると、ファイルの「ワークセット」だけが変更されるわけではないことに驚きました。ロールバックターゲットよりも最新のスナップショットもすべて削除する必要があります。:

 zfs rollback [-Rfr] snapshot
   Roll back the given dataset to a previous snapshot.  When a dataset is rolled back, all
   data that has changed since the snapshot is discarded, and the dataset reverts to the
   state at the time of the snapshot.  By default, the command refuses to roll back to a
   snapshot other than the most recent one.  In order to do so, all intermediate snapshots
   and bookmarks must be destroyed by specifying the -r option.

比較のためにいくつかの説明があります。btrfsのスナップショットの非破壊ロールバック:

btrfs サブスナップ -r fs スナップショット
# ...fsで操作を実行します。
btrfs sub del fs # この時点でそのエントリが失われます。もの君は終わった
                 #保持するには名前を変更します。FS代わりに
btrfsサブスナップショットスナップショットfs#復元スナップ写真読み取り+書き込みFS
btrfs sub del snapshot # 不要になった読み取り専用エントリの削除スナップ写真

そしてZFSのスナップショットに対する無中断ロールバック:

zfs snapshot pool/project/production@today
zfs clone pool/project/production@today pool/project/beta
# make changes to /pool/project/beta and test them
zfs promote pool/project/beta
zfs rename pool/project/production pool/project/legacy
zfs rename pool/project/beta pool/project/production
# once the legacy version is no longer needed, it can be destroyed
zfs destroy pool/project/legacy

zfs rollback「スナップショット」はbtrfsとZFSとは明らかに異なるものですが、特にスタンドアロンの非破壊ロールバックコマンドがないようなので、破壊操作の利点は何ですか?明示的に要求されない限り、最も一般的に必要なロールバック操作は、他の無関係なスナップショットではなく、ファイルの現在の状態に影響を与えるものであると予想されます。

いくつかの理由(歴史、パフォーマンス、ストレージスペース、実装の単純さ)を想像できますが、説得力のある理由はあまりありません。

答え1

zfsデザインについて私が理解したところによれば、ロールバックの目的は、最後のスナップショット以降のすべての変更を即座にキャンセルすることです。これは破壊的であるため、安全対策はスナップショットのみを返すことを許可することです。ただし、インデントのスナップショットを取得するには1つを返し、次に1つを返すことができます。ただし、そのスナップショット以降のすべてのデータセットの機会が失われることに注意してください。

ただし、目的がデータセット内のファイルに特定のスナップショットに再びアクセスすることである場合は、zfsコマンドを実行しなくてもいつでもそのファイルにアクセスできます。ファイルシステムを介してスナップショットにアクセスするだけです。

例:(rootユーザーに切り替えます。例:$ sudo -s bash

# zfs mount cypher-pool/data /data # mount dataset onto /data 
# cd /data                              # Where the dataset is mounted.
# cd .zfs                               # Note: system hidden directory
# cd snapshot                           # Location of all dataset snapshots
# ls                                    # List of current dataset snapshots
autosnap_2023-01-01_00:00:01_monthly
autosnap_2023-01-01_00:00:01_yearly
autosnap_2023-02-01_00:00:03_monthly
autosnap_2023-03-01_00:00:01_monthly
autosnap_2023-04-01_00:00:02_monthly
autosnap_2023-05-01_00:00:01_monthly
autosnap_2023-06-01_00:00:01_monthly
autosnap_2023-07-01_00:01:07_monthly
autosnap_2023-07-03_23:30:01_weekly
autosnap_2023-07-10_23:30:19_weekly
autosnap_2023-07-17_23:30:01_weekly
autosnap_2023-07-24_23:30:02_weekly
autosnap_2023-07-31_23:30:02_weekly
autosnap_2023-08-01_00:00:02_monthly
autosnap_2023-08-07_23:30:02_weekly
autosnap_2023-08-09_00:00:02_daily
autosnap_2023-08-10_00:00:04_daily
autosnap_2023-08-11_00:00:01_daily
autosnap_2023-08-12_00:00:03_daily
autosnap_2023-08-13_00:00:01_daily
autosnap_2023-08-14_00:00:01_daily
autosnap_2023-08-14_23:30:50_weekly
autosnap_2023-08-15_00:00:02_daily
autosnap_2023-08-15_07:00:02_hourly
autosnap_2023-08-15_08:00:02_hourly
autosnap_2023-08-15_09:00:02_hourly
autosnap_2023-08-15_10:00:01_hourly
# cd autosnap_2023-04-01_00:00:02_monthly
# ls 
(all my files in my dataset as of the snapshot on April 1st 2023)

私が知っている限り、これらのファイルは通常のファイルシステムの一部であるかのように操作して表示できます。

スナップショットを現在アクティブなファイルシステム領域に「復元」したい場合は、いつでもスナップショットのファイルをアクティブ領域に「rsync」または「cp」できます。

問題が発生した場合に備えて、現在の状態のスナップショットを撮ります。 (もちろん現在の日時を使用してください)

# zfs snapshot cypher-pool/data@backup_2023-08-21_16:20:42_backup

そんなことから始めましょう。 (オプションをご確認の上ご利用ください)

# cd /data/.zfs/snapshot`
# rsync -Pav autosnap_2023-04-01_00:00:02_monthly/* /data/

注:ZFS Sanoidで作成されたものなどのスナップショットの例https://github.com/jimsalterjrs/sanoid

関連情報