7 Snapperを使用したシステムの回復とスナップショット管理 #
Linuxでファイルシステムのスナップショットを作成し、ロールバックできるようにすることは、過去に要望の多かった機能です。Snapperを、BtrfsファイルシステムまたはシンプロビジョンのLVMボリュームと併用することによって、それに対応できます。
Btrfsは、Linux用の新しい書き込み時コピー方式のファイルシステムで、サブボリューム(各物理パーティション内の1つまたは複数の個別にマウント可能なファイルシステム)のファイルシステムスナップショット(特定時点におけるサブボリュームの状態のコピー)をサポートします。スナップショットは、XFS、Ext4、またはExt3でフォーマットされたシンプロビジョンLVMボリュームでもサポートされています。Snapperを使用してこれらのスナップショットを作成および管理できます。Snapperには、コマンドラインおよびYaSTインタフェースがあります。SUSE Linux Enterprise Serverバージョン 12から、Btrfsスナップショットからブートすることもできるようになりました。詳細については、7.3項 「スナップショットからのブートによるシステムロールバック」を参照してください。
Snapperを使用して、次のタスクを実行できます。
zypperやYaSTで行ったシステムの変更を元に戻す。詳細については、7.2項 「Snapperを使用した変更の取り消し」を参照してください。古いスナップショットからファイルを復元する。詳細については、7.2.2項 「Snapperを使用したファイルの復元」を参照してください。
スナップショットからブートすることによってシステムをロールバックする。詳細については、7.3項 「スナップショットからのブートによるシステムロールバック」を参照してください。
オンザフライでスナップショットを手動作成し、既存のスナップショットを管理する。詳細については、7.6項 「スナップショットの手動での作成と管理」を参照してください。
7.1 デフォルト設定 #
SUSE Linux Enterprise Server上のSnapperは、システム変更の「取り消しおよび回復ツール」として機能するように設定されています。デフォルトでは、SUSE Linux Enterprise Serverのルートパーティション(/)はBtrfsでフォーマットされています。ルートパーティション(/)に十分な容量(約16GB以上)がある場合、スナップショットの作成が自動的に有効になります。デフォルトでは、/以外のパーティション上でスナップショットを作成することはできません。
インストール中にSnapperを無効にした場合、後からいつでも有効にできます。そのためには、次のコマンドを実行して、ルートファイルシステムのデフォルトのSnapper設定を作成します。
tux > sudo snapper -c root create-config /その後、7.1.3.1項 「スナップショットの無効化/有効化」の説明に従って、別のスナップショットタイプを有効にします。
スナップショットには、インストーラの推奨に従ってサブボリュームが設定されたBtrfsルートファイルシステムと、16GB以上のパーティションサイズが必要であることに注意してください。
スナップショットを作成すると、スナップショットとスナップショット元のファイルは、 いずれもファイルシステム内の同じブロックを指します。そのため、最初は、スナップショットが余分にディスク容量を占めることはありません。元のファイルシステムのデータが変更されると、変更されたデータブロックがコピーされ、古いデータブロックはスナップショットのように保持されます。このため、スナップショットは、変更されたデータと同じ容量を占めます。こうして、時間が経過するにつれて、スナップショットの領域は大きくなっていきます。その結果、スナップショットを含むBtrfsファイルシステムからファイルを削除しても、ディスクの空き容量が増えないことがあります。
スナップショットは常に、スナップショット作成元と同じパーティションまたはサブボリュームに保存されます。別のパーティションまたはサブボリュームにスナップショットを保存することはできません。
その結果、スナップショットを含むパーティションは、「通常の」パーティションよりも大きくする必要があります。具体的な容量は、保持するスナップショット数やデータの変更頻度によって異なります。一般的には、通常のファイルシステムの2倍程度を検討してください。ディスク容量が不足しないようにするために、古いスナップショットは自動的にクリーンアップされます。詳細については、7.1.3.4項 「スナップショットのアーカイブの制御」を参照してください。
7.1.1 スナップショットのタイプ #
スナップショット自体は技術的な意味では同じですが、トリガするイベントに基づいて、次の3種類のスナップショットを区別しています。
- タイムラインスナップショット
1時間ごとに1つのスナップショットが作成されます。古いスナップショットは自動的に削除されます。デフォルトで、最近10日間、10カ月間、10年間の最初のスナップショットが保持されます。タイムラインスナップショットはデフォルトで無効になっています。
- インストールスナップショット
YaSTまたはZypperで1つ以上のパッケージをインストールする場合、常にスナップショットのペアが作成されます。インストール開始前のスナップショット(「事前」)と、インストール完了後のスナップショット(「事後」)です。カーネルなどの重要なコンポーネントがインストールされた場合、スナップショットのペアは重要とマークされます(
important=yes)。古いスナップショットは自動的に削除されます。デフォルトでは、最新の10個の重要なスナップショット、および最新の10個の「通常」のスナップショット(管理スナップショットを含む)が保持されます。インストールスナップショットはデフォルトで有効になっています。- 管理スナップショット
システムをYaSTで管理する場合、常にスナップショットのペアが作成されます。YaSTモジュール開始時のスナップショット(「事前」)と、モジュール終了時のスナップショット(「事後」)です。古いスナップショットは自動的に削除されます。デフォルトでは、最新の10個の重要なスナップショットと最新の10個の「通常」のスナップショット(インストールスナップショットを含む)が保持されます。管理スナップショットはデフォルトで有効になっています。
7.1.2 スナップショットから除外されるディレクトリ #
一部のディレクトリは、さまざまな理由により、スナップショットから除外する必要があります。次のリストは、除外されるすべてのディレクトリを示しています。
/boot/grub2/i386-pc、/boot/grub2/x86_64-efi、/boot/grub2/powerpc-ieee1275、/boot/grub2/s390x-emuブートローダ設定のロールバックはサポートされていません。これらのディレクトリは、アーキテクチャ固有です。最初の2つのディレクトリはAMD64/Intel 64マシン上に存在し、その後の2つのディレクトリはそれぞれIBM POWERとIBM Z上に存在します。
/home/homeが独立したパーティションに存在していない場合、ロールバック時にデータが失われのを避けるために除外されます。/opt、/var/optサードパーティ製品は通常、
/optにインストールされます。ロールバック時にこれらのアプリケーションがアンインストールされるのを避けるために除外されます。/srvWebおよびFTPサーバ用のデータが含まれています。ロールバック時にデータが失われるのを避けるために除外されます。
/tmp、/var/tmp、/var/cache、/var/crashスナップショットから除外される一時ファイルとキャッシュを含むすべてのディレクトリ。
/usr/localこのディレクトリは、ソフトウェアの手動インストール時に使用します。ロールバック時にこれらのインストール済みソフトウェアがアンインストールされるのを避けるために除外されます。
/var/lib/libvirt/imageslibvirtで管理される仮想マシンイメージのデフォルトの場所。ロールバック時に仮想マシンイメージが古いバージョンに置き換えられないようにするために除外されます。デフォルトでは、このサブボリュームは、
no copy on writeオプションを使用して作成されます。/var/lib/mailman、/var/spool電子メールまたは電子メールキューを含むディレクトリは、ロールバック後に電子メールが失われるのを避けるために除外されます。
/var/lib/namedDNSサーバ用のゾーンデータが含まれます。ネームサーバがロールバック後に確実に動作できるように、スナップショットから除外されます。
/var/lib/mariadb、/var/lib/mysql、/var/lib/pgqslこれらのディレクトリにはデータベースのデータが格納されます。デフォルトでは、このサブボリュームは、
no copy on writeオプションを使用して作成されます。/var/logログファイルの場所。壊れたシステムのロールバック後にログファイルを分析できるようにスナップショットから除外されます。デフォルトでは
/var/logにはNoCOW属性セットがあり、パフォーマンスを改善し、重複ブロック数を削減するコピーオンライトが無効になっています。lsattrで確認します。tux >lsattr -l /var/ /var/log No_COW
7.1.3 設定のカスタマイズ #
SUSE Linux Enterprise Serverには、適切なデフォルト設定が付属していて、ほとんどの使用事例ではこのままで十分です。ただし、スナップショットの自動作成およびスナップショットの維持管理のあらゆる側面をニーズに合わせて設定できます。
7.1.3.1 スナップショットの無効化/有効化 #
3つのスナップショットの種類(タイムライン、インストール、および管理)はそれぞれ独立して有効化または無効化することができます。
- タイムラインスナップショットの有効化/無効化
有効化.
snapper-c root set-config "TIMELINE_CREATE=yes"無効化.
snapper -c root set-config "TIMELINE_CREATE=no"タイムラインスナップショットは、ルートパーティションを除きデフォルトで有効になっています。
- インストールスナップショットの有効化/無効化
有効化.
snapper-zypp-pluginパッケージをインストールします。無効化.
snapper-zypp-pluginパッケージをアンインストールします。インストールスナップショットはデフォルトで有効になっています。
- 管理スナップショットの有効化/無効化
有効化.
/etc/sysconfig/yast2でUSE_SNAPPERをyes (はい)に設定します。無効化.
/etc/sysconfig/yast2でUSE_SNAPPERをno (いいえ)に設定します。管理スナップショットはデフォルトで有効になっています。
7.1.3.2 インストールスナップショットの制御 #
YaSTまたはZypperでパッケージをインストールする際にスナップショットペアを作成する処理は、snapper-zypp-pluginが扱います。XML環境設定ファイル/etc/snapper/zypp-plugin.confで、スナップショットを作成するタイミングを定義します。デフォルトでは、ファイルは次のようになっています。
1 <?xml version="1.0" encoding="utf-8"?> 2 <snapper-zypp-plugin-conf> 3 <solvables> 4 <solvable match="w"1 important="true"2>kernel-*3</solvable> 5 <solvable match="w" important="true">dracut</solvable> 6 <solvable match="w" important="true">glibc</solvable> 7 <solvable match="w" important="true">systemd*</solvable> 8 <solvable match="w" important="true">udev</solvable> 9 <solvable match="w">*</solvable>4 10 </solvables> 11 </snapper-zypp-plugin-conf>
match属性は、パターンがUnixシェルと同様のワイルドカードであるか( | |
指定されたパターンが一致し、対応するパッケージに重要のマークが付いている場合(カーネルパッケージなど)、そのスナップショットにも重要のマークが付きます。 | |
パッケージ名に一致するパターン。特殊文字は、 | |
この行は、無条件にすべてのパッケージに一致します。 |
この設定スナップショットでは、パッケージのインストール時に常にペアが作成されます(9行目)。重要のマークが付いたkernel、dracut、glibc、systemd、またはudevパッケージがインストールされると、そのスナップショットペアにも重要のマークが付きます(4~8行目)。すべてのルールが評価されます。
ルールを無効にするには、削除するか、XMLコメントを使用して無効にします。パッケージがインストールされるたびにスナップショットペアが作成されないようにするには、次のようにします。たとえば、9行目のコメント行のように指定します。
1 <?xml version="1.0" encoding="utf-8"?> 2 <snapper-zypp-plugin-conf> 3 <solvables> 4 <solvable match="w" important="true">kernel-*</solvable> 5 <solvable match="w" important="true">dracut</solvable> 6 <solvable match="w" important="true">glibc</solvable> 7 <solvable match="w" important="true">systemd*</solvable> 8 <solvable match="w" important="true">udev</solvable> 9 <!-- <solvable match="w">*</solvable> --> 10 </solvables> 11 </snapper-zypp-plugin-conf>
7.1.3.3 新規サブボリュームの作成とマウント #
/階層下に新規のサブボリュームを作成し、永続的にマウントすることができます。このようなサブボリュームはスナップショットから除外されます。既存のスナップショット内に作成してはいけません。ロールバック後にスナップショットを削除できなくなるためです。
SUSE Linux Enterprise Serverは、/@/サブボリュームが設定されており、このサブボリュームは、/opt、/srv、/home、その他の永続サブボリュームの独立したルートとしての役割を果たします。作成し、永続的にマウントする新規のサブボリュームは、この初期のルートファイルシステムに作成しなければなりません。
そのように設定するには、次のコマンドを実行します。この例では、新規サブボリューム、/usr/importantは/dev/sda2から作成されます。
tux >sudo mount /dev/sda2 -o subvol=@ /mnttux >sudo btrfs subvolume create /mnt/usr/importanttux >sudo umount /mnt
/etc/fstabの該当エントリは、次のようになります。
/dev/sda2 /usr/important btrfs subvol=@/usr/important 0 0
サブボリュームには、仮想化ディスクイメージ、データベースファイル、ログファイルなど、頻繁に変更されるファイルが含まれている場合があります。その場合、ディスクブロックの重複を避けるため、このボリュームのコピーオンライト機能を無効にすることを検討します。そのためには、/etc/fstabでnodatacowマウントオプションを使用します。
/dev/sda2 /usr/important btrfs nodatacow,subvol=@/usr/important 0 0
1つのファイルまたはディレクトリに対してコピーオンライトを無効にするには、コマンドchattr +C PATHを使用します。
7.1.3.4 スナップショットのアーカイブの制御 #
スナップショットはディスク容量を占有します。ディスク容量が不足してシステムが停止しないようにするために、古いスナップショットは自動的に削除されます。デフォルトでは、最大10個の重要なインストールスナップショットと管理スナップショット、および最大10個の標準のインストールスナップショットと管理スナップショットが保持されます。これらのスナップショットがルートファイルシステムのサイズの50%超を占有する場合、追加のスナップショットは削除されます。最低でも、4つの重要なスナップショットと2つの標準スナップショットは常に保持されます。
これらの値の変更方法については、7.5.1項 「既存の設定の管理」を参照してください。
7.1.3.5 シンプロビジョンLVMボリュームでのSnapperの使用 #
Snapperは、Btrfsファイルシステムのスナップショット作成だけでなく、XFS、Ext4、またはExt3でフォーマットされたシンプロビジョンLVMボリュームのスナップショット作成にも対応しています(通常のLVMボリュームのスナップショットには「対応していません」)。LVMボリュームに関する詳細および設定の手順については、12.2項 「LVMの設定」を参照してください。
シンプロビジョンLVMボリュームでSnapperを使用するには、そのようにSnapperの設定を作成する必要があります。LVMで、--fstype=lvm(FILESYSTEM)を使用してファイルシステムを指定する必要があります。ext3、etx4、またはxfsは、FILESYSTEMの有効な値です。例:
tux > sudo snapper -c lvm create-config --fstype="lvm(xfs)" /thin_lvm7.5.1項 「既存の設定の管理」で説明したように、必要に応じてこの設定を調整できます。
7.2 Snapperを使用した変更の取り消し #
SUSE Linux Enterprise ServerのSnapperは、zypperやYaSTで行った変更を取り消すことができるツールとしてあらかじめ設定されています。このために、Snapperは、zypperおよびYaSTの実行前後にスナップショットのペアを作成します。また、Snapperを使用して、誤って削除または変更したシステムファイルを復元することもできます。このためには、ルートパーティションのタイムラインスナップショットを有効にする必要があります。詳細については、7.1.3.1項 「スナップショットの無効化/有効化」を参照してください。
上記の自動スナップショットは、デフォルトでルートパーティションとそのサブボリュームに対して設定されます。カスタム設定を作成すれば、/homeなど、他のパーティションに対してスナップショット機能を使用できます。
スナップショットを操作してデータを復元する場合、Snapperが処理可能なシナリオとして、根本的に異なる次の2つのシナリオがあることを理解することが重要です。
- 変更の取り消し
次に説明されているように、変更を取り消す際には、2つのスナップショットが比較され、これらの2つのスナップショット間の変更が取り消されます。この方法を使用して、復元する必要があるファイルを明示的に選択できます。
- ロールバック
7.3項 「スナップショットからのブートによるシステムロールバック」で説明されているように、ロールバックを実行すると、システムはスナップショットが作成された状態にリセットされます。
変更を取り消す場合は、現在のシステムとスナップショットを比較することもできます。このような比較から「すべての」ファイルを復元すると、ロールバックを実行した場合と同じ結果になります。ただし、ロールバックについては、7.3項 「スナップショットからのブートによるシステムロールバック」で説明されている方法を使用することをお勧めします。この方法はより高速で、ロールバック実行前にシステムを確認できるためです。
スナップショットを作成する際に、データの整合性を確保するメカニズムがありません。スナップショットを作成するのと同時にファイルが書き込まれると(データベースなど)、ファイルが破損したり、ファイルへの書き込みが部分的になったりします。このようなファイルを復元すると、問題が発生することがあります。また、/etc/mtabなどの一部のシステムファイルは復元しないでください。このため、「必ず」、変更されたファイルとその差分をよく確認してください。どうしても元に戻すことが必要なファイルのみ復元してください。
7.2.1 YaSTおよびZypperによる変更の取り消し #
インストール時にルートパーティションをBtrfsで設定すると、Snapper(YaSTまたはZypperによる変更のロールバックがあらかじめ設定されている)が自動的にインストールされます。YaSTモジュールまたはZypperトランザクションを開始するたびに、2つのスナップショットが作成されます。モジュール開始前のファイルシステムの状態をキャプチャした「事前スナップショット」と、モジュール完了後の状態をキャプチャした「事後スナップショット」です。
YaSTのSnapperモジュールまたはsnapperコマンドラインツールを使用して、「事前スナップショット」からファイルを復元し、YaST/Zypperによる変更を元に戻すことができます。また、2つのスナップショットを比較して、どのファイルが変更されているか調べることができます。2つのバージョンのファイルの違いを表示することもできます(diff)。
YaSTのセクションにあるモジュールを起動するか、「
yast2 snapper」と入力します。がになっていることを確認します。 独自のSnapper設定を手動で追加していない限り、常にそのようになっています。
リストから事前スナップショットと事後スナップショットのペアを選択します。YaSTのスナップショットペアもZypperのスナップショットペアも、種類はです。YaSTのスナップショットの場合はに「
zypp(y2base)」と表示され、Zypperのスナップショットの場合は「zypp(zypper)」と表示されます。をクリックすると、2つのスナップショット間の内容に差異のあるファイルのリストが表示されます。
ファイルのリストを確認します。事前および事後のファイル間の「差異」を表示するには、リストからファイルを選択します。
1つまたは複数のファイルを復元するには、該当するチェックボックスをオンにして、関連するファイルまたはディレクトリを選択します。をクリックし、をクリックして操作を確認します。
単一のファイルを復元する場合は、ファイル名をクリックして差分を表示します。をクリックし、をクリックして選択内容を確認します。
snapperコマンドによる変更の取り消し #snapper list -t pre-postを実行すると、YaSTおよびZypperのスナップショットリストが表示されます。YaSTのスナップショットの場合はに「yast MODULE_NAME」と表示され、Zypperのスナップショットの場合は「zypp(zypper)」と表示されます。tux >sudo snapper list -t pre-post Pre # | Post # | Pre Date | Post Date | Description ------+--------+-------------------------------+-------------------------------+-------------- 311 | 312 | Tue 06 May 2014 14:05:46 CEST | Tue 06 May 2014 14:05:52 CEST | zypp(y2base) 340 | 341 | Wed 07 May 2014 16:15:10 CEST | Wed 07 May 2014 16:15:16 CEST | zypp(zypper) 342 | 343 | Wed 07 May 2014 16:20:38 CEST | Wed 07 May 2014 16:20:42 CEST | zypp(y2base) 344 | 345 | Wed 07 May 2014 16:21:23 CEST | Wed 07 May 2014 16:21:24 CEST | zypp(zypper) 346 | 347 | Wed 07 May 2014 16:41:06 CEST | Wed 07 May 2014 16:41:10 CEST | zypp(y2base) 348 | 349 | Wed 07 May 2014 16:44:50 CEST | Wed 07 May 2014 16:44:53 CEST | zypp(y2base) 350 | 351 | Wed 07 May 2014 16:46:27 CEST | Wed 07 May 2014 16:46:38 CEST | zypp(y2base)スナップショットのペア間で変更されたファイルのリストを取得するには、以下を実行します。
snapper statusPREPOST. 内容が変更されたファイルにはのマーク、追加されたファイルにはのマーク、削除されたファイルにはのマークが付いています。tux >sudo snapper status 350..351 +..... /usr/share/doc/packages/mikachan-fonts +..... /usr/share/doc/packages/mikachan-fonts/COPYING +..... /usr/share/doc/packages/mikachan-fonts/dl.html c..... /usr/share/fonts/truetype/fonts.dir c..... /usr/share/fonts/truetype/fonts.scale +..... /usr/share/fonts/truetype/みかちゃん-p.ttf +..... /usr/share/fonts/truetype/みかちゃん-pb.ttf +..... /usr/share/fonts/truetype/みかちゃん-ps.ttf +..... /usr/share/fonts/truetype/みかちゃん.ttf c..... /var/cache/fontconfig/7ef2298fde41cc6eeb7af42e48b7d293-x86_64.cache-4 c..... /var/lib/rpm/Basenames c..... /var/lib/rpm/Dirnames c..... /var/lib/rpm/Group c..... /var/lib/rpm/Installtid c..... /var/lib/rpm/Name c..... /var/lib/rpm/Packages c..... /var/lib/rpm/Providename c..... /var/lib/rpm/Requirename c..... /var/lib/rpm/Sha1header c..... /var/lib/rpm/Sigmd5特定のファイルの差異を表示するには、以下を実行します。
snapper diffPRE..POST ファイル名ファイル名を指定しない場合は、すべてのファイルの差異が表示されます。tux >sudo snapper diff 350..351 /usr/share/fonts/truetype/fonts.scale --- /.snapshots/350/snapshot/usr/share/fonts/truetype/fonts.scale 2014-04-23 15:58:57.000000000 +0200 +++ /.snapshots/351/snapshot/usr/share/fonts/truetype/fonts.scale 2014-05-07 16:46:31.000000000 +0200 @@ -1,4 +1,4 @@ -1174 +1486 ds=y:ai=0.2:luximr.ttf -b&h-luxi mono-bold-i-normal--0-0-0-0-c-0-iso10646-1 ds=y:ai=0.2:luximr.ttf -b&h-luxi mono-bold-i-normal--0-0-0-0-c-0-iso8859-1 [...]1つまたは複数のファイルを復元するには、以下を実行します。
snapper -v undochangePRE..POST ファイル名。ファイル名を指定しない場合は、変更されたすべてのファイルが復元されます。tux >sudo snapper -v undochange 350..351 create:0 modify:13 delete:7 undoing change... deleting /usr/share/doc/packages/mikachan-fonts deleting /usr/share/doc/packages/mikachan-fonts/COPYING deleting /usr/share/doc/packages/mikachan-fonts/dl.html deleting /usr/share/fonts/truetype/みかちゃん-p.ttf deleting /usr/share/fonts/truetype/みかちゃん-pb.ttf deleting /usr/share/fonts/truetype/みかちゃん-ps.ttf deleting /usr/share/fonts/truetype/みかちゃん.ttf modifying /usr/share/fonts/truetype/fonts.dir modifying /usr/share/fonts/truetype/fonts.scale modifying /var/cache/fontconfig/7ef2298fde41cc6eeb7af42e48b7d293-x86_64.cache-4 modifying /var/lib/rpm/Basenames modifying /var/lib/rpm/Dirnames modifying /var/lib/rpm/Group modifying /var/lib/rpm/Installtid modifying /var/lib/rpm/Name modifying /var/lib/rpm/Packages modifying /var/lib/rpm/Providename modifying /var/lib/rpm/Requirename modifying /var/lib/rpm/Sha1header modifying /var/lib/rpm/Sigmd5 undoing change done
ユーザの追加を取り消す場合、Snapperで変更を取り消す方法はお勧めしません。特定のディレクトリはスナップショットから除外されているため、これらのユーザに属するファイルはファイルシステムに残ったままになります。削除済みユーザと同じユーザIDを持つユーザを作成した場合、このユーザはこれらのファイルを継承します。したがって、YaSTのツールを使用して、ユーザを削除することを強くお勧めします。
7.2.2 Snapperを使用したファイルの復元 #
インストールスナップショットおよび管理スナップショットとは別に、Snapperはタイムラインスナップショットを作成します。このバックアップ用スナップショットを使用して、誤って削除したファイルを復元したり、ファイルの以前のバージョンを復元したりできます。Snapperの差分抽出機能を使用して、特定の時点でどのような変更が加えられたのかを調べることもできます。
ファイルの復元機能は、特に、デフォルトではスナップショットが作成されないサブボリュームまたはパーティションに存在するデータにとって重要です。ホームディレクトリからファイルを復元できるようにするには、たとえば、/home用に、自動的にタイムラインスナップショットを作成する別個のSnapper設定を作成します。手順については、7.5項 「Snapper設定の作成と変更」を参照してください。
ルートファイルシステムから作成されたスナップショット(Snapperのルート設定で定義されています)を使用して、システムロールバックを実行できます。このようなロールバックを実行する場合にお勧めする方法は、そのスナップショットからブートしてからロールバックを実行する方法です。詳細については、7.3項 「スナップショットからのブートによるシステムロールバック」を参照してください。
次に説明するように、ルートファイルシステムスナップショットからすべてのファイルを復元することによってロールバックを実行することもできます。ただし、これはお勧めできません。たとえば、/etcディレクトリから環境設定ファイルなど単一のファイルを復元できますが、スナップショットからファイルの完全なリストを復元することはできません。
この制限は、ルートファイルシステムから作成されたスナップショットにのみ影響します。
YaSTのセクションから、または「
yast2 snapper」と入力してモジュールを起します。スナップショットを選択するためのを選択します。
ファイルを復元するためのタイムラインスナップショットを選択しを選択します。タイムラインスナップショットは、タイプがで、説明の値がであるスナップショットです。
ファイル名をクリックしてテキストボックスからファイルを選択します。スナップショットバージョンと現在のシステムとの差分が表示されます。復元対象ファイルを選択するチェックボックスをオンにします。復元するすべてのファイルに対してこれを行います。
をクリックし、をクリックして操作を確認します。
snapperコマンドを使用したファイルの復元 #次のコマンドを実行して、特定の設定のタイムラインスナップショットのリストを取得します。
tux >sudo snapper -c CONFIG list -t single | grep timelineCONFIGは、既存のSnapper設定に置き換える必要があります。
snapper list-configsを使用してリストを表示します。次のコマンドを実行して、指定のスナップショットの変更ファイルのリストを取得します。
tux >sudo snapper -c CONFIG status SNAPSHOT_ID..0SNAPSHOT_IDをファイルの復元元のスナップショットIDで置き換えます。
オプションで、次のコマンドを実行して、現在のファイルバージョンとスナップショットからのバージョンとの差分を一覧にします。
tux >sudo snapper -c CONFIG diff SNAPSHOT_ID..0 FILE NAME<FILE NAME>を指定しない場合は、すべてのファイルの差分が表示されます。
1つ以上のファイルを復元するには、以下を実行します
tux >sudo snapper -c CONFIG -v undochange SNAPSHOT_ID..0 FILENAME1 FILENAME2ファイル名を指定しない場合は、変更されたすべてのファイルが復元されます。
7.3 スナップショットからのブートによるシステムロールバック #
SUSE Linux Enterprise Serverに含まれているGRUB 2バージョンは、Btrfsスナップショットからブートできます。Snapperのロールバック機能と併用することで、誤設定されたシステムを回復できます。デフォルトのSnapper設定(root)で作成されたスナップショットのみがブート可能です。
SUSE Linux Enterprise Server 12 SP5の時点では、システムのロールバックは、ルートパーティションのデフォルトのサブボリューム設定が変更されていない場合にのみサポートされます。
スナップショットをブートする場合、スナップショットに含まれているファイルシステムの該当部分が読み込み専用でマウントされます。スナップショットから除外されている他のすべてのファイルシステムと該当部分は読み書き可能でマウントされ、変更できます。
スナップショットを操作してデータを復元する場合、Snapperが処理可能なシナリオとして、根本的に異なる次の2つのシナリオがあることを理解することが重要です。
- 変更の取り消し
7.2項 「Snapperを使用した変更の取り消し」で説明されているように、変更を取り消す場合は、2つのスナップショットが比較され、これらの2つのスナップショット間の変更が元に戻されます。この方法を使用すると、選択したファイルを復元から明示的に除外することもできます。
- ロールバック
次に説明する方法でロールバックを実行すると、システムはスナップショットが作成された状態にリセットされます。
ブート可能なスナップショットからロールバックを行うには、次の要件を満たす必要があります。デフォルトインストールを行った場合、システムはそのように設定されます。
ルートファイルシステムは、Btrfsである必要があります。LVMボリュームスナップショットからのブートはサポートされていません。
ルートファイルシステムは、単一のデバイス、単一のパーティション、および単一のサブボリューム上にある必要があります。
/srvなどスナップショットから除外されるディレクトリ(完全なリストについては、7.1.2項 「スナップショットから除外されるディレクトリ」を参照)は、別のパーティション上に存在していても構いません。システムは、インストールされたブートローダを介してブート可能である必要があります。
ブート可能なスナップショットからのロールバックを実行するには、次の手順に従います。
システムをブートします。ブートメニューから、を選択して、ブートするスナップショットを選択します。スナップショットのリストが日別に一覧にされます。最新のスナップショットが先頭に表示されます。
システムにログインします。すべてが予期したとおりに動作しているかどうかを注意深く確認します。スナップショットの一部であるディレクトリに書き込むことはできないので注意してください。他のディレクトリに書き込むデータは、次に行う操作にかかわらず、失われることは「ありません」。
ロールバックを実行するかどうかに応じて、次のステップを選択します。
システムが、ロールバックを実行したくない状態になっている場合は、再起動して現在のシステム状態にブートします。その後、別のスナップショットを選択するか、レスキューシステムを開始することができます。
ロールバックを実行するには、次のコマンドを実行し
tux >sudo snapper rollbackその後、再起動します。ブート画面で、デフォルトのブートエントリを選択して、復元されたシステムで再起動します。ロールバック前のファイルシステムの状態のスナップショットが作成されます。rootのデフォルトのサブボリュームは、新しい読み書きスナップショットに置き換えられます。詳細については、7.3.1項 「ロールバック後のスナップショット」を参照してください。
-dオプションを使用してスナップショットの説明を追加すると役に立ちます。次に例を示します。New file system root since rollback on DATE TIME
スナップショットがインストール時に無効になっていない場合、最初のシステムインストールの最後に初期のブート可能スナップショットが作成されます。このスナップショットをブートすることで、いつでもその状態に戻ることができます。スナップショットは、インストール後、説明で識別できます。
ブート可能スナップショットは、サービスパックや新しいメジャーリリースへのシステムアップグレードの開始時にも作成されます(スナップショットが無効になっていない場合のみ)。
7.3.1 ロールバック後のスナップショット #
ロールバックの実行前に、動作中のファイルシステムのスナップショットが作成されます。この説明では、ロールバックで復元されたスナップショットのIDを参照します。
ロールバックで作成されたスナップショットは、Cleanup属性に値numberが付きます。したがって、設定されているスナップショット数に達すると、ロールバックスナップショットは自動的に削除されます。詳細については、7.7項 「スナップショットの自動クリーンアップ」を参照してください。スナップショットに重要なデータが含まれている場合は、スナップショットが削除される前にデータを抽出してください。
7.3.1.1 ロールバックスナップショットの例 #
たとえば、新規インストール後に、システムで次のスナップショットが使用可能であるとします。
root #snapper--iso list Type | # | | Cleanup | Description | Userdata -------+---+ ... +---------+-----------------------+-------------- single | 0 | | | current | single | 1 | | | first root filesystem | single | 2 | | number | after installation | important=yes
sudo snapper rollbackを実行すると、スナップショット3が作成され、ロールバック実行前のシステムの状態が格納されます。スナップショット4は新しいデフォルトのBtrfsサブボリュームであるため、再起動後にシステムになります。
root #snapper--iso list Type | # | | Cleanup | Description | Userdata -------+---+ ... +---------+-----------------------+-------------- single | 0 | | | current | single | 1 | | number | first root filesystem | single | 2 | | number | after installation | important=yes single | 3 | | number | rollback backup of #1 | important=yes single | 4 | | | |
7.3.2 スナップショットブートエントリのアクセスと識別 #
スナップショットからブートするには、マシンを再起動して、を選択します。ブート可能なすべてのスナップショットをリストした画面が開きます。最も新しいスナップショットが先頭に表示され、最も古いものは最後に表示されます。↓キーおよび↑キーを使用して移動し、Enterキーを押して、選択したスナップショットを有効にします。ブートメニューからスナップショットを有効にしても、マシンは即座に再起動されません。選択したスナップショットのブートローダが開くだけです。
ブートローダの各スナップショットエントリの名前は、命名規則に従っているため、容易に識別できます。
[*]1OS2 (KERNEL3,DATE4TTIME5,DESCRIPTION6)
| |
オペレーティングシステムラベル。 | |
日付フォーマット( | |
時刻フォーマット( | |
このフィールドには、スナップショットの説明が入ります。手動で作成されたスナップショットの場合、この説明は |
スナップショットの説明フィールドのデフォルトの文字列をカスタム文字列に置き換えることができます。この機能は、自動的に作成された説明が不十分な場合や、ユーザが入力した説明が長すぎる場合などに役立ちます。カスタム文字列、STRINGをスナップショット、NUMBERに設定するには、次のコマンドを使用します。
tux > sudo snapper modify --userdata "bootloader=STRING" NUMBER説明は25文字未満にしてください。このサイズを超える部分はブート画面では一切読めません。
7.3.3 制限 #
システム全体をスナップショット作成時と同一の状態に復元する、システムの「完全な」ロールバックは不可能です。
7.3.3.1 スナップショットから除外されるディレクトリ #
ルートファイルシステムのスナップショットには、すべてのディレクトリが含まれるわけではありません。詳細および理由については、7.1.2項 「スナップショットから除外されるディレクトリ」を参照してください。そのため、一般的にこれらのディレクトリのデータは復元されないため、次の制限が生じます。
- ロールバック後、アドオンおよびサードバーティソフトウェアを使用できない場合がある
スナップショットから除外されるサブボリューム(
/optなど)にデータをインストールするアプリケーションやアドオンは、アプリケーションデータの他の部分がスナップショットに含まれるサブボリュームにもインストールされている場合、ロールバック後に動作しない場合があります。この問題を解決するには、アプリケーションまたはアドオンを再インストールします。- ファイルアクセスの問題
スナップショットと現在のシステムでファイルのパーミッションまたは所有権、あるいはその両方がアプリケーションによって変更されている場合、そのアプリケーションは該当するファイルにアクセスできない場合があります。ロールバック後、影響を受けるファイルのパーミッションまたは所有権、あるいはその両方をリセットします。
- 互換性のないデータ形式
サービスまたはアプリケーションがスナップショットと現在のシステムとの間に新しいデータ形式を設定した場合、ロールバック後、そのアプリケーションは影響を受けたデータファイルを読み込めない場合があります。
- コードとデータが混在するサブボリューム
/srvのようなサブボリュームには、コードとデータが混在する場合があります。ロールバックの結果、コードが機能しなくなる場合があります。たとえば、PHPのバージョンがダウングレードされ、WebサーバのPHPスクリプトが壊れる場合があります。- ユーザデータ
ロールバックによりシステムからユーザが削除された場合、これらのユーザが、スナップショットから除外されているディレクトリ内で所有していたデータは削除されません。同じユーザIDを持つユーザが作成された場合、そのユーザは該当ファイルを継承します。
findのようなツールを使用して、孤立したファイルを検索して削除します。
7.3.3.2 ブートローダのデータはロールバックできない #
ブートローダはロールバックできません。これは、ブートローダのすべての「ステージ」が整合している必要があるためです。これは、/bootのロールバックを実行する際には保証できません。
7.4 ユーザホームディレクトリでのSnapperの有効化 #
多数のユースケースをサポートする、ユーザの/homeディレクトリのスナップショットを有効にできます。
個々のユーザは独自のスナップショットおよびロールバックを管理できます。
システムユーザ、たとえば、設定ファイル、ドキュメントなどのコピーを追跡したいデータベース、システム、およびネットワーク管理者。
SambaはホームディレクトリおよびBtrfsバックエンドと共有します。
各ユーザのディレクトリは/homeのBtrfsサブボリュームです。これを手動で設定できます(7.4.3項 「ホームディレクトリでのスナップショットの手動有効化」を参照)。ただし、pam_snapperを使用する方がより便利です。pam_snapperパッケージでは、pam_snapper.soモジュールおよびヘルパースクリプトがインストールされ、ユーザの作成およびSnapper設定が自動化されます。
pam_snapperでは、useraddコマンド、プラグ可能認証モジュール(PAM)、およびSnapperとの統合が提供されます。デフォルトでは、ユーザログイン時およびログアウト時にスナップショットが作成され、一部のユーザは延長された期間にログインしたままであるため、タイムベースのスナップショットも作成されます。通常のSnapperコマンドと設定ファイルを使用して、デフォルトを変更できます。
7.4.1 pam_snapperのインストールとユーザの作成 #
最も簡単な方法は、Btrfsでフォーマットされた新しい/homeディレクトリで既存のユーザなしで開始する方法です。pam_snapperをインストールします。
root # zypper in pam_snapper
/etc/pam.d/common-sessionに次の行を追加します。
session optional pam_snapper.so
/usr/lib/pam_snapper/pam_snapper_useradd.shスクリプトを使用して、新しいユーザとホームディレクトリを作成します。デフォルトで、スクリプトはドライランを実行します。スクリプトを編集し、DRYRUN=1をDRYRUN=0に変更します。これで、新しいユーザを作成できます。
root # /usr/lib/pam_snapper/pam_snapper_useradd.sh \
username group passwd=password
Create subvolume '/home/username'
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
/etc/skelからのファイルは最初のログイン時にユーザのホームディレクトリにコピーされます。ユーザの設定がSnapper設定を一覧表示して作成されていることを確認します。
root # snapper list --all
Config: home_username, subvolume: /home/username
Type | # | Pre # | Date | User | Cleanup | Description | Userdata
-------+---+-------+------+------+---------+-------------+---------
single | 0 | | | root | | current |時間が経過するにつれて、この出力にはスナップショットのリストが取り込まれ、ユーザは標準のSnapperコマンドを管理できます。
7.4.2 ユーザを削除する #
/usr/lib/pam_snapper/pam_snapper_userdel.shスクリプトでユーザを削除します。デフォルトでは、ドライランを実行し、それを編集して、DRYRUN=1をDRYRUN=0に変更します。ユーザ、ユーザのホームサブボリューム、Snapper設定が削除され、すべてのスナップショットが削除されます。
root # /usr/lib/pam_snapper/pam_snapper_userdel.sh username7.4.3 ホームディレクトリでのスナップショットの手動有効化 #
Snapperを使用してユーザのホームディレクトリを手動で設定するためのステップがあります。/homeは、Btrfsでフォーマットされる必要があり、ユーザはまだ作成されていません。
root #btrfs subvol create /home/usernameroot #snapper -c home_username create-config /home/usernameroot #sed -i -e "s/ALLOW_USERS=\"\"/ALLOW_USERS=\"username\"/g" \ /etc/snapper/configs/home_usernameroot #yast users add username=username home=/home/username password=passwordroot #chown username.group /home/usernameroot #chmod 755 /home/username/.snapshots
7.5 Snapper設定の作成と変更 #
Snapperの動作は、各パーティションまたはBtrfsサブボリュームに固有の設定ファイルで定義できます。これらの設定ファイルは、/etc/snapper/configs/に保存されます。
ルートファイルシステムに十分な容量(約12GB)がある場合、ルートファイルシステム(/)のスナップショットはインストール時に自動的に有効になります。対応するデフォルト設定はrootという名前です。これにより、YaSTおよびZypperのスナップショットが作成および管理されます。デフォルト値のリストについては、7.5.1.1項 「設定データ」を参照してください。
7.1項 「デフォルト設定」で説明されているように、スナップショットを有効にするには、ルートファイルシステムに追加の空き容量が必要です。この容量は、インストールされているパッケージの量と、スナップショットに含まれるボリュームに加えられた変更の量によって異なります。スナップショットの頻度と、アーカイブされるスナップショットの数も重要です。
インストール時にスナップショットを自動的に有効にするには、最小サイズのルートファイルシステムが必要です。このサイズは約12GBです。この値は今後、基本システムのアーキテクチャとサイズに応じて変わる可能性があります。これは、インストールメディアにあるファイル/control.xmlの次のタグの値に依存します。
<root_base_size> <btrfs_increase_percentage>
これは、ROOT_BASE_SIZE * (1 + BTRFS_INCREASE_PERCENTAGE/100)という式で計算されます。
この値は最小サイズであることに注意してください。ルートファイルシステム用に、これよりも多くの容量を使用することを検討します。一般的には、スナップショットが有効でない場合に使用するサイズの2倍にします。
Btrfsでフォーマットされたその他のパーティションやBtrfsパーティション上の既存のサブボリュームに対して、独自の設定ファイルを作成できます。以下の例では、/srv/wwwにマウントされたBtrfsフォーマットのパーティションに保存されたWebサーバデータをバックアップするSnapper設定を作成します。
設定が作成された後で、snapper自体またはYaSTのモジュールを使用して、これらのスナップショットからファイルを復元できます。YaSTの場合はを選択する必要があります。snapperの場合は、グローバルスイッチ-cを使用して設定を指定する必要があります(例: snapper -c myconfig list)。
新しいSnapper設定を作成するには、snapper create-configを実行します。
tux > sudo snapper -c www-data1 create-config /srv/www2
このコマンドにより、新しい設定ファイル/etc/snapper/configs/www-dataが作成され、/etc/snapper/config-templates/defaultから取得されたデフォルト値が使用されます。これらのデフォルトの調整方法については、7.5.1項 「既存の設定の管理」を参照してください。
新しい設定ファイルのデフォルト値は/etc/snapper/config-templates/defaultから取得されます。独自のデフォルトセットを使用する場合は、同じディレクトリ内にこのファイルのコピーを作成し、必要に応じて調整してください。作成したファイルを使用するには、create-configコマンドで-tオプションを指定します。
tux > sudo snapper -c www-data create-config -t MY_DEFAULTS /srv/www7.5.1 既存の設定の管理 #
snapperは、既存の設定を管理するためのサブコマンドを備えています。これらの設定を一覧、表示、削除、および変更することができます。
- 設定の一覧
既存の設定をすべて取得するには、
snapper list-configsコマンドを使用します。tux >sudo snapper list-configs Config | Subvolume -------+---------- root | / usr | /usr local | /local- 設定の表示
指定した設定を表示するには、
snapper -c CONFIGget-configサブコマンドを使用します。Configは、snapper list-configsで表示される設定名に置き換える必要があります。設定オプションの詳細については、7.5.1.1項 「設定データ」を参照してください。デフォルト設定を表示するには、次のコマンドを実行します。
tux >sudo snapper -c root get-config- 設定の変更
指定した設定のオプションを変更するには、
snapper -c CONFIG set-config OPTION=VALUEサブコマンドを使用します。Configは、snapper list-configsで表示される設定名に置き換える必要があります。OPTIONおよびVALUEに指定可能な値は、7.5.1.1項 「設定データ」に一覧にされています。- 設定の削除
設定を削除するには、
snapper -c CONFIGdelete-configサブコマンドを使用します。Configは、snapper list-configsで表示される設定名に置き換える必要があります。
7.5.1.1 設定データ #
各設定には、コマンドラインから変更可能なオプションのリストが含まれています。次に、各オプションの詳細を示します。値を変更するには、snapper -c CONFIG set-config "KEY=VALUE"を実行します。
ALLOW_GROUPS、ALLOW_USERS通常のユーザにスナップショットを使用するパーミッションを付与します。詳細については、7.5.1.2項 「通常ユーザとしてのSnapperの使用」を参照してください。
デフォルト値は
""です。BACKGROUND_COMPARISON事前および事後スナップショットを、作成後にバックグラウンドで比較するかどうかを定義します。
デフォルト値は
yes (はい)です。なし_*同一の事前および事後スナップショットを持つスナップショットペアのクリーンアップアルゴリズムを定義します。詳細については、7.7.3項 「違いがないスナップショットのペアのクリーンアップ」を参照してください。
FSTYPEパーティションのファイルシステムタイプ。変更しません。
デフォルト値は
btrfsです。- NUMBER_*
インストールおよび管理スナップショットのクリーンアップアルゴリズムを定義します。詳細については、7.7.1項 「番号付きスナップショットのクリーンアップ」を参照してください。
QGROUP/SPACE_LIMITクリーンアップアルゴリズムにクォータサポートを追加します。詳細については、7.7.5項 「ディスククォータサポートの追加」を参照してください。
SUBVOLUMEスナップショットを作成するパーティションまたはサブボリュームのマウントポイント。変更しません。
デフォルト値は
「/」です。SYNC_ACLSnapperが通常ユーザによって使用される場合(7.5.1.2項 「通常ユーザとしてのSnapperの使用」を参照)、ユーザは
.snapshotディレクトリにアクセスして、そのディレクトリ内のファイルを読み取ることができる必要があります。SYNC_ACLをyes (はい)に設定した場合、Snapperは自動的に、ALLOW_USERSまたはALLOW_GROUPSエントリからACLを使用してユーザとグループがファイルにアクセスできるようにします。デフォルト値は
no (いいえ)です。TIMELINE_CREATEyes (はい)に設定されている場合は、毎時スナップショットが作成されます。有効な値:yes(はい)、no(いいえ)。デフォルト値は
no (いいえ)です。TIMELINE_CLEANUP/TIMELINE_LIMIT_*タイムラインスナップショットのクリーンアップアルゴリズムを定義します。詳細については、7.7.2項 「タイムラインスナップショットのクリーンアップ」を参照してください。
7.5.1.2 通常ユーザとしてのSnapperの使用 #
デフォルトでは、rootしかSnapperを使用できません。しかし、以下のような場合、特定のグループまたはユーザがスナップショットを作成したり、スナップショットを使って変更を取り消したりできる必要があります。
Webサイト管理者が
/srv/wwwのスナップショットを作成したい場合ユーザが自身のホームディレクトリのスナップショットを作成したい場合
このような場合、ユーザやグループにパーミッションを与えるSnapper設定を作成できます。対応する.snapshotsディレクトリは、指定されたユーザによって読み込みおよびアクセス可能である必要があります。このための最も簡単な方法は、SYNC_ACLオプションをyes (はい)に設定することです。
次のすべての手順はrootとして実行する必要があります。
ユーザがSnapperを使用するパーティションまたはサブボリュームにSnapper設定がない場合は、作成します。手順については、7.5項 「Snapper設定の作成と変更」を参照してください。例:
tux >sudo snapper --config web_data create /srv/www/etc/snapper/configs/CONFIGに設定ファイルを作成します。CONFIGは、前の手順で-c/--configを使用して指定される値です(/etc/snapper/configs/web_dataなど)。必要に応じて設定ファイルを調整します。詳細は7.5.1項 「既存の設定の管理」を参照してください。ALLOW_USERSとALLOW_GROUPS、またはその一方の値を設定し、ユーザやグループにパーミッションを与えます。複数のエントリはSpaceで区切ってください。たとえば、ユーザwww_adminにパーミッションを与えるには、次のように入力します。tux >sudo snapper -c web_data set-config "ALLOW_USERS=www_admin" SYNC_ACL="yes"これで、指定されたユーザやグループが特定のSnapper設定を使用できます。以下のように
listコマンドを使ってテストできます。www_admin:~ > snapper -c web_data list
7.6 スナップショットの手動での作成と管理 #
Snapperは設定によって自動的にスナップショットを作成および管理するだけのものではありません。コマンドラインツールまたはYaSTモジュールを使用して、手動でスナップショットのペア(「事前および事後」)や単一のスナップショットを作成することもできます。
Snapperのすべての操作は既存の設定に対して実行されます(詳細は7.5項 「Snapper設定の作成と変更」を参照)。スナップショットを作成するには、対象のパーティションまたはボリュームに対して設定が存在する必要があります。デフォルトで、システム設定(root)が使用されます。独自の設定に対してスナップショットを作成または管理する場合は、明示的にその設定を選択する必要があります。YaSTのドロップダウンボックスを使用するか、コマンドラインで-cを指定します(snapper -c MYCONFIG
COMMAND)。
7.6.1 スナップショットのメタデータ #
各スナップショットには、スナップショット自体とメタデータが含まれています。スナップショットを作成する場合は、メタデータも指定する必要があります。スナップショットを修正すると、メタデータが変更されます。コンテンツを修正することはできません。既存のスナップショットとそのメタデータを表示するには、snapper listを使用します。
snapper --config home list設定
homeのスナップショットの一覧を示します。デフォルト設定(root)のスナップショットの一覧が示されるようにするには、snapper -c root listまたはsnapper listを使用します。snapper list -aすべての既存設定の一覧を示します。
snapper list -t pre-postデフォルト(
root)設定の事前および事後スナップショットの全ペアの一覧を示します。snapper list -t singleデフォルト(
root)設定について、singleタイプの全スナップショットの一覧を示します。
各スナップショットについて、以下のメタデータを利用できます。
Type(種類):スナップショットの種類です。詳細は7.6.1.1項 「スナップショットの種類」を参照してください。このデータは変更できません。
Number(番号):スナップショットの一意の番号。このデータは変更できません。
Pre Number(前番号):対応する事前スナップショットの番号を指定します。事後スナップショットにのみ適用されます。このデータは変更できません。
Description(説明):スナップショットの説明です。
Userdata (ユーザデータ): カンマ区切りの「キー=値」のリスト形式でカスタムデータを指定できる、拡張用の項目です。(例:
reason=testing, project=foo)。このフィールドは、スナップショットに重要のマークを付ける場合(important=yes)や、スナップショットを作成したユーザを一覧にする場合(user=tux)にも使用されます。Cleanup-Algorithm(クリーンアップアルゴリズム):スナップショットのクリーンアップアルゴリズムです。詳細は7.7項 「スナップショットの自動クリーンアップ」を参照してください。
7.6.1.1 スナップショットの種類 #
Snapperには、事前(pre)、事後(post)、および単一(single)の3種類のスナップショットがあります。これらは物理的には同じものですが、Snapperでは別のものとして扱われます。
pre(事前)変更前のファイルシステムのスナップショットです。各
pre(事前)スナップショットには、対応するpost(事後)スナップショットがあります。たとえば、YaST/Zypperの自動スナップショットに対して使用します。post(事後)変更後のファイルシステムのスナップショットです。各
post(事後)スナップショットには、対応するpre(事前)スナップショットがあります。たとえば、YaST/Zypperの自動スナップショットに対して使用します。single(単一)スタンドアロンのスナップショットです。たとえば、自動毎時スナップショットに使用します。これは、スナップショットを作成する際のデフォルトの種類です。
7.6.1.2 クリーンアップアルゴリズム #
Snapperには、古いスナップショットのクリーンアップアルゴリズムが3種類あります。このアルゴリズムは、日次のcronジョブとして実行されます。保持するさまざまなタイプのスナップショットの数を、Snapper設定で定義することができます(詳細は7.5.1項 「既存の設定の管理」を参照)。
- number(番号)
スナップショットが特定の数に達すると、古いスナップショットを削除します。
- timeline (タイムライン)
特定の期間が経過した古いスナップショットは削除しますが、毎時、毎日、毎月、および毎年のスナップショットを複数保持します。
- empty-pre-post(事前事後の差分なし)
事前と事後のスナップショットに差分がない場合、そのペアを削除します。
7.6.2 スナップショットの作成 #
スナップショットを作成するには、snapper createを実行するか、YaSTのモジュールでをクリックします。以下は、コマンドラインを使ってスナップショットを作成する場合の例です。YaSTインタフェースを使用している場合、これらの例は簡単に採用できます。
後で識別しやすくするため、わかりやすい説明を指定しておいてください。ユーザデータオプションを使って、さらに情報を指定することもできます。
snapper create --description "Snapshot for week 2 2014"説明付きのスタンドアロンのスナップショット(種類はsingle)を、デフォルト(
root)設定で作成します。クリーンアップアルゴリズムは指定されていないので、自動的にスナップショットが削除されることはありません。snapper --config home create --description "Cleanup in ~tux"説明付きのスタンドアロンのスナップショット(種類はsingle)を、カスタム設定
homeで作成します。クリーンアップアルゴリズムは指定されていないので、自動的にスナップショットが削除されることはありません。snapper --config home create --description "Daily data backup" --cleanup-algorithm timeline>説明付きのスタンドアロンのスナップショット(種類はsingle)を、カスタム設定
homeで作成します。設定のタイムライン(timeline)クリーンアップアルゴリズムで指定された条件が満たされると、ファイルが自動的に削除されます。snapper create --type pre--print-number--description "Before the Apache config cleanup"--userdata "important=yes"種類が
preのスナップショットを作成し、スナップショット番号を出力します。「事前」と「事後」の状態を保存するために使用されるスナップショットペアを作成するために必要な、最初のコマンドです。スナップショットには重要のマークが付きます。snapper create --type post--pre-number 30--description "After the Apache config cleanup"--userdata "important=yes"番号
30のpreスナップショットとペアになるpostスナップショットを作成します。「事前」と「事後」の状態を保存するために使用されるスナップショットペアを作成するために必要な、2番目のコマンドです。スナップショットには重要のマークが付きます。snapper create --command COMMAND--description "Before and after COMMAND"COMMANDの実行前後に自動的にスナップショットを作成します。このオプションを使用できるのは、コマンドラインでsnapperを使用する場合のみです。
7.6.3 スナップショットのメタデータ修正 #
Snapperでは、スナップショットの説明、クリーンアップアルゴリズム、およびユーザデータを修正できます。それ以外のメタデータは変更できません。以下は、コマンドラインを使ってスナップショットを修正する場合の例です。YaSTインタフェースを使用している場合、これらの例は簡単に採用できます。
コマンドラインでスナップショットを修正するには、スナップショットの番号がわかっている必要があります。snapperlistコマンドを実行すると、すべてのスナップショットとその番号が表示されます。
YaSTのモジュールでは、すでにすべてのスナップショットのリストが表示されています。リストからスナップショットを選択し、をクリックします。
snapper modify --cleanup-algorithm "timeline"10デフォルト(
root)設定のスナップショット10番のメタデータを修正します。クリーンアップアルゴリズムがtimelineに設定されます。snapper --config home modify --description "daily backup" -cleanup-algorithm "timeline"120カスタム設定
homeのスナップショット120番のメタデータを修正します。新しい説明が設定され、クリーンアップアルゴリズムを無しに設定します。
7.6.4 スナップショットの削除 #
YaSTのモジュールを使用してスナップショットを削除するには、リストからスナップショットを選択してをクリックします。
コマンドラインツールを使ってスナップショットを削除するには、スナップショットの番号が分かっている必要があります。snapper listを実行して番号を調べます。スナップショットを削除するには、snapper delete
NUMBERコマンドを実行します。
現在のデフォルトのサブボリュームスナップショットの削除は許可されません。
Snapperでスナップショットを削除すると、空いたスペースはバックグラウンドで実行されているBtrfsプロセスによって要求されます。つまり、空きスペースが見えるように、あるいは使用できるようになるまでに遅れが生じます。スナップショットの削除で空いたスペースをすぐに使用したい場合は、deleteコマンドで--syncオプションを指定します。
preスナップショットを削除する場合は、必ず、対応するpostスナップショットを削除する必要があります(逆も同様です)。
snapper delete 65デフォルト(
root)設定のスナップショット65番を削除します。snapper -c home delete 89 90カスタム設定
homeのスナップショット89番および90番を削除します。snapper delete --sync 23デフォルト設定(
root) のスナップショット23を削除し、空いたスペースをすぐに使用できるようにします。
Btrfsスナップショットが存在するのに、Snapper用のメタデータを含むXMLファイルが欠落している場合があります。この場合、スナップショットがSnapperには見えないため、手動で削除する必要があります。
btrfs subvolume delete /.snapshots/SNAPSHOTNUMBER/snapshot rm -rf /.snapshots/SNAPSHOTNUMBER
ハードディスクの容量を空けるためにスナップショットを削除する場合は、古いスナップショットから削除するようにします。古いスナップショットほど、多くの容量を使用します。
スナップショットは、日次のcronジョブでも自動的に削除されます。詳細については、7.6.1.2項 「クリーンアップアルゴリズム」を参照してください。
7.7 スナップショットの自動クリーンアップ #
時間の経過とともに、スナップショットのサイズが大きくなり、ディスク容量をますます占有するようになります。ディスク容量が不足しないようにするために、Snapperは、古いスナップショットを自動的に削除するためのアルゴリズムを備えています。これらのアルゴリズムは、タイムラインスナップショットと番号付きスナップショット(管理スナップショットとインストールスナップショットのペア)を区別します。各タイプに対して、保持するスナップショットの数を指定できます。
そのほかに、オプションでディスク容量クォータを指定し、スナップショットが占有可能な最大ディスク容量を定義することもできます。また、事前スナップショットと事後スナップショットのペアに違いがない場合、それらのペアを自動的に削除することもできます。
クリーンアップアルゴリズムは常に1つのSnapper設定にバインドされるため、各設定に対してアルゴリズムを設定する必要があります。特定のスナップショットが自動的に削除されないようにするには、 スナップショットを永続的にするにはどうすればよいですか? を参照してください。
デフォルトのセットアップ(root)は、番号付きスナップショットと、空の事前/事後スナップショットのペアのクリーンアップを実行するように設定されています。デフォルトのセットアップでは、クォータサポートが有効になっていて、スナップショットには、ルートパーティションフリー上で使用可能なディスク容量の最低20%が残っている必要があります。タイムラインスナップショットはデフォルトで無効になっているため、タイムラインのクリーンアップアルゴリズムも無効になっています。
クリーンアップアルゴリズムの前回の実装では、スナップショットが指定されたディスク容量(デフォルトは50%)以上使用しないことのみ保証していました。これでは、システムのディスク容量不足を回避できない場合がありました。SUSE Linux Enterprise Server 12 SP1から、Snapperでは常に使用可能なディスク容量の20%を確保するようにクリーンアップアルゴリズムが改善されました。
7.7.1 番号付きスナップショットのクリーンアップ #
番号付きスナップショット(管理スナップショットとインストールスナップショットのペア)のクリーンアップは、Snapper設定の次のパラメータで制御します。
NUMBER_CLEANUPインストールスナップショットと管理スナップショットのペアのクリーンアップを有効または無効にします。有効にすると、スナップショットのペアは、スナップショットの合計数が
NUMBER_LIMITまたはNUMBER_LIMIT_IMPORTANT、あるいはその両方で指定された数を超え、「かつ」NUMBER_MIN_AGEで指定された保存期間を超えた場合に削除されます。有効な値:yes(はい)(有効)、no(いいえ)(無効)。デフォルト値は
yes (はい)です。変更または設定を行うコマンドの例:
tux >sudo snapper -c CONFIG set-config "NUMBER_CLEANUP=no"NUMBER_LIMIT/NUMBER_LIMIT_IMPORTANT保持する通常のインストール/管理スナップショットのペア、または重要なインストール/管理スナップショットのペア、あるいはその両方の数を定義します。最も新しいスナップショットのみが保持されます。
NUMBER_CLEANUPが「no(いいえ)」に設定されている場合、無視されます。デフォルト値は、
NUMBER_LIMITでは「2-10」、NUMBER_LIMIT_IMPORTANTでは「4-10」です。変更または設定を行うコマンドの例:
tux >sudo snapper -c CONFIG set-config "NUMBER_LIMIT=10"重要: 範囲値と定数値の比較クォータサポートが有効な場合は(7.7.5項 「ディスククォータサポートの追加」を参照)、制限を「最小値-最大値」の範囲として指定する必要があります。たとえば、
2-10のように指定します。クォータサポートが無効な場合は、定数値(たとえば10)を指定する必要があります。そうしないと、エラーが発生してクリーンアップに失敗します。NUMBER_MIN_AGEスナップショットが自動削除の対象となるまでの最短期間を秒単位で定義します。ここで指定した期間に達していなければ、スナップショットはいくつ存在していても削除されません。
デフォルト値は
1800です。変更または設定を行うコマンドの例:
tux >sudo snapper -c CONFIG set-config "NUMBER_MIN_AGE=864000"
NUMBER_LIMIT、NUMBER_LIMIT_IMPORTANT、およびNUMBER_MIN_AGEは常に評価されます。スナップショットが削除されるのは、「すべての」条件を満たしている場合のみです。
保存期間に関係なく、NUMBER_LIMIT*で定義された数のスナップショットを常に保持する場合は、NUMBER_MIN_AGEを0に設定します。
次の例は、保存期間に関係なく最新の10個の重要なスナップショットと通常のスナップショットを保持するための設定を示しています。
NUMBER_CLEANUP=yes NUMBER_LIMIT_IMPORTANT=10 NUMBER_LIMIT=10 NUMBER_MIN_AGE=0
一方、一定の保存期間を超えたスナップショットを保持しない場合は、NUMBER_LIMIT*を0に設定し、NUMBER_MIN_AGEで保存期間を指定します。
次の例は、10日経っていないスナップショットのみを保持するための設定を示しています。
NUMBER_CLEANUP=yes NUMBER_LIMIT_IMPORTANT=0 NUMBER_LIMIT=0 NUMBER_MIN_AGE=864000
7.7.2 タイムラインスナップショットのクリーンアップ #
タイムラインスナップショットのクリーンアップは、Snapper設定の次のパラメータで制御します。
TIMELINE_CLEANUPタイムラインスナップショットのクリーンアップを有効または無効にします。有効にすると、スナップショットは、スナップショットの合計数が
TIMELINE_LIMIT_*で指定された数を超え、「かつ」TIMELINE_MIN_AGEで指定された保存期間を超える場合に削除されます。有効な値:yes(はい)、no(いいえ)。デフォルト値は
yes (はい)です。変更または設定を行うコマンドの例:
tux >sudo snapper -c CONFIG set-config "TIMELINE_CLEANUP=yes"TIMELINE_LIMIT_DAILY、TIMELINE_LIMIT_HOURLY、TIMELINE_LIMIT_MONTHLY、TIMELINE_LIMIT_WEEKLY、TIMELINE_LIMIT_YEARLY1時間、1日、1週間、1カ月間、および1年間に保持するスナップショット数です。
各エントリのデフォルト値は
「10」です。ただし、TIMELINE_LIMIT_WEEKLYは例外であり、デフォルトで「0」に設定されています。TIMELINE_MIN_AGEスナップショットが自動削除の対象となるまでの最短期間を秒単位で定義します。
デフォルト値は
1800です。
TIMELINE_CLEANUP="yes" TIMELINE_CREATE="yes" TIMELINE_LIMIT_DAILY="7" TIMELINE_LIMIT_HOURLY="24" TIMELINE_LIMIT_MONTHLY="12" TIMELINE_LIMIT_WEEKLY="4" TIMELINE_LIMIT_YEARLY="2" TIMELINE_MIN_AGE="1800"
この設定例では、毎時スナップショットが自動的に削除されます。TIMELINE_MIN_AGEとTIMELINE_LIMIT_*は常に両方が評価されます。この例では、スナップショットが削除対象となるまでの最短保存期間が30分(1800秒)に設定されています。毎時のスナップショットを作成するので、最新のスナップショットだけが保持されることになります。TIMELINE_LIMIT_DAILYをゼロ以外に設定すると、1日の最初のスナップショットが保持されることになります。
1時間ごと: 最新の24個のスナップショットが保持されます。
1日ごと: 各日の最初に作成されたスナップショットが、直近の7日分保持されます。
1カ月ごと: 各月の最後の日に作成された最初のスナップショットが、直近の12カ月分保持されます。
1週ごと: 各週の最後の日に作成された最初のスナップショットが、直近の4週分保持されます。
1年ごと: 各年の最後の日に作成された最初のスナップショットが、直近の2年分保持されます。
7.7.3 違いがないスナップショットのペアのクリーンアップ #
7.1.1項 「スナップショットのタイプ」で説明したように、YaSTモジュールまたはZypperを実行すると、起動時に事前スナップショットが作成され、終了時に事後スナップショットが作成されます。変更を何も加えていない場合、事前スナップショットと事後スナップショットには違いがありません。Snapper設定で次のパラメータを設定することで、そのような「空の」スナップショットのペアを自動的に削除できます。
EMPTY_PRE_POST_CLEANUPyes (はい)に設定した場合、違いがない事前および事後スナップショットのペアは削除されます。デフォルト値は
yes (はい)です。EMPTY_PRE_POST_MIN_AGE違いがない事前および事後スナップショットのペアが自動削除の対象となるまでの最短期間を秒単位で定義します。
デフォルト値は
1800です。
7.7.4 手動で作成されたスナップショットのクリーンアップ #
Snapperは、手動で作成されたスナップショットに対するカスタムクリーンアップアルゴリズムを備えていません。ただし、手動で作成されたスナップショットに、numberクリーンアップアルゴリズムまたはtimelineクリーンアップアルゴリズムを割り当てることができます。その場合、スナップショットは、指定されたアルゴリズムの「クリーンアップキュー」に入ります。クリーンアップアルゴリズムは、スナップショットの作成時に指定することも、既存のスナップショットを変更して指定することもできます。
snapper create --description "Test" --cleanup-algorithm numberデフォルト(ルート)設定のスタンドアロンスナップショット(singleタイプ)を作成して、
numberクリーンアップアルゴリズムを割り当てます。snapper modify --cleanup-algorithm "timeline" 25番号が25のスナップショットを変更して、クリーンアップアルゴリズム
timelineを割り当てます。
7.7.5 ディスククォータサポートの追加 #
上で説明したnumberクリーンアップアルゴリズムまたはtimelineクリーンアップアルゴリズム、あるいはその両方のほかに、Snapperはクォータもサポートします。スナップショットが占有できる使用可能な容量の割合を定義できます。この割合の値は常に、各Snapper設定で定義されたBtrfsサブボリュームに適用されます。
インストール時にSnapperを有効にした場合、クォータサポートは自動的に有効になっています。後から手動でSnapperを有効にする場合は、snapper setup-quotaを実行することでクォータサポートを有効にできます。そのためには有効な設定が必要です(詳細については、7.5項 「Snapper設定の作成と変更」を参照してください)。
クォータサポートは、Snapper設定の次のパラメータで制御します。
QGROUPSnapperによって使用されるBtrfsクォータグループです。設定されていない場合は、
snapper setup-quotaを実行します。すでに設定されている場合は、man 8 btrfs-qgroupについて十分理解している場合にのみ変更してください。この値はsnapper setup-quotaで設定されます。値を変更しないでください。SPACE_LIMITスナップショットが使用できる容量の制限を、1を100%とする小数で指定します。値の範囲は0~1(0.1 = 10%、0.2 = 20%、...)です。
次の制限とガイドラインが適用されます。
クォータは、既存のnumberクリーンアップアルゴリズムまたはtimelineクリーンアップアルゴリズム、あるいはその両方に「追加」する形でのみアクティブ化されます。クリーンアップアルゴリズムがアクティブになっていない場合、クォータ制約は適用されません。
クォータサポートが有効な場合、Snapperは必要に応じてクリーンアップを2回実行します。最初の実行では、number スナップショットおよびtimelineスナップショットに対して指定されているルールを適用します。この実行後にクォータを超えた場合にのみ、2回目の実行でクォータ固有のルールが適用されます。
クォータサポートが有効になっていて、クォータを超えた場合でも、Snapperは常に、
NUMBER_LIMIT*およびTIMELINE_LIMIT*の値で指定された数のスナップショットを保持します。したがって、NUMBER_LIMIT*およびTIMELINE_LIMIT*に対する値の範囲(MIN-MAX)を指定して、クォータを確実に適用できるようにすることをお勧めします。たとえば、
NUMBER_LIMIT=5-20が設定されている場合、Snapperは、最初のクリーンアップを実行して、標準の番号付きスナップショットの数を20に減らします。これら20個のスナップショットがクォータを超えると、Snapperは、2回目の実行時に、クォータが満たされるまで最も古いスナップショットから順番に削除します。スナップショットが占有する容量にかかわらず、少なくとも5つのスナップショットは常に保持されます。
7.8 よくある質問とその回答 #
- 問:
Snapperでは
/var/log、/tmpなどのディレクトリの変更が表示されませんが、なぜですか? 一部のディレクトリについては、スナップショットから除外することに決定しました。リストと理由については、7.1.2項 「スナップショットから除外されるディレクトリ」を参照してください。スナップショットからパスを除外するため、これらのパス用にサブボリュームを作成しています。
- 問: スナップショットはどのくらいのディスク容量を使用しますか? また、どうすればディスク容量を解放できますか?
現時点では、
Btrfsツールで、スナップショットが使用するディスク容量を表示できません。ただし、クォータが有効な場合は、「すべての」スナップショットを削除した場合に解放される容量を判断できます。クォータグループIDを取得します(次の例の
1/0)。tux >sudo snapper -c root get-config | grep QGROUP QGROUP | 1/0サブボリュームクォータを再スキャンします。
tux >sudo btrfs quota rescan -w /クォータグループのデータを表示します(次の例の
1/0)。tux >sudo btrfs qgroup show / | grep "1/0" 1/0 4.80GiB 108.82MiB3番目の列に、すべてのスナップショットを削除した場合に解放される容量(
108.82MiB)が表示されます。
スナップショットを含む
Btrfsパーティションの容量を空けるには、ファイルではなく、不要なスナップショットを削除する必要があります。古いスナップショットは、最近のスナップショットよりも多くの領域を使用します。詳細については、7.1.3.4項 「スナップショットのアーカイブの制御」を参照してください。あるサービスパックから別のサービスパックにアップグレードすると、多くのデータが変更される(パッケージのアップデート)ので、スナップショットにより、システムのサブボリュームで多くのディスク容量が使用されます。これらのスナップショットが不要になった場合は、手動で削除することをお勧めします。詳細については、7.6.4項 「スナップショットの削除」を参照してください。
- 問: ブートローダからスナップショットをブートできますか?
はい。詳細については、7.3項 「スナップショットからのブートによるシステムロールバック」を参照してください。
- 問: スナップショットを永続的にするにはどうすればよいですか?
現在のところ、Snapperでは、スナップショットが手動で削除されるのを防ぐ方法はありません。ただし、スナップショットがクリーンアップアルゴリズムによって自動的に削除されるのを防ぐことはできます。手動で作成されたスナップショット(7.6.2項 「スナップショットの作成」を参照)には、
--cleanup-algorithmでクリーンアップアルゴリズムを指定しない限り、クリーンアップアルゴリズムは割り当てられていません。自動的に作成されたスナップショットには、常にnumberアルゴリズムまたはtimelineアルゴリズムが割り当てられています。1つ以上のスナップショットからそのような割り当てを削除するには、次の手順に従います。使用可能なすべてのスナップショットの一覧を表示します。
tux >sudo snapper list -a削除されないようにするスナップショットの数を記憶します。
次のコマンドを実行します。数字のプレースホルダを、記憶した数に置き換えます。
tux >sudo snapper modify --cleanup-algorithm "" #1 #2 #nもう一度
snapper list -aを実行して、結果を確認します。変更したスナップショットの列Cleanupのエントリが空になります。
- 問: Snapperに関する詳細情報はどこで入手できますか?
Snapperのホームページ(http://snapper.io/)を参照してください。




