今回は一回休み、というか一般的な 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 -
目的のスナップショット名のみ取り出す
これらのオプションスイッチを組み合わせた上で、headとtailコマンド、あるいは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回実行されてしまいます。
(2023/01/03追記ここから)
Ubuntu 22.04 LTS on ZFS をインストールする場合には、データセットはUbuntuデフォルトになるべく合わせる方向でやっています。その結果として、システムのロールバック時には、下記コマンドを実行する必要があります。
要するに、aptのパッケージ管理も巻き戻す必要があるのですが、その為に/var/lib/aptと/var/lib/dpkgも処理します。
なんでこんな面倒臭い事になったかというと、/var/libを別のデータセットにしたからですね。/var/libが別になってる理由は/varを別のデータセットにしたからです。
これもそれなりに理由があるようです。仕方が無いですねぇ。面倒臭いですが、飲み込みます。
zfs list -t snapshot -o name tank/ROOT/ubuntu | grep 20220322 | xargs -rt zfs rollback
zfs list -t snapshot -o name tank/ROOT/ubuntu/var/lib/apt | grep 20220322 | xargs -rt zfs rollback
zfs list -t snapshot -o name tank/ROOT/ubuntu/var/lib/dpkg | grep 20220322 | xargs -rt zfs rollback
reboot
(2023/01/03追記ここまで)
スナップショットの削除
コマンドはzfs destroyです。上述の一覧表示で取り出したスナップショット名を与えるようにすると間違いも減るでしょう。
zfs list -t snapshot -o name tank/main/ubuntu | grep 20220322 | xargs -rt zfs destroy
スナップショットは素晴らしい
![]()