Web更新

UnuntuでZFSを使ってみよう 第14回 スナップショットについて詳しく知ろう

前回は、ZFSのスナップショットとクローン機能について説明しました。今回は、スナップショットのよく使う機能について説明します。

スナップショットへのロールバック

ZFSのスナップショットは、ある時点でのZFSファイルシステムの内容を保持します。例えば、ある時点のファイルシステムの内容に戻したい場合があるとします。ファイルシステム内のデータが壊れた場合、システムのバージョンアップ作業で不具合があり巻き戻し作業を行う場合などです。

この場合は、ZFSのファイルシステムを作業前のスナップショットに戻す(ロールバック)操作が可能です。ロールバックは以下のようにして行います。わかりやすい、ファイルの作成と削除の例としました。

# 新しいファイルシステムの作成し、/home/user1へマウント
$ sudo zfs create -o mountpoint=/home/user1 rpool/USERDATA/user1
$ zfs list -t snapshot rpool/USERDATA/user1
no datasets available
# ファイル /home/user1/aaa と bbb を作成
$ echo aaa | sudo tee /home/user1/aaa 
aaa
$ ls /home/user1/aaa
/home/user1/aaa
$ echo bbb | sudo tee /home/user1/bbb
bbb
# スナップショット aaa を作成
$ sudo zfs snapshot rpool/USERDATA/user1@aaa
$ zfs list -t snapshot rpool/USERDATA/user1
NAME                       USED  AVAIL     REFER  MOUNTPOINT
rpool/USERDATA/user1@aaa     0B      -      104K  -
# aaa を削除し、cccを作成
$ sudo rm /home/user1/aaa
$ echo ccc | sudo tee /home/user1/ccc
ccc
$ ls /home/user1
bbb  ccc
# スナップショットに、使用量が増える
$ zfs list -t snapshot rpool/USERDATA/user1
NAME                       USED  AVAIL     REFER  MOUNTPOINT
rpool/USERDATA/user1@aaa    64K      -      104K  -
# ロールバックを実施
$ sudo zfs rollback rpool/USERDATA/user1@aaa
# スナップショットの使用量が0になる
$ zfs list -t snapshot rpool/USERDATA/user1
NAME                       USED  AVAIL     REFER  MOUNTPOINT
rpool/USERDATA/user1@aaa     0B      -      104K  -
# スナップショット取得時の状態に戻り、削除したaaaが復活、作成したcccが削除される。
$ ls /home/user1/
aaa  bbb

スナップショット内ファイルの参照方法

スナップショット内の特定ファイルを参照したい場合、zfsファイルシステムのプロパティsnapdirをvisible に変更する必要があります。snapdirをvisibleに設定すると、ZFSファイルシステムの先頭ディレクトリに、.zfs/snapshot が作成されます。このディレクトリ配下に、snapshot名ごとのディレクトリが作成され内容を参照できます。スナップショットなので、このディレクトリへの書き込みは不可能です。

$ sudo zfs set snapdir=visible rpool/USERDATA/user1
$ ls /home/user1/.zfs/snapshot
aaa/  zfs-auto-snap_frequent-2020-12-20-0600/
$ echo ccc | sudo tee /home/user1/ccc
ccc 
$ ls /home/user1
aaa  bbb  ccc
$  ls /home/user1/.zfs/snapshot/aaa
aaa  bbb
$ sudo zfs set snapdir=hidden rpool/USERDATA/user1
$ sudo ls -a /home/user1
.  ..  aaa  bbb  ccc

この設定はファイルシステムごとに設定可能です。また、.zfs を見えないようにするには、プロパティsnapshotをhidden に設定します。プロパティsnapshotのデフォルト値はhiddenです。

スナップショット間の差分の確認

スナップショットの差分を調べるには、zfs diff スナップショット名を使用します。zfs diffでは、指定したスナップショットと現在のZFSファイルシステムとの差分を表示します。

# 上記例の状態を新たにスナップショットとして保持します。
$ sudo zfs snapshot rpool/USERDATA/user1@ccc
# スナップショットaaa を、現在の状態と比較します。ファイルcccが追加され、
# それによりディレクトリ/home/user1の変更がわかります。
$ sudo zfs diff rpool/USERDATA/user1@aaa
+       /home/user1/ccc
M       /home/user1/
# 最新のスナップショット cccとの差分はありません。
$ sudo zfs diff rpool/USERDATA/user1@ccc
# スナップショット間の差分も確認できます。
$ sudo zfs diff rpool/USERDATA/user1@aaa rpool/USERDATA/user1@ccc
+       /home/user1/ccc
M       /home/user1/
# ファイルcccを削除すると、スナップショットaaaとの差分が一つ減ります。
$ sudo rm /home/user1/ccc
$ sudo zfs diff rpool/USERDATA/user1@aaa
M       /home/user1/
# 一方、スナップショットcccとの差分でファイル削除されたことがわかります。
$ sudo zfs diff rpool/USERDATA/user1@ccc
-       /home/user1/ccc
M       /home/user1/
# ファイルcccを再度作り直し、ファイルbbbの内容を変更します。
$ echo ccc | sudo tee /home/user1/ccc
ccc
$ echo bbbbbb | sudo tee /home/user1/bbb
bbbbbb
# スナップショットaaaとの差分では、ファイルbbbが変更されたことがわかります
$ sudo zfs diff rpool/USERDATA/user1@aaa
M       /home/user1/bbb
M       /home/user1/
+       /home/user1/ccc
# スナップショットcccとの差分では、ファイルbbbが変更され、ファイルcccが削除され再作成されたことがわかります。
$ sudo zfs diff rpool/USERDATA/user1@ccc
-       /home/user1/ccc
M       /home/user1/bbb
M       /home/user1/
+       /home/user1/ccc
# -F オプションをつけると、ファイルタイプを表示します。
$ sudo zfs diff -F rpool/USERDATA/user1@ccc
-       F       /home/user1/ccc
M       F       /home/user1/bbb
M       /       /home/user1/
+       F       /home/user1/ccc
# -t オプションをつけると、ファイルの状態を変更した時刻が、UNIX epoch timeで表示されます。
$ sudo zfs diff -t rpool/USERDATA/user1@ccc
1608444328.862887958    -       /home/user1/ccc
1608446555.915483083    M       /home/user1/bbb
1608446511.302112871    M       /home/user1/
1608446547.034002427    +       /home/user1/ccc

zfs diff の変更記号は、以下の意味を持ちます。

記号説明
削除されたファイル
+追加されたファイル
M変更されたファイル
R(ディレクトリ名を含む)名前を変更されたファイル

zfs diff -F のファイルタイプ表示は、以下の意味を持ちます。

記号説明
Bブロックデバイス
Cキャラクターデバイス
/ディレクトリ
>Door(Linuxでは使用されせん)
|ネームドパイプ
@シンボリックリンク
Pイベントポート
=ソケット
F通常ファイル

終わりに

今回は、スナップショットのよく使う機能について説明しました。次回は、スナップショットを使用したバックアップ/リストア方法について説明します。次回をお楽しみに。

さて、このコラムを掲載いただいているデジタル・ヒュージ・テクノロジー社は老舗のOSSインテグレーターです。特にLinuxは強く、OSSを活用した業務システムの実績も多いです。興味がある方は以下のページもご覧ください。
DHT OSS導入コンサルティングサービス

関連記事一覧