「スナップショット」とは、ファイルシステムまたはボリュームの読み取り専用コピーのことです。スナップショットはほとんど瞬間的に作成することができ、最初はプール内で追加のディスク領域を消費しません。ただし、アクティブなデータセット内のデータが変化していくにつれて、ディスク領域が消費されるようになります。古いデータを引き続き参照し、そのディスク領域を解放しないためです。
ZFS スナップショットには次の特長があります。
システムの再起動後も残ります。
スナップショットの理論上の最大数は、264 です。
スナップショットは個別のバッキングストアを使用しません。スナップショットは、作成元のファイルシステムまたはボリュームと同じストレージプールのディスク領域を直接使用します。
再帰的なスナップショットは、1 つの原子動作としてすばやく作成されます。スナップショットは、まとめて (一度にすべて) 作成されるか、まったく作成されないかのどちらかです。原子スナップショット動作の利点は、子孫ファイルシステムにまたがる場合でも、常にある一貫した時間のスナップショットデータが取得されることです。
ボリュームのスナップショットに直接アクセスすることはできませんが、それらの複製、バックアップ、ロールバックなどを行うことはできます。ZFS スナップショットのバックアップの詳細については、「ZFS データを送信および受信する」を参照してください。
スナップショットは、zfs snapshot コマンドを使って作成します。引数として、作成するスナップショットの名前だけを指定できます。スナップショット名は次のように指定します。
filesystem@snapname volume@snapname |
スナップショット名は、「ZFS コンポーネントに名前を付けるときの規則」の命名要件に従って付ける必要があります。
次の例では、tank/home/ahrens のスナップショットが friday という名前で作成されます。
# zfs snapshot tank/home/ahrens@friday |
すべての子孫ファイルシステムのスナップショットを作成するには、-r オプションを使用します。次に例を示します。
# zfs snapshot -r tank/home@now # zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT rpool/ROOT/zfs2BE@zfs2BE 78.3M - 4.53G - tank/home@now 0 - 26K - tank/home/ahrens@now 0 - 259M - tank/home/anne@now 0 - 156M - tank/home/bob@now 0 - 156M - tank/home/cindys@now 0 - 104M - |
スナップショットには、変更できるプロパティーはありません。また、データセットのプロパティーをスナップショットに適用することもできません。次に例を示します。
# zfs set compression=on tank/home/ahrens@now cannot set compression property for 'tank/home/ahrens@now': snapshot properties cannot be modified |
スナップショットを破棄するには、zfs destroy コマンドを使用します。次に例を示します。
# zfs destroy tank/home/ahrens@now |
データセットのスナップショットが存在する場合、そのデータセットを破棄することはできません。次に例を示します。
# zfs destroy tank/home/ahrens cannot destroy 'tank/home/ahrens': filesystem has children use '-r' to destroy the following datasets: tank/home/ahrens@tuesday tank/home/ahrens@wednesday tank/home/ahrens@thursday |
また、スナップショットからクローンが作成されている場合は、スナップショットを破棄する前にクローンを破棄する必要があります。
destroy サブコマンドの詳細については、「ZFS ファイルシステムを破棄する」を参照してください。
異なる自動スナップショットポリシーを実装しており、送信側にもう存在しないという理由で古いスナップショットが 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 プロパティーの値は、このスナップショットに設定されている保持の数に設定されます。この数のことをユーザー参照カウントとも呼びます。
スナップショットの名前を変更することはできますが、名前を変更するときはそれらが作成された同じプールとデータセットの中で行う必要があります。次に例を示します。
# zfs rename tank/home/cindys@083006 tank/home/cindys@today |
また、次のショートカット構文は前の構文と同等です。
# zfs rename tank/home/cindys@083006 today |
次のようなスナップショット名の変更操作はサポートされていません。ターゲットのプールとファイルシステムの名前が、スナップショットの作成されたプールとファイルシステムと異なるためです。
# zfs rename tank/home/cindys@today pool/home/cindys@saturday cannot rename to 'pool/home/cindys@today': snapshots must be part of same dataset |
zfs rename -r コマンドを使用すると、スナップショットの名前を再帰的に変更することができます。次に例を示します。
# zfs list NAME USED AVAIL REFER MOUNTPOINT users 270K 16.5G 22K /users users/home 76K 16.5G 22K /users/home users/home@yesterday 0 - 22K - users/home/markm 18K 16.5G 18K /users/home/markm users/home/markm@yesterday 0 - 18K - users/home/marks 18K 16.5G 18K /users/home/marks users/home/marks@yesterday 0 - 18K - users/home/neil 18K 16.5G 18K /users/home/neil users/home/neil@yesterday 0 - 18K - # zfs rename -r users/home@yesterday @2daysago # zfs list -r users/home NAME USED AVAIL REFER MOUNTPOINT users/home 76K 16.5G 22K /users/home users/home@2daysago 0 - 22K - users/home/markm 18K 16.5G 18K /users/home/markm users/home/markm@2daysago 0 - 18K - users/home/marks 18K 16.5G 18K /users/home/marks users/home/marks@2daysago 0 - 18K - users/home/neil 18K 16.5G 18K /users/home/neil users/home/neil@2daysago 0 - 18K - |
listsnapshots プールプロパティーを使用すれば、zfs list 出力でのスナップショット表示を有効または無効にすることができます。このプロパティーは、デフォルトで有効になっています。
このプロパティーを無効にした場合、zfs list -t snapshot コマンドを使用すればスナップショット情報を表示できます。あるいは、listsnapshots プールプロパティーを有効にします。次に例を示します。
# zpool get listsnapshots tank NAME PROPERTY VALUE SOURCE tank listsnapshots on default # zpool set listsnapshots=off tank # zpool get listsnapshots tank NAME PROPERTY VALUE SOURCE tank listsnapshots off local |
ファイルシステムのスナップショットには、ルートの .zfs/snapshot ディレクトリからアクセスできます。たとえば、tank/home/ahrens が /home/ahrens にマウントされている場合は、tank/home/ahrens@thursday スナップショットのデータには、/home/ahrens/.zfs/snapshot/thursday ディレクトリからアクセスできます。
# ls /tank/home/ahrens/.zfs/snapshot tuesday wednesday thursday |
スナップショットの一覧は次の方法で表示できます。
# zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT pool/home/anne@monday 0 - 780K - pool/home/bob@monday 0 - 1.01M - tank/home/ahrens@tuesday 8.50K - 780K - tank/home/ahrens@wednesday 8.50K - 1.01M - tank/home/ahrens@thursday 0 - 1.77M - tank/home/cindys@today 8.50K - 524K - |
特定のファイルシステムのために作成したスナップショットの一覧は、次の方法で表示できます。
# zfs list -r -t snapshot -o name,creation tank/home NAME CREATION tank/home@now Wed Jun 30 16:16 2010 tank/home/ahrens@now Wed Jun 30 16:16 2010 tank/home/anne@now Wed Jun 30 16:16 2010 tank/home/bob@now Wed Jun 30 16:16 2010 tank/home/cindys@now Wed Jun 30 16:16 2010 |
スナップショットを作成したときは、そのディスク領域は最初はスナップショットとファイルシステムの間で共有されます。それまでに作成したスナップショットと領域が共有されることもあります。ファイルシステムが変化していくにつれて、それまで共有されていたディスク領域がスナップショット固有になり、スナップショットの used プロパティーに計上されます。また、スナップショットを削除すると、ほかのスナップショットに固有の (および使用される) ディスク容量を増やすことができます。
スナップショット領域の referenced プロパティーの値は、スナップショットを作成したときのファイルシステムのプロパティーと同じです。
used プロパティーの値がどのように消費されているかについて、さらに詳細な情報を確認することができます。新しい読み取り専用ファイルシステムプロパティーは、クローン、ファイルシステム、およびボリュームに関するディスク領域使用状況を示します。次に例を示します。
$ zfs list -o space # zfs list -ro space tank/home NAME AVAIL USED USEDSNAP USEDDS USEDREFRESERV USEDCHILD tank/home 66.3G 675M 0 26K 0 675M tank/home@now - 0 - - - - tank/home/ahrens 66.3G 259M 0 259M 0 0 tank/home/ahrens@now - 0 - - - - tank/home/anne 66.3G 156M 0 156M 0 0 tank/home/anne@now - 0 - - - - tank/home/bob 66.3G 156M 0 156M 0 0 tank/home/bob@now - 0 - - - - tank/home/cindys 66.3G 104M 0 104M 0 0 tank/home/cindys@now - 0 - - - - |
これらのプロパティーについては、表 6–1 を参照してください。
zfs rollback コマンドを使用すると、特定のスナップショットが作成された時点よりもあとにファイルシステムに対して行われたすべての変更を破棄できます。ファイルシステムは、そのスナップショットが作成されたときの状態に戻ります。デフォルトでは、このコマンドを使って、最新のスナップショット以外のスナップショットにロールバックすることはできません。
それより前のスナップショットにロールバックするには、中間にあるスナップショットをすべて破棄する必要があります。-r オプションを指定すれば、古いスナップショットを破棄できます。
中間にあるスナップショットのクローンが存在する場合は、-R オプションを指定してクローンも破棄する必要があります。
ロールバックするファイルシステムが現在マウントされている場合は、そのマウントが解除されてから再度マウントされます。ファイルシステムのマウントを解除できない場合は、ロールバックに失敗します。必要に応じて -f オプションを指定すると、ファイルシステムのマウントが強制的に解除されます。
次の例では、tank/home/ahrens ファイルシステムが tuesday スナップショットにロールバックされます。
# zfs rollback tank/home/ahrens@tuesday cannot rollback to 'tank/home/ahrens@tuesday': more recent snapshots exist use '-r' to force deletion of the following snapshots: tank/home/ahrens@wednesday tank/home/ahrens@thursday # zfs rollback -r tank/home/ahrens@tuesday |
この例では、スナップショット wednesday および thursday が破棄されます。これらよりも古いスナップショット tuesday にロールバックされるためです。
# zfs list -r -t snapshot -o name,creation tank/home/ahrens NAME CREATION tank/home/ahrens@now Wed Jun 30 16:16 2010 |