自宅サーバー構築譚:zfsスナップショットの操作


今回は一回休み、というか一般的な zfs スナップショットの操作の紹介です。他の話題に紛れてしまっているので、ここに纏めました。

  • スナップショットの作成
  • 作成したスナップショットの一覧表示
  • ロールバック
  • スナップショットの削除

こういうのを Linux コマンドと組み合わせて一工夫したワンライナー集みたいな感じになります。

スナップショットの作成

コマンドはzfs snapshotです。日時は、保存されてるのかも知れませんが表示できない(ように感じる)ので、日時を名前の頭に付けておいた方が良いです。

zfs snapshot tank/main/ubuntu@$(date +%Y%m%d_%H%M%S)_test

スナップショットの一覧表示

コマンドはzfs list -t snapshotです。他のコマンドと組み合わせてワンライナーを作る事を考えた場合、少々バリエーションがあります。

データセットの指定

我が家の場合tank/main/ubuntuがルートディレクトリで、システム関連を格納しています。ユーザーデータなどはtank/sub0のサブデータセットに格納しています。

zfs list -t snapshot tank/main/ubuntu

新しい順

日時の新しい順に表示する場合はオプションスイッチ-S nameを付けます。作成する時に名前の先頭に日時を付加したので、これで日時の順番になります。

これの良い所は、head -n2などとして最新の物だけ表示させる事が出来る点です。業務でエビデンスが必要な場合や、公開記事を書く場合に、余計な情報を出さずに済みます。

zfs list -t snapshot -S name tank/main/ubuntu | head -n2

例えばこんな結果になります。

# zfs list -t snapshot -S name tank/main/ubuntu | head -n2
NAME                                                      USED  AVAIL     REFER  MOUNTPOINT
tank/main/ubuntu@20220322_173258_test                      96K      -     1.45G  -

スナップショット名のみ表示

オプション-o nameで、スナップショット名のみ表示になります。

zfs list -t snapshot -S name -o name tank/main/ubuntu | head -n2

こんな表示になります。

# zfs list -t snapshot -S name -o name tank/main/ubuntu | head -n2
NAME
tank/main/ubuntu@20220322_173258_test

ヘッダ行を抑制

オプション-Hで、ヘッダ行を抑制して表示しないようにします。

zfs list -t snapshot -S name -H tank/main/ubuntu | head -n1

こんな表示になります。

# zfs list -t snapshot -S name -H tank/main/ubuntu | head -n1
tank/main/ubuntu@20220322_173258_test   96K    -       1.45G   -

目的のスナップショット名のみ取り出す

これらのオプションスイッチを組み合わせた上で、headtailコマンド、あるいはgrepコマンドでフィルタリングすれば、お望みのスナップショット名のみ取り出す事が出来ます。

例えばこんな感じ。

# zfs list -t snapshot -S name -o name -H tank/main/ubuntu | head -n1
tank/main/ubuntu@20220322_173258_test
# zfs list -t snapshot -S name -o name -H tank/main/ubuntu | grep 20220322
tank/main/ubuntu@20220322_173258_test
# zfs list -t snapshot -S name -o name -H tank/main/ubuntu | grep test
tank/main/ubuntu@20220322_173258_test

grepコマンドの出力には色が付いたりしますが、それは気にしない方向で。

ロールバック

スナップショットを撮った後に加えた変更を、全部丸っと無かった事にします。バージョン管理みたいな感触ですが、シンボリックリンクだろうがソケットだろうが何だろうがファイルシステムに加えられた変更全部が対象になってるのがスゴイ。

コマンドはzfs rollbackなんですが、xargsコマンドを利用する事で、パラメータとして与えるスナップショットを上述の一覧表示で取り出したスナップショット名から与えるようにします。

メモリ内容(キャッシュ)との不整合などを考えると、zfs rollbackの直後にrebootした方が良いです。

zfs list -t snapshot -o name tank/main/ubuntu | grep 20220322 | xargs -rt zfs rollback
reboot

ちなみにxargsコマンドのオプション-tは、実際に実行したコマンドを標準出力に出力してくれます。
オプション-rは、もしgrep失敗などで何も拾えなかった場合にはコマンドを実行しません。-rを指定しなかったら引数無しで1回実行されてしまいます。

スナップショットの削除

コマンドはzfs destroyです。上述の一覧表示で取り出したスナップショット名を与えるようにすると間違いも減るでしょう。

zfs list -t snapshot -o name tank/main/ubuntu | grep 20220322 | xargs -rt zfs destroy

スナップショットは素晴らしい