「スナップショット」とは、ファイルシステムまたはボリュームの読み取り専用コピーのことです。スナップショットはほとんど瞬間的に作成することができ、最初はプール内で追加のディスク領域を消費しません。しかし、アクティブなデータセット内のデータが変化していくにつれて、スナップショットは古いデータを引き続き参照し、ディスク容量を解放しないため、ディスク領域を消費します。
「クローン」とは、書き込み可能なボリュームまたはファイルシステムのことで、最初の内容は作成元のデータセットと同じです。クローンは、スナップショットからしか作成できません。
ZFS スナップショットには次の特長があります。
システムのリブート後も残ります。
スナップショットの理論上の最大数は、264 です。
スナップショットは個別のバッキングストアを使用しません。スナップショットは、作成元のファイルシステムまたはボリュームと同じストレージプールのディスク領域を直接使用します。
再帰的なスナップショットは、1 つの原子動作としてすばやく作成されます。スナップショットは、まとめて (一度にすべて) 作成されるか、まったく作成されないかのどちらかです。原子スナップショット動作の利点は、子孫ファイルシステムにまたがる場合でも、常にある一貫した時間のスナップショットデータが取得されることです。
ボリュームのスナップショットに直接アクセスすることはできませんが、それらの複製、バックアップ、ロールバックなどを行うことはできます。ZFS スナップショットのバックアップの詳細については、ZFS データの保存、送信、および受信を参照してください。
このセクションの内容は次のとおりです。
スナップショットは、zfs snapshot コマンドまたは zfs snap コマンドを使って作成します。引数として、作成するスナップショットの名前だけを指定できます。スナップショット名では、次の規則のいずれかが使用されます。
filesystem@snapname
volume@snapname
スナップショット名は、ZFS コンポーネントの命名の命名要件に従って付ける必要があります。
次の例では、friday という名前を付けた system1/home/cindy のスナップショットを作成します。
# zfs snapshot system1/home/cindy@friday
すべての子孫ファイルシステムのスナップショットを作成するには、–r オプションを使用します。例:
# zfs snapshot -r system1/home@snap1 # zfs list -t snapshot -r system1/home NAME USED AVAIL REFER MOUNTPOINT system1/home@snap1 0 - 2.11G - system1/home/cindy@snap1 0 - 115M - system1/home/lori@snap1 0 - 2.00G - system1/home/mark@snap1 0 - 2.00G - system1/home/tim@snap1 0 - 57.3M -
スナップショットには変更可能なプロパティーはなく、スナップショットにはデータセットのプロパティーを適用できません。例:
# zfs set compression=on system1/home/cindy@friday cannot set property for 'system1/home/cindy@friday': this property can not be modified for snapshots
スナップショットを破棄するには、zfs destroy コマンドを使用します。例:
# zfs destroy system1/home/cindy@friday
データセットのスナップショットが存在する場合は、データセットを破棄できません。例:
# zfs destroy system1/home/cindy cannot destroy 'system1/home/cindy': filesystem has children use '-r' to destroy the following datasets: system1/home/cindy@tuesday system1/home/cindy@wednesday system1/home/cindy@thursday
さらに、スナップショットからクローンが作成されている場合は、スナップショットを破棄する前に、クローンを破棄する必要があります。
destroy サブコマンドの詳細については、 ZFS ファイルシステムを破棄する方法を参照してください。
別の自動スナップショットまたはデータ保持のポリシーが原因で、古いスナップショットが不注意に破棄されることがあります。削除されたスナップショットが進行中の ZFS 送受信操作の一部である場合、操作は失敗する可能性があります。このシナリオを回避するには、スナップショットの保留を検討してください。
スナップショットを「保持」すると、そのスナップショットは破棄されなくなります。また、この機能と zfs destroy –d コマンドを使用することにより、最後のクローンの消去を保留しながら、クローンが存在するスナップショットを削除できます。個々のスナップショットには、初期値が 0 のユーザー参照カウントが関連付けられます。このカウントは、スナップショットの保持を設定するたびに 1 増加し、保持を解除するたびに 1 減少します。
以前の Oracle Solaris リリースでは、スナップショットにクローンが存在しない場合に zfs destroy コマンドを使用すると、スナップショットが破棄される可能性がありました。この Oracle Solaris リリースでは、さらにスナップショットのユーザー参照カウントが 0 である必要があります。
1 つのスナップショットまたはスナップショットの集合を保持できます。たとえば、次の構文は system1/home/cindy/snap@1 に保持タグ keep を配置します。
# zfs hold keep system1/home/cindy@snap1
すべての子孫ファイルシステムのスナップショットを再帰的に保持するには、–r オプションを使用します。例:
# zfs snapshot -r system1/home@now # zfs hold -r keep system1/home@now
この構文は、単一の参照 keep を特定のスナップショットまたはスナップショットの集合に追加します。個々のスナップショットには独自のタグ名前空間があり、その空間内で保持タグが一意である必要があります。スナップショットに保持が設定されている場合、保持されたそのスナップショットを zfs destroy コマンドを使って破棄しようとしても失敗します。例:
# zfs destroy system1/home/cindy@snap1 cannot destroy 'system1/home/cindy@snap1': dataset is busy
保持されたスナップショットを破棄するには、–d オプションを使用します。例:
# zfs destroy -d system1/home/cindy@snap1
保持されたスナップショットの一覧を表示するには、zfs holds コマンドを使用します。例:
# zfs holds system1/home@now NAME TAG TIMESTAMP system1/home@now keep Fri Aug 3 15:15:53 2012
# zfs holds -r system1/home@now NAME TAG TIMESTAMP system1/home/cindy@now keep Fri Aug 3 15:15:53 2012 system1/home/lori@now keep Fri Aug 3 15:15:53 2012 system1/home/mark@now keep Fri Aug 3 15:15:53 2012 system1/home/tim@now keep Fri Aug 3 15:15:53 2012 system1/home@now keep Fri Aug 3 15:15:53 2012
スナップショットまたはスナップショットセット上の保持を解除するには、zfs release コマンドを使用します。例:
# zfs release -r keep system1/home@now
スナップショットが解放されたら、zfs destroy コマンドを使用してスナップショットを破棄できます。例:
# zfs destroy -r system1/home@now
2 つのプロパティーでスナップショットの保持情報が識別されます。
zfs destroy –d コマンドを使ってスナップショットに遅延破棄のマークが付けられている場合は、defer_destroy プロパティーが on に設定されます。それ以外の場合、プロパティーは off に設定されます。
userrefs プロパティーは、このスナップショット上の保持数に設定されます。
スナップショットの名前は変更できますが、スナップショットが作成されたときと同じプールおよびデータセット内に限ります。例:
# zfs rename system1/home/cindy@snap1 system1/home/cindy@today
また、次のショートカット構文を使用することもできます。
# zfs rename system1/home/cindy@snap1 today
次のようなスナップショットの rename 操作はサポートされていません。ターゲットのプールとファイルシステムの名前が、スナップショットの作成されたプールとファイルシステムと異なるためです。
# zfs rename system1/home/cindy@today pool/home/cindy@saturday cannot rename to 'pool/home/cindy@today': snapshots must be part of same dataset
zfs rename –r コマンドを使用すると、スナップショットの名前を再帰的に変更することができます。例:
# zfs list -t snapshot -r users/home NAME USED AVAIL REFER MOUNTPOINT users/home@now 23.5K - 35.5K - users/home@yesterday 0 - 38K - users/home/lori@yesterday 0 - 2.00G - users/home/mark@yesterday 0 - 1.00G - users/home/neil@yesterday 0 - 2.00G - # zfs rename -r users/home@yesterday @2daysago # zfs list -t snapshot -r users/home NAME USED AVAIL REFER MOUNTPOINT users/home@now 23.5K - 35.5K - users/home@2daysago 0 - 38K - users/home/lori@2daysago 0 - 2.00G - users/home/mark@2daysago 0 - 1.00G - users/home/neil@2daysago 0 - 2.00G -
デフォルトでは、スナップショットはすでに zfs list 出力には表示されません。スナップショット情報を表示するには、zfs list –t snapshot コマンドを使用する必要があります。代わりに、listsnapshots プールプロパティーを有効にすることもできます。例:
# zpool get listsnapshots system1 NAME PROPERTY VALUE SOURCE system1 listsnapshots off default # zpool set listsnapshots=on system1 # zpool get listsnapshots system1 NAME PROPERTY VALUE SOURCE system1 listsnapshots on local
ファイルシステムのスナップショットは、ファイルシステムのルート内の .zfs/snapshot ディレクトリに配置されています。たとえば、system1/home/cindy が /home/cindy にマウントされている場合、/home/cindy/.zfs/snapshot/thursday ディレクトリにある system1/home/cindy@thursday スナップショットデータにアクセスできます。
# ls /system1/home/cindy/.zfs/snapshot thursday tuesday wednesday
次の例は、スナップショットを一覧表示する方法を示しています。
# zfs list -t snapshot -r system1/home NAME USED AVAIL REFER MOUNTPOINT system1/home/cindy@tuesday 45K - 2.11G - system1/home/cindy@wednesday 45K - 2.11G - system1/home/cindy@thursday 0 - 2.17G -
次の例は、特定のファイルシステム用に作成されたスナップショットを一覧表示する方法を示しています。
# zfs list -r -t snapshot -o name,creation system1/home NAME CREATION system1/home/cindy@tuesday Fri Aug 3 15:18 2012 system1/home/cindy@wednesday Fri Aug 3 15:19 2012 system1/home/cindy@thursday Fri Aug 3 15:19 2012 system1/home/lori@today Fri Aug 3 15:24 2012 system1/home/mark@today Fri Aug 3 15:24 2012
スナップショットを作成すると、最初はそのディスク容量がスナップショットとファイルシステム間で共有されます。ただし、以前のスナップショットと共有される可能性もあります。ファイルシステムが変化していくにつれて、それまで共有されていたディスク領域がスナップショット固有になり、スナップショットの used プロパティーに計上されます。また、スナップショットを削除すると、ほかのスナップショットに固有の (および使用される) ディスク容量を増やすことができます。
スナップショットの容量 referenced プロパティーの値は、スナップショットが作成されたときのファイルシステムの値と同じです。
used プロパティーの値がどのように消費されているかについて、さらに詳細な情報を確認することができます。新しい読み取り専用ファイルシステムプロパティーは、クローン、ファイルシステム、およびボリュームに関するディスク領域使用状況を示します。例:
$ zfs list -o space -r rpool NAME AVAIL USED USEDSNAP USEDDS USEDREFRESERV USEDCHILD rpool 124G 9.57G 0 302K 0 9.57G rpool/ROOT 124G 3.38G 0 31K 0 3.38G rpool/ROOT/solaris 124G 20.5K 0 0 0 20.5K rpool/ROOT/solaris/var 124G 20.5K 0 20.5K 0 0 rpool/ROOT/solaris-1 124G 3.38G 66.3M 3.14G 0 184M rpool/ROOT/solaris-1/var 124G 184M 49.9M 134M 0 0 rpool/VARSHARE 124G 39.5K 0 39.5K 0 0 rpool/dump 124G 4.12G 0 4.00G 129M 0 rpool/export 124G 63K 0 32K 0 31K rpool/export/home 124G 31K 0 31K 0 0 rpool/swap 124G 2.06G 0 2.00G 64.7M 0
これらのプロパティーについては、zfs(1M) のマニュアルページで used プロパティーを参照してください。
zfs rollback コマンドを使用すると、特定のスナップショットが作成された時点よりもあとにファイルシステムに対して行われたすべての変更を破棄できます。ファイルシステムは、そのスナップショットが作成されたときの状態に戻ります。デフォルトでは、このコマンドを使って、最新のスナップショット以外のスナップショットにロールバックすることはできません。
以前のスナップショットにロールバックするには、–r オプションを指定して、中間のスナップショットをすべて破棄する必要があります。
中間のスナップショットのクローンが存在する場合は、–R オプションを指定してクローンも破棄します。
次の例では、system1/home/cindy ファイルシステムは tuesday スナップショットまでロールバックされます。
# zfs rollback system1/home/cindy@tuesday cannot rollback to 'system1/home/cindy@tuesday': more recent snapshots exist use '-r' to force deletion of the following snapshots: system1/home/cindy@wednesday system1/home/cindy@thursday # zfs rollback -r system1/home/cindy@tuesday
次の例では、ファイルシステムが以前の tuesday スナップショットまでロールバックされるため、wednesday および thursday スナップショットは破棄されます。
# zfs list -r -t snapshot -o name,creation system1/home/cindy NAME CREATION system1/home/cindy@tuesday Fri Aug 3 15:18 2012
zfs diff コマンドを使用して、ZFS スナップショットの相違点を判別できます。
たとえば、次の 2 つのスナップショットが作成されるものとします。
$ ls /system1/home/tim fileA $ zfs snapshot system1/home/tim@snap1 $ ls /system1/home/tim fileA fileB $ zfs snapshot system1/home/tim@snap2
2 つのスナップショットの相違点を識別するには、次の例のような構文を使用します。
$ zfs diff system1/home/tim@snap1 system1/home/tim@snap2 M /system1/home/tim/ + /system1/home/tim/fileB
出力で、M はディレクトリが変更されたことを示します。+ は、後者のスナップショットに fileB が存在していることを示します。
次の出力の R は、スナップショットのファイルの名前が変更されたことを示しています。
$ mv /system1/cindy/fileB /system1/cindy/fileC $ zfs snapshot system1/cindy@snap2 $ zfs diff system1/cindy@snap1 system1/cindy@snap2 M /system1/cindy/ R /system1/cindy/fileB -> /system1/cindy/fileC
次の表は、zfs diff コマンドによって識別されるファイルまたはディレクトリの変更を要約したものです。
|
詳細については、zfs(1M) のマニュアルページを参照してください。
zfs diff コマンドを使用して別々のスナップショットを比較すると、新しいファイルシステムやディレクトリなどの高レベルの相違点が表示されます。たとえば、sales ファイルシステムには、それぞれの子孫ファイルシステム内にファイルを持つ data および logs という 2 つの子孫ファイルシステムが含まれています。
# zfs list -r sales NAME USED AVAIL REFER MOUNTPOINT sales 1.75M 66.9G 33K /sales sales/data 806K 66.9G 806K /sales/data sales/logs 806K 66.9G 806K /sales/logs
sales@snap1 と sales@snap2 との間で、高レベルの相違点を表示できます。ここで、主な相違点は sales/logs ファイルシステムの追加です。
# zfs diff sales@snap1 sales@snap2 M /sales/ + /sales/logs
次のような構文を使用すると、スナップショットの相違点 (ファイル名を含む) を再帰的に識別できます。
# zfs diff -r -E sales@snap1 D /sales/ (sales) + /sales/data D /sales/data/ (sales/data) + /sales/data/dfile.1 + /sales/data/dfile.2 + /sales/data/dfile.3 # zfs diff -r -E sales@snap2 D /sales/ (sales) + /sales/data + /sales/logs D /sales/logs/ (sales/logs) + /sales/logs/lfile.1 + /sales/logs/lfile.2 + /sales/logs/lfile.3 D /sales/data/ (sales/data) + /sales/data/dfile.1 + /sales/data/dfile.2 + /sales/data/dfile.3
この出力では、D で始まり、(name) で終わる行がファイルシステム (データセット) およびマウントポイントを示しています。