Snapperユーティリティを使用したファイル・システム・スナップショットの自動化

Snapperユーティリティを使用すると、ファイル・システムのスナップショットの管理を自動化できます。このユーティリティを使用すると、スナップショットの作成と削除が容易になり、ユーザーはスナップショット間の差異を比較して変更をファイル・レベルで元に戻せるようになります。Snapperユーティリティの詳細は、アップストリームのプロジェクト・ページ(http://snapper.io/)を参照してください。

注意:

スナップショットでは、ある時点のファイル・システムの状態を記録します。そのため、スナップショットが作成された時点で操作中になっていた可能性のあるトランザクション・プロセスについては、ファイル・システムの整合性を保証することはできません。snapperコマンドのようなユーティリティは、dnfコマンドの使用時など、特定の操作の前後のスナップショットを取得するために役立ちますが、そのようなスナップショットはシステムで同時に実行している可能性のある別のプロセスを認識しません。I/Oやメモリーを大量に消費するプロセス(データベースやミドルウェア・アプリケーションなど)がある場合は、そうしたプロセスを停止するか、すべてのアクティビティが完了していることを確認してからスナップショットを取得することで、スナップショット内のデータ整合性やファイル・システムが破損する問題の可能性を減らせます。

Snapperユーティリティがインストールされていない場合は、次のコマンドを実行して、ol8_UEKR6 yumリポジトリからインストールできます。

sudo dnf install -y snapper

サブボリュームのSnapper構成の作成

snapperコマンドを使用して、Btrfsサブボリュームのスナップショットを作成および管理できます。

snapper構成をマウントされている既存のBtrfsサブボリュームに設定するには:

sudo snapper -c config_name create-config -f btrfs fs_name

前述のコマンドのconfig_nameは構成の名前、fs_nameはマウントされているBtrfsサブボリュームのパスです。コマンドを実行すると、次の処理が実行されます。

  • /etc/sysconfig/snapperファイルにconfig_nameのエントリを追加します。

  • 構成ファイル/etc/snapper/configs/config_nameを作成します。

  • スナップショット用の.snapshotsサブボリュームを設定します。

たとえば、次のコマンドはBtrfs rootファイル・システムにsnapper構成を設定します。

sudo snapper -c root create-config -f btrfs /

snapper list-configsコマンドを使用して、既存の構成をすべてリストします。

sudo snapper list-configs
Config      | Subvolume
------------+----------
home_config | /home    
root        | /        

ノート:

デフォルトのsnapper SELinuxポリシーを使用すると、snapperは//etc/mnt/usr/varおよびHOME_ROOT (通常は/home)のスナップショットを管理できるようになります。新しいディレクトリ(/data/srvなど)を作成する場合。そのディレクトリのスナップショットをsnapperが作成および管理できるように、そのディレクトリのSELinuxファイル・コンテキストを設定することが必要になる場合があります。たとえば、snapperで/dataディレクトリのスナップショットを管理できるようにするには、次のコマンドを実行します。

$ sudo semanage fcontext -a -t snapperd_data_t "/data/\.snapshots(/.*)?"
$ sudo restorecon -R -v /data

様々なタイプのスナップショットの作成

snapperコマンドを使用すると、次の3種類のスナップショットを作成できます。

post

ポスト・スナップショットを使用して、変更後のサブボリュームの状態を記録します。ポスト・スナップショットは常に、変更直前に実行するプリ・スナップショットと対になっています。

pre

プリ・スナップショットを使用して、変更前のサブボリュームの状態を記録します。プリ・スナップショットは常に、変更直前に実行するポスト・スナップショットと対になっています。

single

サブボリュームの状態の記録に単一のスナップショット使用しますが、サブボリュームのその他のスナップショットと関連性はありません。

サブボリュームの単一スナップショットを作成する場合は、snapper createコマンドを使用します。次に例を示します。

sudo snapper -c config_name create --description "description"

単一のスナップショットは、定期的なバックアップの用途に役立ちます。また、バックアップ・タイムラインの作成にも使用できます。自動Snapperスナップショットを参照してください。特定のファイル・システムを変更することになり、ロールバックが必要になる可能性のある操作には、preおよびpostのスナップショットを使用することでトランザクション前後のファイル・システムのスナップショットを取得できます。

たとえば、次のコマンドでは、サブボリュームのプリ・スナップショットおよびポスト・スナップショットを作成します。

sudo snapper -c config_name create -t pre -p N
... Modify the subvolume's contents...
sudo snapper -c config_name create -t post --pre-num N -p N'

snapperコマンドに-pオプションを指定するとスナップショットの番号が表示されるため、ポスト・スナップショットを作成する際や、preスナップショットとpostスナップショットの内容を比較する際に数字を参照できます。

snapperコマンドに--commandオプションを使用すると、単一の操作をpreおよびpostのスナップショットでラップできることに注意してください。次に例を示します:

snapper -c root create --command "cd /tmp/build; make install" \
    --description "Installing a home built binary"

プリ・スナップショットとポスト・スナップショットは、パッケージのインストール時やアップグレード時など、システム変更の実行が複雑すぎて手動で元に戻せない可能性のある場合によく使用されます。DNF snapperプラグイン(自動Snapperスナップショットを参照)は、このようにプリ・スナップショットとポスト・スナップショットを使用しています。また、スナップショットをトリガーしたDNFトランザクションを格納するために説明フィールドを使用しています。

たとえば、次のスナップショットのセットでは、タイムラインの一環としてトリガーされる定期的な単一スナップショットと、vimパッケージがインストールされているときにDNF snapperプラグインによってトリガーされるプリ・スナップショットとポスト・スナップショットを識別できます。

$ sudo snapper -c root list
 # | Type   | Pre # | Date                         | User | Cleanup  | Description              | Userdata
---+--------+-------+------------------------------+------+----------+--------------------------+---------
0  | single |       |                              | root |          | current                  |         
1  | single |       | Wed 25 Nov 2020 07:00:30 EST | root | timeline | timeline                 |         
2  | single |       | Wed 25 Nov 2020 08:00:01 EST | root | timeline | timeline                 |         
3  | single |       | Wed 25 Nov 2020 09:00:01 EST | root | timeline | timeline                 |         
4  | pre    |       | Wed 25 Nov 2020 09:07:21 EST | root | number   | /usr/bin/dnf install vim |         
5  | post   |     4 | Wed 25 Nov 2020 09:07:25 EST | root | number   | /usr/bin/dnf install vim |         
6  | single |       | Wed 25 Nov 2020 10:00:01 EST | root | timeline | timeline                 |         

自動Snapperスナップショット

デフォルトでは、各snapper構成に定期的なバックアップの設定が含まれています。これは、/etc/snapper/configs/config_nameファイルのTIMELINE_CREATE構成変数で制御します。自動スナップショットは、systemdタイマー・ユニットによってトリガーされます。このユニットは、タイムラインの作成を可能にするためにする必要があります。

sudo systemctl enable --now snapper-timeline.timer

2つ目のsystemdタイマー・ユニットでは、古いスナップショットのクリーン・アップを処理して、スナップショットを管理できる状態に維持します。このユニットも有効にする必要があります。次に例を示します。

sudo systemctl enable --now snapper-cleanup.timer

systemdタイマー・ユニットが有効化されていると、TIMELINE_CREATE変数が有効化されているすべてのsnapper構成で定期スナップショット・イベントが自動的にトリガーされます。特定の構成の定期スナップショットを無効にする場合は、この変数値を構成ファイルでnoに変更します。

デフォルトでは、snapperのタイムライン構成は、10時間ごと、10日ごと、10か月ごと、10年ごとのスナップショットを保持します。スナップショットは、クリーン・アップ・タイマーによってプルーニングされます。rootサブボリュームなどのビジー状態のサブボリュームについては、該当する値を要件に応じて変更することが必要になる場合があります。こうした値は、次の構成変数を変更することで設定します。

TIMELINE_LIMIT_HOURLY="10"
TIMELINE_LIMIT_DAILY="10"
TIMELINE_LIMIT_WEEKLY="10"
TIMELINE_LIMIT_MONTHLY="10"
TIMELINE_LIMIT_YEARLY="10"

クリーン・アップ・タイマーは、スナップショットの合計数が少なくなるように、その他のスナップショットもプルーニングします。詳細は、SNAPPER(8)およびSNAPPER-CONFIGS(5)マニュアル・ページを参照してください。

システムにDNF snapperプラグインをインストールすると、DNFトランザクションのプリ・スナップショットとポスト・スナップショットを自動的にトリガーできます。この機能は、システム・パッケージのアップグレードでデバッグが必要な障害が発生した場合や、インストール時またはアップグレード時に変更されたファイルを分析できるようにする場合に、変更をロールバックするために役立ちます。このプラグインが動作するために、ユーザーによる構成や操作は必要ありません。プラグインをインストールするには、次のコマンドを使用します。

sudo dnf install python3-dnf-plugin-snapper

インストールされると、その後続のDNFトランザクションごとにスナップショットがトリガーされます。詳細は、https://dnf-plugins-extras.readthedocs.io/en/latest/snapper.htmlを参照してください。

Snapperを使用したBtrfsスナップショットの操作

snapper構成またはサブボリュームに存在するスナップショットを表示するには、次のコマンドを実行します。

sudo snapper -c config_name list

2つのスナップショット間で追加、削除、または変更されたファイルおよびディレクトリを表示するには、statusサブコマンドを使用して、比較する2つのスナップショットの番号を指定します。

sudo snapper -c config_name status N .. N'

2つのスナップショット間のすべてのファイルの内容の違いを表示するには、diffサブコマンドを使用します。

sudo snapper -c config_name diff N .. N'

ファイルへのフルパスを指定すると、単一ファイルの2つのスナップショットの差異を表示することもできます。

sudo snapper -c config_name diff N .. N' /path/to/file

スナップショットを削除するには、その番号をdeleteサブコマンドに指定します。

sudo snapper -c config_name delete N''

サブボリューム内の、ポスト・スナップショットN'に含まれる変更をプリ・スナップショットN'に戻すには、次のようにします。

sudo snapper -c config_name undochange N .. N'

変更を元に戻しても、ファイル・システムが前のスナップショットに戻ることはありませんが、スナップショット内の既存のファイルに加えられた変更は元に戻ります。つまり、スナップショットの作成後に作成されたファイルは、undochange操作の後もそのまま残されることになります。undochangeサブコマンドは、その変更についてデータの整合性を検査しません。このコマンドによる変更の影響を明確に評価することなく、このコマンドを使用する場合は注意が必要です。

詳細は、snapper(8)マニュアル・ページを参照してください。

その他のBtrfsスナップショットを使用する場合と同様に、snapperによって生成されたスナップショットはマウントできます。スナップショット・ボリュームIDとsnapperスナップショット番号を相互に関連付けて、マウントまたはリストアするスナップショットを確定することが必要になる場合があります。snapper listコマンドを実行して、ロールバック先にするスナップショット番号を特定します。たとえば、DNFパッケージの更新が実行される前のスナップショットにロールバックするために、すべてのプリ・スナップショットとポスト・スナップショットを表示する場合は、次のコマンドを実行します。

sudo snapper -c root list -t pre-post

前のコマンドを実行すると、次の出力が生成されます。

Pre # | Post # | Pre Date                     | Post Date                    | Description                     | Userdata
------+--------+------------------------------+------------------------------+---------------------------------+---------
   4  |     5  | Wed 25 Nov 2020 09:07:21 EST | Wed 25 Nov 2020 09:07:25 EST | /usr/bin/dnf install vim        |         
 127  |   128  | Mon 30 Nov 2020 08:25:42 EST | Mon 30 Nov 2020 08:30:57 EST | /usr/bin/dnf update             |         

この例では、マウントするプリ・スナップショットの番号は127です。btrfs subvolume listコマンドを使用してsnapperスナップショットのサブボリュームIDを取得して、このIDまたはスナップショット・サブボリュームへのパスを使用してファイル・システムをマウントします。

sudo btrfs subvolume list /|grep .snapshots.*127  

前述のコマンドの出力は次のようになります。

ID 521 gen 11533 top level 268 path .snapshots/127/snapshot

続けて、次のコマンドを実行します。

sudo mount -o subvolid=521 /dev/sda2 /mnt

この情報を使用すると、rootファイル・システムのスナップショットでブートすることもできます。詳細は、rootファイル・システムとしての代替スナップショットのマウントを参照してください。