異なる自動スナップショットポリシーを実装しており、送信側にもう存在しないという理由で古いスナップショットが zfs receive によって意図せず破棄されてしまう場合、スナップショット保持機能の使用を検討することができます。
スナップショットを「保持」すると、そのスナップショットは破棄されなくなります。また、この機能と zfs destroy -d コマンドを使用することにより、最後のクローンの消去を保留しながら、クローンが存在するスナップショットを削除できます。個々のスナップショットには、初期値が 0 のユーザー参照カウントが関連付けられます。このカウントは、スナップショットの保持を設定するたびに 1 増加し、保持を解除するたびに 1 減少します。
以前の Solaris リリースでは、スナップショットを破棄するには、スナップショットにクローンが存在しない状態で zfs destroy コマンドを使用する必要がありました。この Solaris リリースでは、さらにスナップショットのユーザー参照カウントが 0 である必要があります。
1 つのスナップショットまたはスナップショットの集合を保持できます。たとえば次の構文は、保持タグ keep を tank/home/cindys/snap@1 に付与します。
# zfs hold keep tank/home/cindys@snap1 |
-r オプションを使用すると、すべての子孫ファイルシステムのスナップショットを再帰的に保持できます。次に例を示します。
# zfs snapshot -r tank/home@now # zfs hold -r keep tank/home@now |
この構文は、単一の参照 keep を特定のスナップショットまたはスナップショットの集合に追加します。個々のスナップショットには独自のタグ名前空間があり、その空間内で保持タグが一意である必要があります。スナップショットに保持が設定されている場合、保持されたそのスナップショットを zfs destroy コマンドを使って破棄しようとしても失敗します。次に例を示します。
# zfs destroy tank/home/cindys@snap1 cannot destroy 'tank/home/cindys@snap1': dataset is busy |
保持されたスナップショットを破棄する場合は、-d オプションを使用します。次に例を示します。
# zfs destroy -d tank/home/cindys@snap1 |
保持されたスナップショットの一覧を表示するには、zfs holds コマンドを使用します。次に例を示します。
# zfs holds tank/home@now NAME TAG TIMESTAMP tank/home@now keep Thu Jul 15 11:25:39 2010 |
# zfs holds -r tank/home@now NAME TAG TIMESTAMP tank/home/cindys@now keep Thu Jul 15 11:25:39 2010 tank/home/mark@now keep Thu Jul 15 11:25:39 2010 tank/home@now keep Thu Jul 15 11:25:39 2010 |
zfs release コマンドを使用すると、保持されたスナップショットまたはスナップショットの集合を解放することができます。次に例を示します。
# zfs release -r keep tank/home@now |
スナップショットが解放されたら、zfs destroy コマンドを使用してスナップショットを破棄できます。次に例を示します。
# zfs destroy -r tank/home@now |
スナップショットの保持情報を示す 2 つの新しいプロパティーがあります。
zfs destroy -d コマンドを使ってスナップショットの遅延破棄が予約されている場合、defer_destroy プロパティーがオンになります。それ以外の場合、このプロパティーはオフです。
userrefs プロパティーの値は、このスナップショットに設定されている保持の数に設定されます。この数のことをユーザー参照カウントとも呼びます。