やっぱり Sun がスキ! : Weblog やっぱり Sun がスキ!

やっぱり Sun がスキ!

http://blogs.sun.com/yappri/date/20071217 2007年 12月 17日 月曜日

ZFS スナップショット

今回は、 ZFS のスナップショット機能に関して少し掘り下げて説明します。

ZFS のスナップショットを作成すると、ご存じの通り変更後のファイル システムをスナップショットの状態に戻す事ができます。
それでは、実際にスナップショットを作成して、ZFS がどのような動作をするか 見てみましょう。

まずは、testpool/home ファイルシステムにスナップショット @monday を作成します。

# zfs snapshot testpool/home@monday

# zfs list
NAME                    USED   AVAIL  REFER  MOUNTPOINT
testpool                2.16M   252M  38.2K  /testpool
testpool/home           2.04M   252M  2.04M  /testpool/home
testpool/home@monday    0       -     2.04M  -

スナップショットの名前は、 @monday のように @ を付けて指定します。
このスナップショットの実体は、物理コピーでなく変更のあった差分だけデータ を保持しますので、最初は @monday スナップショットの USED が 0 Byte になります。

そこで、testpool/home ファイルシステムから差分を発生させる為、 1M Byte の ファイル aaa を消してみます。
# ls -l /testpool/home
合計 4108
-rw-rw-rw-   1 root  root       1048576 12月 12日  17:26 aaa
-rw-rw-rw-   1 root  root       1048576 12月 12日  17:23 bbb

# rm /testpool/home/aaa

# zfs list
NAME                   USED  AVAIL  REFER  MOUNTPOINT
testpool              2.26M   251M  38.2K  /testpool
testpool/home         2.07M   251M  1.04M  /testpool/home
testpool/home@monday  1.04M   -     2.04M  -
1M Byte のファイルを消去しましたので、@monday スナップショットの USED が 1M Byte (消去したファイル分)になりました。

ここで、作成したスナップショットのデータはどこに存在しているのでしょうか?
作成したスナップショットは、ファイルシステム直下の隠しファイル .zfs/snapshot ディレクトリ以下に存在します。
# ls -al /testpool/home
合計 6170
drwxr-xr-x   2 root  sys       5 12月 12日  16:31 .
drwxr-xr-x   3 root  sys       3 12月 12日  16:22 ..
-rw-rw-rw-   1 root  root       1048576 12月 12日  16:28 aaa
ls -al オプションでリストを表示しても、.zfs ディレクトリはデフォルトで 表示されませんが .zfs/snapshot ディレクトリを直接指定してリストを表示 してみます。
# ls -l /testpool/home/.zfs/snapshot
合計 4
drwxr-xr-x   2 root  sys       4 12月 12日  16:27 monday

# ls -l /testpool/home/.zfs/snapshot/monday
合計 4108
-rw-rw-rw-   1 root  root       1048576 12月 12日  16:28 aaa
-rw-rw-rw-   1 root  root       1048576 12月 12日  16:29 bbb
このスナップショットのデータは、読み込み専用で参照する事が可能なので、一部のファイル を戻したい時は、ここのディレクトリから直接コピーしてファイルを復旧する事ができます。


最後にロールバック機能を説明します。
下記例では、スナップショット @monday と @tuesday があり、新しい方の @tuesday をロールバックしてみます。
# zfs list
NAME                            USED  AVAIL  REFER  MOUNTPOINT
testpool                       3.24M   251M  38.2K  /testpool
testpool/home                  3.11M   251M  2.04M  /testpool/home
testpool/home@monday           1.04M      -  2.04M  -
testpool/home@tuesday          33.7K      -  1.04M  -

# zfs rollback testpool/home@tuesday
作成したスナップショットを戻す時は、rollback オプションを使用します。
最新のスナップショットではなく、何世代か前のスナップショット(ここでは @monday) をロールバックする時は、さらに -r オプションを付与して実行します。
# zfs rollback -r testpool/home@monday

# zfs list
NAME                     USED  AVAIL  REFER  MOUNTPOINT
testpool                2.16M   252M  38.2K  /testpool
testpool/home           2.04M   252M  2.04M  /testpool/home
testpool/home@monday        0      -  2.04M  -
補足として、何世代か前のスナップショットをロールバックすると、それより 新しい(この場合は @tuesday)スナップショットは消えてしまいます。

ZFS スナップショット機能は、早い、簡単、便利の3拍子揃っていますので、 是非お試し下さい!