Go to main content
Oracle® Solaris 11.3 での ZFS ファイルシステムの管理

印刷ビューの終了

更新: 2016 年 11 月
 
 

ZFS スナップショットの概要

スナップショット」とは、ファイルシステムまたはボリュームの読み取り専用コピーのことです。スナップショットはほとんど瞬間的に作成することができ、最初はプール内で追加のディスク領域を消費しません。しかし、アクティブなデータセット内のデータが変化していくにつれて、スナップショットは古いデータを引き続き参照し、ディスク容量を解放しないため、ディスク領域を消費します。

クローン」とは、書き込み可能なボリュームまたはファイルシステムのことで、最初の内容は作成元のデータセットと同じです。クローンは、スナップショットからしか作成できません。

ZFS スナップショットには次の特長があります。

  • システムのリブート後も残ります。

  • スナップショットの理論上の最大数は、264 です。

  • スナップショットは個別のバッキングストアを使用しません。スナップショットは、作成元のファイルシステムまたはボリュームと同じストレージプールのディスク領域を直接使用します。

  • 再帰的なスナップショットは、1 つの原子動作としてすばやく作成されます。スナップショットは、まとめて (一度にすべて) 作成されるか、まったく作成されないかのどちらかです。原子スナップショット動作の利点は、子孫ファイルシステムにまたがる場合でも、常にある一貫した時間のスナップショットデータが取得されることです。

ボリュームのスナップショットに直接アクセスすることはできませんが、それらの複製、バックアップ、ロールバックなどを行うことはできます。ZFS スナップショットのバックアップの詳細については、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 送受信操作の一部である場合、操作は失敗する可能性があります。このシナリオを回避するには、スナップショットの保留を検討してください。

スナップショットを「保持」すると、そのスナップショットは破棄されなくなります。また、この機能と 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 スナップショットの名前を変更する

スナップショットの名前は変更できますが、スナップショットが作成されたときと同じプールおよびデータセット内に限ります。例:

# 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 スナップショットを表示してアクセスする

デフォルトでは、スナップショットはすでに 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

ZFS スナップショットのディスク領域の計上

スナップショットを作成すると、最初はそのディスク容量がスナップショットとファイルシステム間で共有されます。ただし、以前のスナップショットと共有される可能性もあります。ファイルシステムが変化していくにつれて、それまで共有されていたディスク領域がスナップショット固有になり、スナップショットの 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 スナップショットにロールバックする

zfs rollback コマンドを使用すると、特定のスナップショットが作成された時点よりもあとにファイルシステムに対して行われたすべての変更を破棄できます。ファイルシステムは、そのスナップショットが作成されたときの状態に戻ります。デフォルトでは、このコマンドを使って、最新のスナップショット以外のスナップショットにロールバックすることはできません。

以前のスナップショットにロールバックするには、–r オプションを指定して、中間のスナップショットをすべて破棄する必要があります。

中間のスナップショットのクローンが存在する場合は、–R オプションを指定してクローンも破棄します。


注 -  ロールバックするファイルシステムが現在マウントされている場合は、アンマウントしてから再マウントする必要があります。ファイルシステムをアンマウントできない場合は、ロールバックに失敗します。必要に応じて –f オプションを使用すると、ファイルシステムが強制的にアンマウントされます。

次の例では、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 スナップショットの相違点の識別 (zfs diff)

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 コマンドによって識別されるファイルまたはディレクトリの変更を要約したものです。

ファイルまたはディレクトリの変更
識別子
ファイルまたはディレクトリが変更されたかファイルまたはディレクトリのリンクが変更されました
M
ファイルまたはディレクトリは古いスナップショットに存在するが、最近のスナップショットには存在しません
ファイルまたはディレクトリは最近のスナップショットに存在するが、古いスナップショットには存在しません
+
ファイルまたはディレクトリの名前が変更されました
R

詳細については、zfs(1M) のマニュアルページを参照してください。

再帰的な ZFS スナップショットの相違点の表示

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@snap1sales@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) で終わる行がファイルシステム (データセット) およびマウントポイントを示しています。