Jump to contentJump to page navigation: previous page [access key p]/next page [access key n]
適用先 openSUSE Leap 15.7

3 Snapper によるシステムの復元とスナップショット管理 Edit source

概要

snapper はファイルシステムのスナップショットを作成したり、管理したりするためのツールです。ファイルシステムのスナップショットには、あの特定の時点におけるファイルシステムの状態に対するコピーが含まれていて、通常はシステムに対して行った変更を元に戻すために使用します。このほか、ユーザデータのディスク内バックアップ用途にも使用することができます。 snapper の機能は btrfs ファイルシステムのほか、 xfs や ext4 ファイルシステムを使用したシン・プロビジョン型の LVM ボリュームに対して使用することができます。

snapper にはコマンドラインインターフェイスのほか、 YaST インターフェイスも提供されています。これにより、下記のような種類のファイルシステムに対して、ファイルシステムのスナップショットを作成したり管理したりすることができます:

  • btrfs: コピーオンライト型の Linux ファイルシステムで、ファイルシステム内にサブボリュームの機能とスナップショットの機能が用意されています (サブボリュームとは、それぞれ別々にマウントすることのできる、ファイルシステム内パーティションです) 。

    このほか、 btrfs スナップショットからの起動を行うこともできます。詳しくは 3.3項 「スナップショットからの起動によるシステムのロールバック」 をお読みください。

  • xfs もしくは ext4 でフォーマットされたシン・プロビジョン型の LVM ボリューム。

Snapper を利用することで、下記のようなことができるようになります:

3.1 既定の設定 Edit source

openSUSE Leap での Snapper は、システムの変更に対する巻き戻しと復元のためのツールとして動作するように設定されています。既定では、ルートパーティション ( / ) が btrfs でフォーマットされます。また、ルートパーティション / が十分に大きい (おおよそ 16 GB 以上) 場合、スナップショットの採取が自動的に有効化されます。 / 以外のパーティションに対するスナップショットは、既定では無効化されます。

ヒント
ヒント: インストール済みシステムにおける Snapper の有効化

インストール時に Snapper を無効化している場合は、任意の時点であとから有効化することもできます。有効化するには、下記を実行して既定の Snapper 設定を作成してください:

> sudo snapper -c root create-config /

あとは 3.1.4.1項 「スナップショットの有効化/無効化」 で説明している手順に従って、スナップショットの種類を有効化します。

なお、 btrfs を設定したルートファイルシステムを使用する場合、スナップショットを採取するには、インストーラで提案したサブボリューム設定でルートファイルシステムを設定し、パーティションのサイズが少なくとも 16 GB 以上である必要があります。

スナップショットを作成すると、スナップショットと元のブロックはファイルシステム内で同じブロックを指し示します。そのため、スナップショットを採取した時点では、追加のディスク領域を必要とすることはありません。ただし、スナップショットを作成した時点からファイルが変更されると、変更した部分のデータブロックが新しく確保され、元の (スナップショットを採取した時点の) データブロックがそのまま保持されるようになります。そのためスナップショットは、修正された分だけのデータに対応するブロックを占有することになります。また、時間が経過するごとにスナップショットが占有する領域が定期的に増えていくことにも繋がります。そのため、 Btrfs ファイルシステムでファイルを削除しても、ディスクの空き領域を増やすことには繋がらない場合があり得ます。

注記
注記: スナップショットの場所

スナップショットは、採取したファイルシステムと同じパーティションやサブボリューム内に存在します。異なるパーティションやサブボリュームに保存することはできません。

そのため、スナップショットを含むパーティションは、通常のパーティションよりもサイズを大きくする必要があります。正確な容量は、保持すべきスナップショットの数とデータ変更の容量によって異なりますが、一般的には通常必要とするサイズの 2 倍程度を確保しておくことをお勧めします。なお、ディスクの空き容量が枯渇してしまうことがないよう、古いスナップショットは自動的にクリーンアップしておくとよいでしょう。詳しくは 3.1.4.4項 「スナップショットのアーカイブの制御」 をお読みください。

3.1.1 既定の設定 Edit source

16 GB よりも大きいディスクサイズである場合
  • 設定ファイル: /etc/snapper/configs/root

  • USE_SNAPPER=yes

  • TIMELINE_CREATE=no

16 GB よりも小さいディスクサイズである場合
  • 設定ファイル: 作成されません

  • USE_SNAPPER=no

  • TIMELINE_CREATE=yes

3.1.2 スナップショットの種類 Edit source

スナップショットそれ自身は技術的な意味で何も違いがありませんが、それを発生させたイベントごとに、スナップショットの意味が異なります:

タイムラインスナップショット

単独のスナップショットを 1 時間おきに作成します。 YaST を利用して OS をインストールした場合 (既定) 、ルートファイルシステム以外に対してタイムラインスナップショットが有効化されます。タイムラインスナップショットは異なる間隔設定 (1 時間, 1 日, 1 週, 1 月, 1 年) 単位で採取することもできます。古いスナップショットは自動的に削除されます。既定では、直近の 10 日間, 10 ヶ月, 10 年の間に採取された最初のスナップショットを保持します。

インストールスナップショット

YaST や zypper で 1 つまたは複数のパッケージをインストールすると、 3 つのインストールスナップショットを作成します。また、インストールしたパッケージがカーネルなどの主要なパッケージであった場合、そのスナップショットは重要なものであるとマークが付けられます。古いスナップショットは自動で削除されます。インストールスナップショットは既定で有効化されます。

管理スナップショット

Zypper や YaST を利用してシステムの変更を行うと、スナップショットの対を作成します。 1 つ目はシステム変更直前 ( Pre (事前)) 、 2 つ目はシステム変更後 ( Post (事後)) にそれぞれ採取されます。古いスナップショットは自動的に削除されます。既定では、直近の重要な 10 回分のスナップショットと、直近の 10 回分の 定期 スナップショット (インストールスナップショットを含む) が保持されます。管理スナップショットは、既定で有効化されます。

3.1.3 スナップショットから除外されるディレクトリ Edit source

様々な理由から、いくつかのディレクトリについては除外を設定する必要があります。下記の一覧には、除外される全てのディレクトリを示しています:

/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

サードパーティ製の製品は /opt 以下にインストールされるのが一般的です。そのため、ロールバックによってこれらのアプリケーションが削除されてしまうことのないよう、除外を設定しています。

/srv

Web サーバや FTP サーバのデータを含むディレクトリです。ロールバックによってそれらのデータが失われてしまうことの無いよう、除外を設定しています。

/tmp

いずれも一時的な (テンポラリ) ファイルとキャッシュが保存されるディレクトリであるため、除外を設定しています。

/usr/local

このディレクトリは手作業でソフトウエアをインストールした場合に使用するディレクトリです。ロールバックによって、これらのソフトウエアが消えてしまったりしないようにするため、除外を設定しています。

/var

ログファイルや一時的なキャッシュが含まれるほか、サードパーティ製の製品が /var/opt 以下にインストールされることがあります。また、仮想マシンのイメージやデータベースを配置する既定のディレクトリでもあります。そのため、これらのデータをスナップショットから除外するためにサブボリュームを作成し、かつコピーオンライト機能を無効化しています。

3.1.4 設定のカスタマイズ Edit source

openSUSE Leap ではほとんどの用途に対応できる既定値が設定されています。ですが、必要であれば、自動スナップショットやスナップショットの保持設定について、全ての項目を設定することができます。

3.1.4.1 スナップショットの有効化/無効化 Edit source

3 種類のスナップショット種類 (タイムライン, インストール, 管理) を個別に有効化/無効化することができます。

タイムラインスナップショットの有効化/無効化

有効化: snapper -c root set-config "TIMELINE_CREATE=yes"

無効化: snapper -c root set-config "TIMELINE_CREATE=no"

YaST で OS をインストールした既定の場合、タイムライン型のスナップショットはルートファイルシステム以外に対して有効化されます。

インストールスナップショットの有効化/無効化

有効化: snapper-zypp-plugin パッケージをインストールします。

無効化: snapper-zypp-plugin パッケージを削除します。

インストールスナップショットは既定で有効化されます。

管理スナップショットの有効化/無効化

有効化: /etc/sysconfig/yast2 内の USE_SNAPPERyes を設定します。

無効化: /etc/sysconfig/yast2 内の USE_SNAPPERno を設定します。

管理スナップショットは既定で有効化されます。

3.1.4.2 インストールスナップショットの制御 Edit source

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>

1

match 属性はパターンの定義方法を決めるもので、 Unix スタイルのワイルドカード ( w ) か、 Python の正規表現 ( re ) のいずれかを指定することができます。

2

指定したパターンに該当し、関連するパッケージが重要であるとしてマークされている (たとえば kernel パッケージなど) と、スナップショットについても重要であるものとしてマークが付けられます。

3

パッケージ名と比較処理される内容です。 match 属性の設定に依存しますが、特殊文字はシェルのワイルドカードか、正規表現として扱われます。たとえばこのパターンは、 kernel- で始まる全てのパッケージが該当する指定になっています。

4

この行は、全てのパッケージが該当する箇所です。

このスナップショットの設定では、パッケージがインストールされると必ずスナップショット対を作成します (9 行目の設定による) 。また、重要であるとマークされた kernel, dracut, glibc, systemd, udev の各パッケージがインストールされると、スナップショットの対にも重要 (important) のマークが付けられます。

ルールを無効化するには、削除を行うか 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>

3.1.4.3 新しいサブボリュームの作成とマウント Edit source

/ の階層構造以下に新しいサブボリュームを作成し、恒久的にマウントすることができます。新しく作成したサブボリュームは、スナップショットから除外されます。ただし、既存のスナップショット内には、新しいサブボリュームを作成してはなりません。なぜなら、ロールバックを行った後にスナップショットを削除できなくなってしまうためです。

openSUSE Leap では、 /opt , /srv , /home などのディレクトリに対して、/@/ で始まる個別のサブボリュームが設定されます。また、新しく作成し恒久的にマウントするサブボリュームは、この初期ルートファイルシステム内に作成しなければなりません。

これを行うには、下記のコマンドを実行します。下記の例では、新しいサブボリューム/usr/important を、 /dev/sda2 内に作成します。

> sudo mount /dev/sda2 -o subvol=@ /mnt
> sudo btrfs subvolume create /mnt/usr/important
> sudo umount /mnt

/etc/fstab 内にサブボリュームのマウントを記述する場合は、下記のようになります:

/dev/sda2 /usr/important btrfs subvol=@/usr/important 0 0
ヒント
ヒント: コピーオンライト (cow) 機能の無効化

サブボリュームには、仮想マシンのイメージやデータベースファイル、ログファイルなど、絶えず変更されるファイルが含まれることがあります。このような場合は、そのサブボリュームに対してコピーオンライト (Copy On Write (cow)) 機能を無効化し、ディスクブロックの重複を避けるよう設定しておくことをお勧めします。これを行うには、 /etc/fstab 内に nodatacow マウントオプションを追加します:

/dev/sda2 /usr/important btrfs nodatacow,subvol=@/usr/important 0 0

また、単一のファイルやディレクトリに対して cow 機能を無効化することもできます。その場合は、 chattr +C パス を実行してください。

3.1.4.4 スナップショットのアーカイブの制御 Edit source

スナップショットはディスク領域を占有します。ディスクの容量が枯渇してシステムが止まってしまったりしないようにするため、古いスナップショットについては自動的に削除する必要があります。既定では最大で 10 回分までの重要なインストールスナップショットと管理スナップショットが保持されるほか、最大で 10 回分までの定期的なインストールスナップショットおよび管理スナップショットが保持されます。なお、これらのスナップショットが、ルートファイルシステムのサイズの 50% 以上を占有している場合は、さらに多くのスナップショットを削除します。ただし、最小でも 4 回分の重要なスナップショットと、 2 回分の定期スナップショットは必ず保持されます。

これらの値の変更方法について、詳しくは 3.5.1項 「既存の設定の管理」 をお読みください。

3.1.4.5 シン・プロビジョン型の LVM ボリュームにおける Snapper の使用 Edit source

Btrfs ファイルシステムに対するスナップショット機能とは別に、 Snapper では xfs/ext4/ext3 でフォーマットされたシン・プロビジョン型の LVM ボリュームに対するスナップショットにも対応しています (通常型の LVM ボリュームに対するスナップショットには対応していません) 。 LVM ボリュームに関する詳細やセットアップ手順については、 5.3項 「LVM 設定」 をお読みください。

シン・プロビジョン型の LVM ボリュームに対して Snapper を使用するには、まず Snapper の設定を作成する必要があります。 LVM の場合、ファイルシステムの種類を --fstype=lvm(ファイルシステムの種類名) で指定する必要があります。 ファイルシステムの種類名 には、 ext3 , ext4 , xfs のいずれかを指定します。たとえば下記のようになります:

> sudo snapper -c lvm create-config --fstype="lvm(xfs)" /thin_lvm

ここで書き込んだ設定は、必要に応じて変更することができます。詳しくは 3.5.1項 「既存の設定の管理」 をお読みください。

3.2 Snapper による変更点の巻き戻し Edit source

openSUSE Leap における Snapper は、 zypper や YaST が行った変更点を巻き戻すためのツールとして動作するよう設定されています。この目的を実現するため、 Snapper では zypper や YaST を実行するごとに、事前と事後のスナップショット対を作成するよう設定しています。また、 Snapper では誤って削除してしまったり、書き換えてしまったりしたシステムファイルを取り戻すためにも利用することができます。この用途で使用する場合は、ルートパーティションに対するタイムラインスナップショットを有効化する必要があります。詳しくは 3.1.4.1項 「スナップショットの有効化/無効化」 をお読みください。

既定では、上述の自動スナップショットがルートパーティションとサブボリュームに対して設定されます。たとえば /home などの別のパーティションに対して、スナップショットを作成するには、独自の設定を作成する必要があります。

重要
重要: 変更点の巻き戻しとロールバックについて

データを復元する目的でスナップショットを利用する場合、 Snapper が処理できるシナリオとしては、下記の 2 つのものがあることを知っておくのが重要です:

変更点の巻き戻し

下記に示す手順で変更点を巻き戻す場合、2 つのスナップショットを比較して、それらの間での変更点を巻き戻すことができます。この方法を利用することで、復元すべきファイルを明示的に選択することができるようになります。

ロールバック

3.3項 「スナップショットからの起動によるシステムのロールバック」 に示されている手順でロールバックを行うと、システムはスナップショットを採取した時点の状態にリセットされます。

変更点を元に戻す際、現在のシステムとスナップショットとを比較することができます。この比較で 全て のファイルを戻す場合は、ロールバックを行ったのと同じ結果になります。ただし、全てのファイルを戻す場合は、 3.3項 「スナップショットからの起動によるシステムのロールバック」 で説明している手順に従ってロールバックを行うことをお勧めします。これは、ロールバックのほうがより高速であるだけでなく、ロールバックを行う前にシステムを確認できるという利点もあります。

警告
警告: データの一貫性について

スナップショットを作成する際、データの一貫性に関するチェックを行う仕組みは用意されていません。たとえばデータベースファイルなどが顕著ですが、ファイルがスナップショットを採取したタイミングで同時に書き込まれていた場合、データベースファイルが壊れてしまうか、部分的に書き込まれた状態になります。このような場合、このファイルの巻き戻しで問題が発生することになります。これらに加えて、 /etc/mtab のようなファイルについても、復元してはなりません。そのため、変更されたファイルの確認では、 必ず 内容をよく確認するようにしてください。また、ファイル単位での復元では、巻き戻したいファイルだけを戻すようにしてください。

3.2.1 YaST や zypper が変更した内容の巻き戻し Edit source

インストール時にルートパーティションを btrfs で設定すると、 YaST や zypper の変更点を自動的に巻き戻すことができる設定を施した状態で、 Snapper が自動的にインストールされます。 YaST モジュールや zypper のトランザクションを開始すると、 2 種類のスナップショットが必ず作成されるようになっています。 1 つ目は 事前スナップショット と呼ばれ、モジュールを開始する際にファイルシステムの状態を採取するスナップショットです。 2 つ目は 事後スナップショット と呼ばれ、モジュールが完了した際に採取するスナップショットです。

YaST の Snapper モジュールや snapper コマンドラインツールを使用すると、 YaST や zypper が行った変更を、 事前スナップショット からのファイルで戻すことができるようになります。 2 つのスナップショットを比較する際、ツールではどのファイルが書き換えられたのかを表示することができるほか、変更されたファイルの違い (diff) も表示することができます。

手順 3.1: YaST を使用した変更点の巻き戻し; Snapper モジュール
  1. YaST を起動して その他 にある Snapper を選択するか、もしくは yast2 snapper と入力して実行します。

  2. 現在の設定root になっていることを確認してください。 Snapper の設定を手動で追加していない限り、必ず確認すべき項目になります。

  3. 一覧から事前および事後のスナップショットの対を選択します。 YaST や zypper で採取されたスナップショット対には、 事前および事後 という種類になっているはずです。また、 YaST でのスナップショットには 説明 列に zypp(y2base) が書かれています。同様に、 zypper でのスナップショットには、 zypp(zypper) が書かれています。

  4. 2 つのスナップショットの間で変更されたファイルの一覧を表示するには、 変更点の表示 を押します。

  5. ファイルの一覧が表示されます。事前と事後のスナップショットでの 差分 を表示するには、一覧からファイルを選択します。

  6. 1 つまたは複数のファイルを復元するには、ファイルやディレクトリのチェックボックスにチェックを入れてから、 選択したものを復元 を押します。その後、確認メッセージが表示されますので、 はい を押して確認します。

    単一のファイルを復元する場合は、その名前欄を押して差分を表示します。あとは 最初から復元する を押して確認メッセージを表示させ、 はい を押して確認します。

手順 3.2: snapper コマンドを使用した変更点の巻き戻し
  1. YaST や zypper で作成したスナップショットの一覧を表示するには、 snapper list -t pre-post と入力して実行します。 YaST でのスナップショットの場合、 説明 欄に yast モジュール名 が表示されます。 zypper でのスナップショットの場合は、 zypp(zypper) が表示されます。

    > sudo snapper list -t pre-post
    前  # | 後   # | 前日付                  | 後日付                  | 説明
    ------+--------+-------------------------+------------------------+--------------
    311   | 312    | 2018年05月06日 14:05:46 | 2018年05月06日 14:05:52 | zypp(y2base)
    340   | 341    | 2018年05月07日 16:15:10 | 2018年05月07日 16:15:16 | zypp(zypper)
    342   | 343    | 2018年05月07日 16:20:38 | 2018年05月07日 16:20:42 | zypp(y2base)
    344   | 345    | 2018年05月07日 16:21:23 | 2018年05月07日 16:21:24 | zypp(zypper)
    346   | 347    | 2018年05月07日 16:41:06 | 2018年05月07日 16:41:10 | zypp(y2base)
    348   | 349    | 2018年05月07日 16:44:50 | 2018年05月07日 16:44:53 | zypp(y2base)
    350   | 351    | 2018年05月07日 16:46:27 | 2018年05月07日 16:46:38 | zypp(y2base)
  2. snapper status 前 # .. 後 # と入力すると、スナップショット対の間で変更されたファイルの一覧を取得することができます。内容が変更されたファイルには c が表示されるほか、新規に作成されたファイルには + が、削除されたファイルには - がそれぞれ表示されます。

    > 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
  3. 特定のファイルに対する差分を表示するには、 snapper diff 前 # .. 後 # ファイル名 と入力して実行します。ファイル名を指定しない場合は、全てのファイルに対する差分が表示されます。

    > 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
    [...]
  4. 1 つまたは複数のファイルを復元するには、 snapper -v undochange Pre の ID .. Post の ID ファイル名 (複数可) のように入力して実行します。ファイル名を何も指定しない場合は、変更された全てのファイルが復元されます。

    > 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 と、新たに作成したユーザのユーザ ID が同じになってしまうため、残ったファイルをそのユーザがアクセスできてしまいます。ユーザを削除する際は、 YaST の ユーザとグループの管理 を利用して削除することを強くお勧めします。

3.2.2 ファイルを復元するための Snapper の使用 Edit source

インストールスナップショットや管理スナップショットとは別に、 Snapper にはタイムラインスナップショットという機能があります。これは誤って削除してしまったり、誤って書き換えてしまったりしたファイルを復元するためのバックアップ用スナップショットです。 Snapper の差分表示機能を利用することで、その時点のファイルからどのように書き換えてしまったのかについても、確認を行うことができるようになっています。

ファイルを復元できるという機能は、特に各種データ類に対して有用な仕組みですが、これらは、既定ではスナップショットの採取されないサブボリュームやパーティション内に置かれている場合があります。たとえばホームディレクトリなどでファイルを復元できるようにするには、 /home に対して個別の Snapper 設定を作成し、自動的なタイムラインスナップショットを有効化する必要があります。詳しい手順については、 3.5項 「Snapper の設定の作成と修正」 をお読みください。

警告
警告: ファイルの復元と巻き戻しの違いについて

ルートファイルシステムに対して採取したスナップショット (Snapper のルートディレクトリ設定で設定されます) は、システムのロールバックとして使用することができます。システムのロールバックを実施するにあたっては、対応するスナップショットから起動を行って、その後にロールバックを行うのがお勧めです。詳しくは 3.3項 「スナップショットからの起動によるシステムのロールバック」 をお読みください。

ロールバックの方法としては、下記で説明するとおり、特定のルートファイルシステムのスナップショットからファイルを復元する方法もありますが、こちらはお勧めできません。/etc ディレクトリ内にある設定ファイルなど、個別のファイルを取り戻す方法としては有用ですが、全てのファイルを巻き戻す際にはお勧めできません。

なお、この制限はルートファイルシステムに対して採取されたスナップショットのみに適用すべきものです。

手順 3.3: YaST Snapper モジュールを利用したファイルの復元
  1. YaST を起動して その他 にある Snapper を選択するか、もしくは yast2 snapper と入力して実行します。

  2. スナップショットを選択するため、 現在の設定 を選択します。

  3. ファイルを復元したいタイムラインスナップショットを選択して、 変更点の表示 を押します。タイムラインスナップショットは、種類が 単一 になっているほか、説明欄に timeline と書かれています。

  4. ファイル名を押して、テキストボックスからファイルを選択します。すると、スナップショットで保存された版と現在の版の差分が表示されるようになります。あとは復元したいファイルやディレクトリのチェックボックスに、チェックを入れます。

  5. 選択したものを復元 を押します。その後、確認メッセージが表示されますので、 はい を押して確認します。

手順 3.4: snapper コマンドを利用したファイルの復元
  1. 特定の設定に対するタイムラインスナップショットの一覧を表示するには、下記のコマンドを実行します:

    > sudo snapper -c 設定 list -t single | grep timeline

    設定 には既存の Snapper 設定の値を指定します。 snapper list-configs と入力して実行すると、設定の一覧を表示することができます。

  2. 特定のスナップショットで変更されたファイルの一覧を表示するには、下記のコマンドを実行します:

    > sudo snapper -c 設定 status スナップショット_ID..0

    スナップショット_ID には、ファイルを復元したいスナップショットの ID を指定します。

  3. 必要であれば、現在のファイルとスナップショット内のファイルの差分を表示することもできます:

    > sudo snapper -c 設定 diff スナップショット_ID..0 ファイル名

    ファイル名 を指定せずに実行すると、全てのファイルに対する差分が表示されます。

  4. 1 つまたは複数のファイルを復元するには、下記のように実行します:

    > sudo snapper -c 設定 -v undochange スナップショット_ID..0 ファイル名_1 ファイル名_2

    ファイル名を指定しない場合は、変更された全てのファイルが復元されます。

3.3 スナップショットからの起動によるシステムのロールバック Edit source

openSUSE Leap に含まれている GRUB 2 では、 btrfs のスナップショットからの起動を行うことができます。これは Snapper のロールバック機能と共に働くもので、これによって誤って設定してしまったシステムを、元に戻すことができるようになります。ただし、既定の Snapper 設定 ( root ) で作成したスナップショットのみを起動することができます。

重要
重要: サポートされる設定

openSUSE Leap 15.7 では、ルートパーティションに対する既定のサブボリューム設定を変更していない場合にのみ、システムロールバックをサポートします。

スナップショットから起動を行う場合、スナップショット内に含まれるファイルシステムは読み込み専用でマウントされます。また、その他のファイルシステムやスナップショットから除外されているサブボリュームなどについては、読み書きが可能で修正することができるようになります。

重要
重要: 変更点の巻き戻しとロールバックについて

データを復元する目的でスナップショットを利用する場合、 Snapper が処理できるシナリオとしては、下記の 2 つのものがあることを知っておくのが重要です:

変更点の巻き戻し

3.2項 「Snapper による変更点の巻き戻し」 で説明しているとおりに変更点を巻き戻す場合、 2 つのスナップショット間を比較して、これらの間での違いを元に戻すことになります。この方法を利用することで、選択したファイルが明示的に巻き戻されないようにすることができます。

ロールバック

下記に示す方法でロールバックを行うと、システムはスナップショットを採取した時点の状態にリセットされます。

起動可能なスナップショットからロールバックを行うには、下記の要件を満たさなければなりません。既定の状態でインストールを行った場合は、下記の要件を満たすように設定されます。

起動可能なスナップショットからのロールバックに対する必要条件
  • ルートファイルシステムは btrfs でなければなりません。 LVM ボリュームのスナップショットからの起動には、対応していません。

  • ルートファイルシステムは単一のデバイスで構成されている必要があります。これを確認するには、 sudo /sbin/btrfs filesystem show を実行してください。 Total devices 1 と表示されれば問題ありません。 1 より多くのデバイスが表示された場合、お使いの環境ではご利用いただけません。

    注記
    注記: スナップショットから除外されるディレクトリによる影響

    /srv など、スナップショットから除外されるディレクトリ (詳しくは 3.1.3項 「スナップショットから除外されるディレクトリ」 をお読みください) については、別途のパーティション内に存在していてもかまいません。

  • システムはインストールされたブートローダから起動できる必要があります。

  • / のサブボリューム内に含まれる内容のみをロールバックすることができます。それ以外のサブボリュームを含めることはできません。

起動可能なスナップショットからロールバックを行うには、下記のように行います:

  1. まずはシステムを起動します。起動メニューでは Bootable snapshots (起動可能なスナップショット) を選択して、起動したいスナップショットを選択します。スナップショットは日付順に並べられていて、最も新しいものが最初に表示されます。

  2. システムにログインします。全ての処理が期待通りに動作することを確認してください。また、スナップショットの一部になっているディレクトリに対しては、一切書き込むことができないことに注意してください。逆に、それ以外のディレクトリへの書き込みであれば、次の手順でどちらを選択した場合であっても、それらは失われることが ありません

  3. ロールバックを行いたいかどうかによって、いずれかの手順を実行します:

    1. システムが期待通りに動作しない場合は、システムを再起動して現在のシステムに戻してください。再度別のスナップショットを選択してもかまいませんし、レスキューシステムをお使いいただいてもかまいません。

    2. ロールバックを実施するには、下記のように実行します:

      > sudo snapper rollback

      上記を実行した後、システムを再起動します。起動画面では既定の起動項目を選択して、復帰したシステムを起動してください。なお、ロールバックを行う前のファイルシステムに対するスナップショットが作成されます。ルートに対する既定のサブボリュームは、新しく読み書き可能なスナップショットに置き換えられます。詳しくは 3.3.1項 「ロールバック後のスナップショット」 をお読みください。

      なお、 -d オプションを指定して、スナップショットに説明を設定しておくと便利です。たとえば下記のように指定します:

      日付 時刻 のロールバック以降の新しいルートファイルシステム
ヒント
ヒント: 特定のインストール時点へのロールバック

インストール時にスナップショットを無効化していなかった場合、初期の起動可能なスナップショットがシステムインストールの最後に採取されます。このスナップショットから起動を行うことで、いつでも最初の時点に戻れるようになります。このスナップショットには、 after installation という説明が設定されます。

起動可能なスナップショットは、サービスパックへのシステムアップグレードを開始した場合や、新しいメジャーリリースへのシステムアップグレードでも作成されます (ただし、スナップショットを無効化していない場合に限ります) 。

3.3.1 ロールバック後のスナップショット Edit source

ロールバックを実施する前に、現在実行中のファイルシステムに対するスナップショットが作成されます。説明には、ロールバックに復元した際のスナップショットの ID が書かれます。

ロールバックで作成されたスナップショットには、 Cleanup 属性に number という値が設定されます。そのため、ロールバックスナップショットは設定されたスナップショット数に達したとき、自動的に削除されます。詳しくは 3.7項 「自動的なスナップショットのクリーンアップ」 をお読みください。スナップショットに重要なデータが含まれる場合は、スナップショットが削除される前に必要なデータを抽出するようにしてください。

3.3.1.1 ロールバックスナップショットの例 Edit source

たとえば新規インストールを行った場合、システムには下記のスナップショットが作成されます:

# snapper --iso list
種類   | # |     | クリーンアップ | 説明                  | ユーザデータ
-------+---+ ... +---------------+-----------------------+--------------
single | 0 |     |               | current               |
single | 1 |     |               | first root filesystem |
single | 2 |     | number        | after installation    | important=yes

ここで sudo snapper rollback を実行すると、スナップショット 3 が作成され、ロールバック前のシステムの状態が保存されます。スナップショット 4 が新しい btrfs のサブボリュームとなり、システムの再起動後に使用されるものとなります。

# snapper --iso list
種類   | # |     | クリーンアップ | 説明                  | ユーザデータ
-------+---+ ... +---------------+-----------------------+--------------
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 |     |               |                       |

3.3.2 スナップショットの起動項目へのアクセスと識別 Edit source

スナップショットから起動を行うには、お使いのマシンを再起動して Start Bootloader from a read-only snapshot を選択します。すると、起動可能な全てのスナップショットが一覧表示されます。最も新しいスナップショットが最初に、最も古いスナップショットが最後に表示されます。 および を利用して選択して、 Enter を押してください。これで選択したスナップショットを有効化することができます。なお、起動メニューでスナップショットを選択しても、マシンはそのまま起動することはありません。選択したスナップショット内のブートローダを表示します。

ブートローダ: スナップショット
図 3.1: ブートローダ: スナップショット
警告
警告: UEFI を利用している場合に btrfs スナップショットからの Xen 起動が失敗する問題について

詳しくは https://www.suse.com/support/kb/doc/?id=000020602 をお読みください。

ブートローダ内でのスナップショット項目には、それらを容易に識別できるようにするための名前付け方式が設定されています:

[*]1OS2 (カーネル3,日付4T時刻5,説明6)

1

スナップショットに important のマークが付けられている場合、項目には * というマークが付けられます。

2

オペレーティングシステムのラベルです。

4

YYYY-MM-DD 形式での日付です。

5

HH:MM 形式での時刻です。

6

この項目には、スナップショットの説明が書かれます。手作業で作成したスナップショットの場合、ここには作成時に --description で指定した文字列か、独自の文字列 (詳しくは ヒント: ブートローダのスナップショット項目に対する説明文の設定 をお読みください) が設定されます。自動作成されたスナップショットの場合は、呼び出し側のツール名が記録されます (例: zypp(zypper) または yast_sw_single など) 。説明が長い場合は自動的に後ろ側が切られますが、これは起動画面のサイズに依存して決まります。

ヒント
ヒント: ブートローダのスナップショット項目に対する説明文の設定

スナップショットの説明文は、既定の文字列から変更することができます。これはたとえば、自動的に採取されたスナップショットの説明文では不十分だったり、ユーザが指定した説明文が長すぎたりするような場合に有用です。スナップショット 番号 に対して 文字列 を設定するには、下記のようなコマンドを実行します:

> sudo snapper modify --userdata "bootloader=文字列" 番号

なお、この説明は 25 文字以上の長さにはしないでください。このサイズを超過した場合、起動画面に表示しきれなくなることがあります。

3.3.3 制限事項 Edit source

完全な システムロールバックには対応していません。たとえば、スナップショットを採取した時点と全く等価な状態にシステムを戻すことはできません。

3.3.3.1 スナップショットから除外されるディレクトリによる影響 Edit source

ルートファイルシステムのスナップショットには、全てのディレクトリが含まれているというわけではありません。詳細と理由については、 3.1.3項 「スナップショットから除外されるディレクトリ」 をお読みください。一般的には、これらのディレクトリのデータは復元されず、下記のような制限事項が生まれます。

ロールバック後のアドオンおよびサードパーティ製ソフトウエアの使用について

/opt など、スナップショットから除外されるサブボリューム内にデータをインストールするアプリケーションやアドオンについては、スナップショットに含まれるサブボリュームにデータをインストールするような場合は、ロールバックを行うことで動作しなくなってしまう場合があります。この場合は、アプリケーションやアドオンを再インストールして問題を解決してください。

ファイルアクセスの問題について

スナップショットと現在動作中のシステムとの間で、アプリケーションがファイルのアクセス権や所有者を変更している場合、アプリケーションがそれらのファイルにアクセスできなくなってしまうことがあります。この場合は、ロールバック後にアクセス権や所有者をリセットして対応してください。

非互換のデータ形式について

スナップショットと現在動作中のシステムでサービスやアプリケーションの使用するデータ形式が変更されているような場合、ロールバックを行うとアプリケーションがデータを読めなくなってしまうことがあります。

コードとデータが混在するサブボリュームの場合について

/srv のようなサブボリュームの場合、コードとデータが混在していることがあります。この場合ロールバックを行うと、動作しないコードになってしまう場合があります。これは PHP のダウングレードが発生する場合があるためで、これによって Web サーバ内で PHP スクリプトがうく動作しなくなってしまいます。

ユーザデータについて

ロールバックによってシステムからユーザが削除される場合、これらのユーザが所有していたデータは、スナップショットから除外されているディレクトリにあるものについては、削除が行われません。ロールバック後、同じユーザ ID でユーザを作成してしまうと、そのユーザが古いユーザのファイル権限を引き継ぐことになってしまいます。そのため、 find のようなツールを利用して、孤立したファイルを検索して削除することをお勧めします。

3.3.3.2 ブートローダデータのロールバックについて Edit source

ブートローダをロールバックすることはできません。なぜなら、ブートローダにおける全ての ステージ 同士が密接に関係し合っているためです。そのため、 /boot のロールバックを行った場合には、正しく動作する保証ができません。

3.4 ユーザのホームディレクトリに対する Snapper の有効化 Edit source

ユーザの /home ディレクトリに対してスナップショットを有効化することもできます。この場合、下記のような用途が考えられます:

  • ユーザごとにスナップショットとロールバックを管理することができます。

  • たとえばデータベースやシステム、ネットワークの管理者などのシステムユーザが、設定ファイルやドキュメンテーションなどのコピーを保持しておくことができるようになります。

  • ホームディレクトリと btrfs バックエンドの組み合わせを利用した Samba 共有を作成することができます。

それぞれのユーザのホームディレクトリは /home の btrfs サブボリュームとなります。このような構成は手作業で設定することができます (詳しくは 3.4.3項 「手作業でのホームディレクトリに対するスナップショットの有効化」 をお読みください) 。ただし、 pam_snapper を使用するより便利な方法もあります。 pam_snapper パッケージは pam_snapper.so モジュールのほか、ユーザの作成や snapper の設定を作成するヘルパースクリプトをインストールします。

pam_snapperuseradd コマンドと Pluggable Authentication Modules (PAM) 、そして snapper との間を統合する機能を提供します。既定ではユーザのログイン時とログアウト時にスナップショットを作成するほか、ユーザがしばらくログインしたままの状態にあると、時間ベースのスナップショットも作成します。これらの既定値は通常の snapper コマンドと設定ファイルで変更することができます。

3.4.1 pam_snapper のインストールとユーザの作成 Edit source

最も始めやすい方法は、 btrfs でフォーマットした新しい /home ディレクトリを用意し、全くユーザが存在しない状況から行うことです。まずは pam_snapper をインストールします:

# zypper in pam_snapper

/etc/pam.d/common-session に下記の行を追加します:

session optional pam_snapper.so

ユーザとホームディレクトリを作成する場合は、 /usr/lib/pam_snapper/pam_snapper_useradd.sh を使用します。既定では、スクリプトは表示のみを行って実行は行いませんので、スクリプトを編集して DRYRUN=1DRYRUN=0 に変更します。あとは下記のようにして新しいユーザを作成します:

# /usr/lib/pam_snapper/pam_snapper_useradd.sh \
ユーザ名 グループ passwd=パスワード
Create subvolume '/home/username'
useradd: 警告: ホームディレクトリが既に存在します。
skel ディレクトリからのコピーは行いません。

ユーザ側では、初回ログイン時にホームディレクトリ内に /etc/skel の内容がコピーされます。あとは下記のように実行して、ユーザの設定が作成されていることを確認します:

# snapper list --all
Config: home_username, subvolume: /home/username
種類   | # | 前 #  | 日付 | ユーザ | クリーンアップ | 説明    | ユーザデータ
-------+---+-------+------+--------+----------------+---------+--------------
single | 0 |       |      | root   |                | current |

時間が経過するごとに上記の出力は増えていきますが、ユーザ側では標準的な snapper コマンドで管理を行うことができます。

3.4.2 ユーザの削除 Edit source

ユーザの削除についても /usr/lib/pam_snapper/pam_snapper_userdel.sh で行います。既定では、スクリプトは表示のみを行って実行は行いませんので、スクリプトを編集して DRYRUN=1DRYRUN=0 に変更します。あとは下記のようにしてユーザとユーザのサブボリューム、 snapper の設定と全てのスナップショットを削除します:

# /usr/lib/pam_snapper/pam_snapper_userdel.sh username

3.4.3 手作業でのホームディレクトリに対するスナップショットの有効化 Edit source

下記は、 snapper を利用してユーザのホームディレクトリを手作業で設定するための手順を示しています。なお、 /home は btrfs でフォーマットされていなければならず、実行する時点でユーザは存在していないものとします。

# btrfs subvol create /home/ユーザ名
# snapper -c home_ユーザ名 create-config /home/ユーザ名
# sed -i -e "s/ALLOW_USERS=\"\"/ALLOW_USERS=\"ユーザ名\"/g" \
/etc/snapper/configs/home_ユーザ名
# yast users add username=ユーザ名 home=/home/ユーザ名 password=パスワード
# chown ユーザ名.group /home/ユーザ名
# chmod 755 /home/ユーザ名/.snapshots

3.5 Snapper の設定の作成と修正 Edit source

Snapper の動作は、各パーティションや btrfs サブボリューム別に設定ファイルで設定することができます。設定ファイルは /etc/snapper/configs/ 内に存在しています。

ルートファイルシステムが十分に大きい (おおよそ 12 GB 以上) の場合、ルートファイルシステム / に対するスナップショットは、インストール時に自動的に有効化されます。この時点で作成される既定の設定は root という名前になっています。これにより、 YaST や zypper のスナップショットを作成して管理しています。既定値の一覧について、詳しくは 3.5.1.1項 「設定データ」 をお読みください。

注記
注記: スナップショットを有効化するための最小ルートファイルシステムサイズ

3.1項 「既定の設定」 で説明しているとおり、スナップショットの有効化を行うには、ルートファイルシステム内に追加の空き領域が必要となります。必要な容量はインストール済みのパッケージ数に依存するほか、スナップショットに含まれるボリュームで行われた変更量に依存して決まります。また、スナップショットの頻度やアーカイブされたスナップショットの数も影響します。

インストール時に自動的なスナップショットを有効化するのに必要な、最小のルートファイルシステムのサイズが決められています。現時点では、これは 12 GB に設定されています。この値は、アーキテクチャや基本システムのサイズによって、将来的に変更される可能性があります。また、この値はインストールメディア内の /control.xml ファイル内にある下記のタグで設定されています:

<root_base_size>
<btrfs_increase_percentage>

上記の値を利用して、下記の数式で計算することができます: ROOT_BASE_SIZE の値 * (1 + BTRFS_INCREASE_PERCENTAGE の値 /100)

ただし、ここでの値は最小値であることに注意してください。ルートファイルシステムに対しては、それ以上のサイズを設定することをお勧めします。一般的には、スナップショットを使用しない場合のサイズ想定の 2 倍程度を設定してください。

btrfs でフォーマットされた他のパーティションや、 btrfs の既存のサブボリュームに対して、独自の設定を作成することもできます。下記の例では、 /srv/www にマウントされた btrfs パーティション内の Web サーバのデータに対して、これらをバックアップするための設定を作成しています。

設定を作成したら、 snapper を利用するか、もしくは YaST の Snapper モジュールを利用して、これらのスナップショットから復元することができるようになります。なお、 YaST では 現在の設定 で作成した設定を選択する必要があります。 snapper の場合は、グローバルスイッチ -c で設定を指定してください (例: snapper -c myconfig list ) 。

Snapper の設定を作成するには、 snapper create-config を実行します:

> sudo snapper -c www-data1 create-config /srv/www2

1

設定ファイルの名前

2

スナップショットを採取したいパーティションのマウントポイント、もしくは btrfs サブボリューム名。

このコマンドは新しい設定ファイル /etc/snapper/configs/www-data を作成し、適切な既定値を設定します (設定値は /etc/snapper/config-templates/default にあるものを使用します) 。これらの既定値を調整する方法について、詳しくは 3.5.1項 「既存の設定の管理」 をお読みください。

ヒント
ヒント: 設定の既定値

新しい設定に対する既定値は、 /etc/snapper/config-templates/default にあるものを使用します。独自の既定値を設定したい場合は、同じディレクトリ内にファイルのコピーを作成して、必要な値を設定して保存してください。あとは設定を作成する際、 create-config コマンドに -t オプションを追加して設定します:

> sudo snapper -c www-data create-config -t MY_DEFAULTS /srv/www

3.5.1 既存の設定の管理 Edit source

snapper コマンドには、既存の設定を管理するためのいくつかのサブコマンドが用意されています。一覧表示のほか、表示と削除、修正にそれぞれ対応しています:

設定の一覧表示

既存の全ての設定を一覧表示するには、 snapper list-configs コマンドを使用します:

> sudo snapper list-configs
設定   | サブボリューム
-------+----------
root   | /
usr    | /usr
local  | /local
設定の表示

指定した設定を表示するには、 snapper -c 設定 get-config のサブコマンドを使用します。設定 の箇所には snapper list-configs で表示される設定の名前を指定します。設定オプションについて、詳しくは 3.5.1.1項 「設定データ」 をお読みください。

既定の設定値を表示したい場合は、下記のように実行します:

> sudo snapper -c root get-config
設定の修正

指定した設定のオプションを変更するには、 snapper -c 設定 set-config オプション= のサブコマンドを使用します。設定 の箇所には snapper list-configs で表示される設定の名前を指定します。 オプション で設定可能な値は、 3.5.1.1項 「設定データ」 に一覧表示しています。

設定の削除

指定した設定を削除するには、 snapper -c 設定 delete-config のサブコマンドを使用します。設定 の箇所には snapper list-configs で表示される設定の名前を指定します。

3.5.1.1 設定データ Edit source

各設定には、コマンドラインから変更することのできるオプションの一覧が含まれています。下記の一覧には、それぞれのオプションに対する詳細が記されています。値を変更するには、 snapper -c 設定 set-config "キー=" の形式で入力して実行します。

ALLOW_GROUPS , ALLOW_USERS

一般ユーザに対してスナップショットの使用を許可するためのオプションです。詳しくは 3.5.1.2項 「一般ユーザからの Snapper の使用」 をお読みください。

既定値は "" です。

BACKGROUND_COMPARISON

事前と事後のスナップショットを作成後、裏でそれらを比較しておくべきかどうかを指定します。

既定値は "yes" (はい) です。

EMPTY_*

事前と事後のスナップショット対で、変更がない場合のクリーンアップアルゴリズムを設定します。詳しくは 3.7.3項 「違いのないスナップショット対のクリーンアップ」 をお読みください。

FSTYPE

パーティションのファイルシステムの種類を指定します。変更してはなりません。

既定値は "btrfs" です。

NUMBER_*

インストールスナップショットと管理スナップショットに対するクリーンアップアルゴリズムを指定します。詳しくは 3.7.1項 「番号スナップショットのクリーンアップ」 をお読みください。

QGROUP / SPACE_LIMIT

クリーンアップアルゴリズムにクォータへの対応を追加します。詳しくは 3.7.5項 「ディスククォータサポートの追加」 をお読みください。

SUBVOLUME

スナップショットを採取するパーティションのマウントポイントまたはサブボリュームを指定します。変更してはなりません。

既定値は "/" です。

SYNC_ACL

Snapper を一般ユーザから使用している場合 (詳しくは 3.5.1.2項 「一般ユーザからの Snapper の使用」 をお読みください) 、対象のユーザは .snapshot ディレクトリへのアクセス許可と、そのディレクトリ内のファイルの読み込み許可が必要となります。 SYNC_ACL を yes に設定していると、 Snapper は ALLOW_USERS と ALLOW_GROUPS の設定にあわせて、自動的にユーザとグループへのアクセス ACL を設定します。

既定値は "no" (いいえ) です。

TIMELINE_CREATE

yes (はい) に設定していると、 1 時間ごとのスナップショットを作成します。設定可能な値は下記のとおりです: yes (はい), no (いいえ)

既定値は "no" (いいえ) です。

TIMELINE_CLEANUP / TIMELINE_LIMIT_*

タイムラインスナップショットに対するクリーンアップアルゴリズムを設定します。詳しくは 3.7.2項 「タイムラインスナップショットのクリーンアップ」 をお読みください。

3.5.1.2 一般ユーザからの Snapper の使用 Edit source

既定では、 Snapper は root だけが使用できます。しかし、場合によっては特定のグループやユーザに対してアクセスを許可し、スナップショットの作成やスナップショットからの巻き戻しを実施したい場合があります:

  • /srv/www 以下のスナップショットを採取しておきたい Web サイト管理者

  • 自分自身のホームディレクトリのスナップショットを採取しておきたい一般ユーザ

このような目的で、 Snapper には一般ユーザやグループへのアクセス許可を設定することができます。なお、対応する .snapshots ディレクトリには、それらのユーザからアクセスできるよう権限を設定する必要があります。権限の設定を最も簡単に行うには、 SYNC_ACL オプションを yes に設定するのがお勧めです。

手順 3.5: 一般ユーザに対する Snapper の使用の許可

ここで示す手順は、いずれも root で実施すべきものです。

  1. Snapper の設定をまだ作成していない場合は、設定を作成します。詳しい手順は 3.5項 「Snapper の設定の作成と修正」 をお読みください。たとえば下記のように実行します:

    > sudo snapper --config web_data create /srv/www
  2. 設定ファイルは /etc/snapper/configs/設定 に作成されます (ここで、 設定 には -c/--config で指定した値が入ります。たとえば上記の例では、 /etc/snapper/configs/web_data になります) 。必要に応じて設定を変更することもできます。詳しくは 3.5.1項 「既存の設定の管理」 をお読みください。

  3. アクセスを許可したいユーザやグループを、 ALLOW_USERS および ALLOW_GROUPS でそれぞれ指定します。複数のユーザやグループを指定したい場合は、 Space で区切って指定してください。なお、 www_admin ユーザに対して許可を与えたい場合は、下記のように実行します:

    > sudo snapper -c web_data set-config "ALLOW_USERS=www_admin" SYNC_ACL="yes"
  4. これで、指定した Snapper の設定を指定したユーザやグループから使用できるようになります。たとえば list のようなコマンドで、利用できることを確認することができます:

    www_admin:~ > snapper -c web_data list

3.6 スナップショットの手動作成と管理 Edit source

Snapper は設定で自動的にスナップショットを採取したり管理したりするだけでなく、コマンドラインや YaST モジュールを利用して、スナップショット対 (事前 および 事後) や単一のスナップショットを手動で作成することもできます。

全ての Snapper の操作は、既存の設定に対して行われます (詳しくは 3.5項 「Snapper の設定の作成と修正」 をお読みください) 。また、スナップショットは設定の存在するパーティションやボリュームに対してのみ採取することができます。既定では、システム設定 ( root ) を使用します。独自の設定でスナップショットを作成したり管理したりしたい場合は、設定を明示的に指定する必要があります。 YaST の場合は 現在の設定 のドロップダウンボックスを、コマンドラインの場合は -c をそれぞれ指定してください (例: snapper -c 設定 COMMAND) 。

3.6.1 スナップショットのメタデータ Edit source

それぞれのスナップショットにはメタデータが含まれています。スナップショットを作成する際、メタデータを指定する必要があります。また、スナップショットの内容については変更ができないことから、スナップショットの修正はメタデータの変更を意味することにもなります。 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 ) に対する全ての 単一 スナップショットを一覧表示します。

各スナップショットに対して、下記のメタデータが用意されています:

  • Type : スナップショットの種類。詳しくは 3.6.1.1項 「スナップショットの種類」 をお読みください。このデータは変更できません。

  • Number : スナップショットに対する唯一の番号。このデータは変更できません。

  • Pre Number : 対応する事前スナップショットの番号。 Type=post のスナップショットにのみ設定されます。このデータは変更できません。

  • Description : スナップショットの説明。

  • Userdata : カンマ区切りで key=value 形式の独自データを設定することのできるメタデータです。たとえば下記のように設定します:reason=testing, project=foo 。この項目は重要性を表す際に使用される ( important=yes ) ほか、一般ユーザが作成したスナップショットに対しても設定されます (user=tux) 。

  • Cleanup-Algorithm : スナップショットに対するクリーンアップアルゴリズム。詳しくは 3.7項 「自動的なスナップショットのクリーンアップ」 をお読みください。

3.6.1.1 スナップショットの種類 Edit source

Snapper で採取できるスナップショットには、事前/事後/単一の種類があります。物理的には違いがありませんが、 Snapper 側での処理に違いがあります。

pre (事前)

変更を行う のファイルシステムのスナップショットです。それぞれの pre スナップショットには、対応する post スナップショットが存在します。たとえば YaST や zypper が自動的に採取するスナップショットがこれにあたります。

post (事後)

変更を行った のファイルシステムのスナップショットです。それぞれの post スナップショットには、対応する pre スナップショットが存在します。たとえば YaST や zypper が自動的に採取するスナップショットがこれにあたります。

single (単一)

単独で採取されるスナップショットです。自動的な定時スナップショットなどで使用します。スナップショットを作成する際、既定の種類はこれになります。

3.6.1.2 クリーンアップアルゴリズム Edit source

Snapper には、古いスナップショットをクリーンアップ (清掃) するためのアルゴリズムが 3 種類存在しています。アルゴリズムは日々の cron ジョブで実行されます。また snapper の設定内に、複数の種類のスナップショットを設定することもできます (詳しくは 3.5.1項 「既存の設定の管理」 をお読みください) 。

number

特定のスナップショット数に達すると、古いスナップショットを削除します。

timeline

指定した時間が経過すると、古いスナップショットを削除します。ただし、いくつかの定期スナップショット (1 時間ごと, 1 日ごと, 1 ヶ月ごと, 1 年ごと) は保持されます。

empty-pre-post

差分を全く含んでいない事前/事後スナップショット対を削除します。

3.6.2 スナップショットの採取 Edit source

スナップショットの採取は、 snapper create を実行するか、もしくは YaST モジュールの Snapper作成 を押すことで作成することができます。下記の例では、コマンドラインからスナップショットを採取する方法を示しています。 YaST インターフェイスであれば、より簡単に採取することができます。

ヒント
ヒント: スナップショットの説明

スナップショットの説明にはわかりやすい説明を記述しておいて、後から何のために採取したものなのかを判別できるようにしておくことをお勧めします。 --userdata オプションを使用すると、さらに詳しい情報を保存することができます。

snapper create --from 17 --description "with package2"

上記のように入力して実行すると、既存のスナップショットからの単一スナップショットを作成することができます。スナップショットの一覧は、 snapper list コマンドを実行して確認します (これは Snapper バージョン 0.8.4 もしくはそれ以降のバージョンで利用できます) 。

snapper create --description "Snapshot for week 2 2014"

既定の設定 ( root ) に対して単一の (single) スナップショットを作成し、説明文を指定した場合の例です。クリーンアップアルゴリズムを指定していないため、このスナップショットは自動では削除されません。

snapper --config home create --description "Cleanup in ~tux"

home という設定に対して単一の (single) スナップショットを作成し、説明文を指定した場合の例です。クリーンアップアルゴリズムを指定していないため、このスナップショットは自動では削除されません。

snapper --config home create --description "Daily data backup" --cleanup-algorithm timeline >

home という独自の設定に対して単一の (single) スナップショットを作成し、説明文を指定した場合の例です。クリーンアップアルゴリズム (cleanup-algorithm) に timeline を指定しているため、その条件を満たすと自動的に削除されるようにもなっています。

snapper create --type pre --print-number --description "Before the Apache config cleanup" --userdata "important=yes"

種類に pre (事前) を指定してスナップショットを作成し、そのスナップショット番号を表示する場合の例です。何を行う の状態を保存しておく際、 を採取する場合に使用するコマンドです。このスナップショットには important (重要) のマークが付けられます。

snapper create --type post --pre-number 30 --description "After the Apache config cleanup" --userdata "important=yes"

種類に post (事後) を指定してスナップショットを作成し、 pre (事前) 側のスナップショット番号を 30 として採取する場合の例です。何を行う の状態を保存しておく際、 を採取する場合に使用するコマンドです。このスナップショットには important (重要) のマークが付けられます。

snapper create --command コマンド --description "Before and after COMMAND"

コマンド で指定されるコマンドを実行する前後に、スナップショット対を自動的に作成するコマンドです。このオプションは、 snapper をコマンドラインから実行する場合にのみ利用できます。

3.6.3 スナップショットのメタデータの変更 Edit source

Snapper では、スナップショットに対する説明やクリーンアップアルゴリズム、ユーザデータをそれぞれ変更することができます。その他の全てのメタデータは変更できません。下記の例では、コマンドラインからスナップショットを変更する方法を示しています。 YaST インターフェイスであれば、より簡単に変更することができます。

コマンドラインからスナップショットの変更を行うには、まずスナップショットの番号を知っておく必要があります。スナップショットの一覧と番号を表示するには、 snapper list を実行してください。

YaST Snapper モジュールの場合は、開いた時点で全てのスナップショットが表示されます。一覧からいずれかを選んで 修正 を押してください。

snapper modify --cleanup-algorithm "timeline" 10

既定の設定 ( root ) のスナップショット 10 に対して、メタデータの修正を行います。この場合は、クリーンアップアルゴリズムを timeline に設定します。

snapper --config home modify --description "daily backup" -cleanup-algorithm "timeline" 120

home という名前の設定のスナップショット 120 に対して、メタデータの修正を行います。新しい説明を設定し、クリーンアップアルゴリズムを timeline に設定します。

3.6.4 スナップショットの削除 Edit source

YaST Snapper モジュールでスナップショットを削除するには、一覧からスナップショットを選んで 削除 を押します。

コマンドラインツールからスナップショットを削除するには、まずスナップショットの番号を知っておく必要があります。スナップショットの一覧と番号を表示するには、 snapper list を実行してください。その後、snapper delete 番号 と入力して実行します。

現在の既定のサブボリュームスナップショットを削除することはできません。

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 のスナップショットが存在しているものの、メタデータを含む XML ファイルが失われている場合があります。この場合、スナップショットは Snapper で表示することができません。また、手作業で削除する必要があります:

btrfs subvolume delete /.snapshots/SNAPSHOTNUMBER/snapshot
rm -rf /.snapshots/SNAPSHOTNUMBER
ヒント
ヒント: 古いスナップショットの占有領域について

ハードディスクの空き容量を増やすためにスナップショットを削除する場合、古いスナップショットから順に削除することをお勧めします。これは、古いスナップショットほどより多くのディスク領域を占有するためです。

スナップショットは毎日の cron ジョブでも自動的に削除されます。詳しくは 3.6.1.2項 「クリーンアップアルゴリズム」 をお読みください。

3.7 自動的なスナップショットのクリーンアップ Edit source

スナップショットはディスク領域を占有するだけでなく、時間が経過するごとに占有されるサイズが大きくなっていく、という特徴があります。ディスクの空き容量が枯渇しないようにするため、 Snapper では古いスナップショットを自動的に削除するアルゴリズムを提供しています。これらのアルゴリズムでは、タイムラインスナップショットと番号スナップショット (管理スナップショットとインストールスナップショット) とを区別して扱います。また、それぞれの種類に対して、維持すべきスナップショット数を設定することもできます。

これに加えて必要であれば、スナップショットが占有するディスク領域の最大サイズとして、ディスククォータを設定することもできます。また、 pre (事前) と post (事後) のスナップショットのうち、差異が無いものを自動削除することもできます。

クリーンアップのアルゴリズムは、常に 1 つの Snapper 設定に結びつけられています。そのため、それぞれの設定に対してアルゴリズムを設定する必要があります。また、特定のスナップショットを自動削除されないように設定することもできます。詳しくは スナップショットを削除されたりしないように保護することはできますか? をお読みください。

既定の設定 ( root ) では、番号スナップショットと pre (事前) と post (事後) で差異のないものをクリーンアップするよう設定しています。また、クォータサポートも有効化されていて、ルートパーティションのディスク領域に対して、スナップショットが 50% 以上を占有しないように設定されています。また、タイムラインスナップショットは無効化されているため、タイムラインスナップショットのクリーンアップアルゴリズムも無効化されています。

3.7.1 番号スナップショットのクリーンアップ Edit source

番号スナップショット (管理スナップショットとインストールスナップショット) のクリーンアップは、 Snapper 設定のうち下記のパラメータで制御することができます。

NUMBER_CLEANUP

インストールスナップショットと管理スナップショットの対に対して、クリーンアップを有効にするか無効にするかを設定することができます。スナップショットの対は、 NUMBER_LIMIT で指定した数を超過するか、もしくはNUMBER_LIMIT_IMPORTANTNUMBER_MIN_AGE両方 を超過した場合に削除されます。設定可能な値は yes (有効), no (無効) のいずれかです。

既定値は "yes" (はい) です。

変更や設定の例:

> sudo snapper -c 設定 set-config "NUMBER_CLEANUP=no"
NUMBER_LIMIT / NUMBER_LIMIT_IMPORTANT

通常の番号スナップショットと重要なインストール/管理スナップショットに対して、保持すべきスナップショット対の数を指定します。なお、 NUMBER_CLEANUP"no" の場合は無視されます。

既定値はそれぞれ NUMBER_LIMIT"2-10"NUMBER_LIMIT_IMPORTANT"4-10" に設定されています。クリーンアップ処理では、それぞれ指定した最大値以上のスナップショットが削除され、不要なスナップショットとその領域が残らないようにします。また、クリーンアップ処理では、スナップショットやファイルシステムに対する制限に到達するまで、上記で指定した最小値を超えるスナップショットも削除します。

変更や設定の例:

> sudo snapper -c 設定 set-config "NUMBER_LIMIT=10"
重要
重要: 範囲指定と固定値について

クォータサポートを有効にしている場合 (3.7.5項 「ディスククォータサポートの追加」 をお読みください) は、 2-10 のように最小-最大の形式で制限を範囲指定する必要があります。クォータサポートが無効の場合は、 10 のように固定値を指定する必要があります。それ以外の場合は、エラーで失敗します。

NUMBER_MIN_AGE

スナップショットを自動削除するまでの最小経過秒数を指定します。ここで指定した値よりも新しいスナップショットは、どれだけ存在していても削除されません。

既定値は "1800" です。

変更や設定の例:

> sudo snapper -c 設定 set-config "NUMBER_MIN_AGE=864000"
注記
注記: 制限と世代

NUMBER_LIMIT , NUMBER_LIMIT_IMPORTANT , NUMBER_MIN_AGE は常に自動削除の判断基準となります。スナップショットは、 全て の条件に合致した場合にのみ削除されます。

新しいか古いかに関係なく、常に NUMBER_LIMIT* で設定した数だけスナップショットを保持させたい場合は、 NUMBER_MIN_AGE0 に設定してください。

下記の例は、直近の 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

3.7.2 タイムラインスナップショットのクリーンアップ Edit source

タイムラインスナップショットのクリーンアップは、 Snapper 設定のうち下記のパラメータで制御することができます。

TIMELINE_CLEANUP

タイムラインスナップショットに対して、クリーンアップを有効にするか無効にするかを設定することができます。スナップショットは TIMELINE_LIMIT_*TIMELINE_MIN_AGE両方 を超過した場合に削除されます。設定可能な値は yes (有効), no (無効) のいずれかです。

既定値は "yes" (はい) です。

変更や設定の例:

> sudo snapper -c 設定 set-config "TIMELINE_CLEANUP=yes"
TIMELINE_LIMIT_DAILY , TIMELINE_LIMIT_HOURLY , TIMELINE_LIMIT_MONTHLY , TIMELINE_LIMIT_WEEKLY , TIMELINE_LIMIT_YEARLY

時間単位/日単位/週単位/年単位に保持すべきスナップショット数を指定します。

各項目の既定値はそれぞれ "10" になっています。ただし、 TIMELINE_LIMIT_WEEKLY については、例外的に "0" が設定されます。

TIMELINE_MIN_AGE

スナップショットを自動削除するまでの最小経過秒数を指定します。

既定値は "1800" です。

例 3.1: タイムライン設定の例
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"

この設定例は 1 時間おきのスナップショットを自動的にクリーンアップする例です。TIMELINE_MIN_AGETIMELINE_LIMIT_* の両方が常に自動削除の判断基準となります。この例では、スナップショットを削除するまでの最小経過秒数が 30 分 (1800 秒) になっています。 1 時間おきのスナップショットを設定している場合は、常に最新のスナップショットのみを保持することになります。また、 TIMELINE_LIMIT_DAILY を 0 以外にしていると、 1 日の最初のスナップショットも保持されることになります。

保持されるスナップショット
  • 1 時間単位: 直近の 24 個のスナップショットを保持します。

  • 1 日単位: 直近の 7 日分に対して、 1 日の最初のスナップショットを保持します。

  • 1 ヶ月単位: 直近の 12 ヶ月分に対して、月の最後の日に作成された最初のスナップショットを保持します。

  • 1 週単位: 直近の 4 週間に対して、週の最後の日に作成された最初のスナップショットを保持します。

  • 1 年単位: 直近の 2 年に対して、年の最後の日に作成された最初のスナップショットを保持します。

3.7.3 違いのないスナップショット対のクリーンアップ Edit source

3.1.2項 「スナップショットの種類」 で説明しているとおり、 YaST モジュールや zypper を実行すると、その起動時に pre (事前) スナップショットが作成され、終了時に post (事後) スナップショットが作成されます。ただ、何も変更せずにそれらを終了したような場合など、 pre と post の間で何も変更が無い場合があります。このような 空の スナップショットは、 Snapper の設定内の下記パラメータを利用することで、自動削除を行うことができます:

EMPTY_PRE_POST_CLEANUP

yes (はい) を指定すると、何も差異のない pre と post のスナップショット対が削除されます。

既定値は "yes" (はい) です。

EMPTY_PRE_POST_MIN_AGE

何も差異のない pre/post スナップショット対のうち、自動削除するまでの最小経過秒数を指定します。

既定値は "1800" です。

3.7.4 手作業で作成したスナップショットのクリーンアップ Edit source

Snapper には、手作業で採取したスナップショットに対する独自のクリーンアップアルゴリズムが用意されていません。しかしながら、番号やタイムラインのクリーンアップアルゴリズムを、手作業で作成したスナップショットに適用することができます。これを行うと、スナップショットがアルゴリズムの クリーンアップキュー 内に追加されるようになります。また、クリーンアップアルゴリズムは、スナップショットの作成時に指定することができるほか、既存のスナップショットに対して設定することもできます:

snapper create --description "Test" --cleanup-algorithm number

既定の設定 (root) に対して単一の (single) スナップショットを作成し、number (番号) クリーンアップアルゴリズムを適用した場合の例です。

snapper modify --cleanup-algorithm "timeline" 25

スナップショット番号 25 に対して、クリーンアップアルゴリズム timeline (タイムライン) を適用した場合の例です。

3.7.5 ディスククォータサポートの追加 Edit source

上述の番号/タイムラインのクリーンアップアルゴリズムに加えて、 Snapper ではクォータ (容量制限) を設定することができます。容量制限は利用可能な空き容量に対する比率で指定します。この比率での指定は、それぞれの Snapper 設定内で指定された btrfs サブボリュームに対して常に適用されます。

btrfs のクォータは、ユーザではなくサブボリュームに対して適用されます。また、 btrfs のクォータは、ユーザやグループに対するクォータ (quota コマンドを使用するクォータ) と併用することができます。

インストール時に Snapper を有効化していると、クォータサポートも自動的に有効化されます。 Snapper を後から有効化した場合は、 snapper setup-quota を実行することでクォータサポートを有効化することができます。また、この動作には正しい設定が必要です (詳しくは 3.5項 「Snapper の設定の作成と修正」 をお読みください) 。

クォータサポートは、 Snapper 設定のうち下記のパラメータで制御することができます。

QGROUP

Snapper で使用されるクォータグループを指定します。何も指定されていない場合は、 snapper setup-quota で設定することができます。既に設定されている場合は、 man 8 btrfs-qgroup をよくお読みのうえ変更してください。また、この値は snapper setup-quota で設定すべきもので、通常は変更すべきではありません。

SPACE_LIMIT

1 を 100% とする小数で、スナップショットに対して許可される容量を指定します。指定可能な値は 0 から 1 まで (0.1 = 10%, 0.2 = 20%, ...) です。

なお、下記の制限事項とガイドラインをお読みください:

  • クォータは既存の番号/タイムラインに対するクリーンアップアルゴリズムに 加えて のみ有効化されるべきものです。何もクリーンアップアルゴリズムを指定していないと、クォータによる制限も適用されません。

  • クォータサポートが有効化されていると、 Snapper は必要に応じて 2 回のクリーンアップ処理を実施します。 1 回目の実行では番号もしくはタイムラインのスナップショットに対するルールを適用し、その時点でクォータを超過している場合、 2 回目の実行としてクォータ固有のルールが適用されます。

  • クォータサポートが有効化されていても、 Snapper は NUMBER_LIMIT*TIMELINE_LIMIT* の各値で指定された数のスナップショットを、クォータを超過している場合でも常に保持します。そのため、 NUMBER_LIMIT*TIMELINE_LIMIT* では値の範囲を指定 (MIN-MAX) して、クォータによる削除が適用されるようにしてください。

    たとえば NUMBER_LIMIT=5-20 という設定の場合、 Snapper は最初のクリーンアップ実行で定期的に採取されたスナップショットを 20 個まで減らします。 20 個まで減らしてもクォータを超過している場合は、 Snapper はクォータを超過しなくなるまで古いスナップショットを削除します。ただし、最新の 5 個分については、領域の問題が解決していなくても、必ず保持する動作になります。

3.8 スナップショットが占有しているディスク容量の表示 Edit source

スナップショットではストレージ領域を効率的に使用する目的で、データの共有を行っています。そのため、 dudf 等のコマンドを使用しても、残りのディスク領域を正確に測定することができません。 btrfs でクォータを有効化している場合、ディスク領域を空けるには、まずそれぞれのスナップショットが占有している (共有していない) ディスク容量を正確に把握する必要があります。 snapper 0.6 もしくはそれ以降のバージョンでは、 使用済み領域 の列内に占有している容量が表示されます:

# snapper --iso list
  # | 種類   | 前 #  | 日付                        | ユーザ | 使用済み領域 | クリーンアップ| 説明                  | ユーザデータ
----+--------+-------+-----------------------------+--------+--------------+---------------+-----------------------+--------------
 0  | single |       |                             |  root  |              |               | current               |              
 1* | single |       | 2019年07月22日 13時08分38秒 |  root  |   16.00 KiB  |               | first root filesystem |              
 2  | single |       | 2019年07月22日 14時21分05秒 |  root  |   14.23 MiB  |    number     | after installation    | important=yes
 3  | pre    |       | 2019年07月22日 14時26分03秒 |  root  |  144.00 KiB  |    number     | zypp(zypper)          | important=no 
 4  | post   |     3 | 2019年07月22日 14時26分04秒 |  root  |  112.00 KiB  |    number     |                       | important=no 
 5  | pre    |       | 2019年07月23日 08時19分36秒 |  root  |  128.00 KiB  |    number     | zypp(zypper)          | important=no 
 6  | post   |     5 | 2019年07月23日 08時19分43秒 |  root  |   80.00 KiB  |    number     |                       | important=no 
 7  | pre    |       | 2019年07月23日 08時20分50秒 |  root  |  256.00 KiB  |    number     | yast sw_single        |              
 8  | pre    |       | 2019年07月23日 08時23分22秒 |  root  |  112.00 KiB  |    number     | zypp(ruby.ruby2.5)    | important=no 
 9  | post   |     8 | 2019年07月23日 08時23分35秒 |  root  |   64.00 KiB  |    number     |                       | important=no 
10  | post   |     7 | 2019年07月23日 08時24分05秒 |  root  |   16.00 KiB  |    number     |                       |

btrfs コマンドを使用しても、それぞれのスナップショットが占有するディスク容量を表示することができます:

# btrfs qgroup show -p /
qgroupid         rfer         excl parent  
--------         ----         ---- ------  
0/5          16.00KiB     16.00KiB ---     
[...]    
0/272         3.09GiB     14.23MiB 1/0     
0/273         3.11GiB    144.00KiB 1/0     
0/274         3.11GiB    112.00KiB 1/0     
0/275         3.11GiB    128.00KiB 1/0     
0/276         3.11GiB     80.00KiB 1/0     
0/277         3.11GiB    256.00KiB 1/0     
0/278         3.11GiB    112.00KiB 1/0     
0/279         3.12GiB     64.00KiB 1/0     
0/280         3.12GiB     16.00KiB 1/0     
1/0           3.33GiB    222.95MiB ---

qgroupid 列には、それぞれのサブボリュームの識別番号と qgroup レベル/ID の組み合わせが表示されます。

rfer 列には、サブボリューム内で参照されているデータの容量が表示されます。

excl 列には、それぞれのサブボリューム内に存在する占有データ容量が表示されます。

parent 列には、サブボリュームの親 qgroup が表示されます。

末尾にある 1/0 には、親 qgroup に対する合計容量が表示されています。上記の例では、全てのサブボリュームを削除すると、 222.95 MiB が解放されることになります。下記のコマンドを実行すると、スナップショットとサブボリュームの関係性を表示することができます:

# btrfs subvolume list -st /
ID      gen     top level       path
--      ---     ---------       ----
267     298     266             @/.snapshots/1/snapshot
272     159     266             @/.snapshots/2/snapshot
273     170     266             @/.snapshots/3/snapshot
274     171     266             @/.snapshots/4/snapshot
275     287     266             @/.snapshots/5/snapshot
276     288     266             @/.snapshots/6/snapshot
277     292     266             @/.snapshots/7/snapshot
278     296     266             @/.snapshots/8/snapshot
279     297     266             @/.snapshots/9/snapshot
280     298     266             @/.snapshots/10/snapshot

また、一方のサービスパックから他方のサービスパックにアップグレードを行ったりすると、パッケージの更新により多数のデータが変更されるため、スナップショットがシステムサブボリューム内の多くの領域を占有するようになります。これらは、不要になった段階で、手作業による削除を行うことをお勧めします。詳しくは 3.6.4項 「スナップショットの削除」 をお読みください。

3.9 よくある質問とその回答 Edit source

問:Snapper が /var/log/tmp などのディレクトリ内の変更を表示しないのはなぜ?

ディレクトリによってはスナップショットから除外されているものがあります。詳しい一覧とその理由については、 3.1.3項 「スナップショットから除外されるディレクトリ」 をご覧ください。スナップショットからの除外にあたっては、サブボリュームを作成して対応しています。

問:ブートローダから特定のスナップショットを起動するには?

詳しくは 3.3項 「スナップショットからの起動によるシステムのロールバック」 をお読みください。

問:スナップショットを削除されたりしないように保護することはできますか?

現時点では、スナップショットを手作業による削除から保護する方法はありません。しかしながら、クリーンアップアルゴリズムで自動削除されないように設定することは可能です。手作業で採取したスナップショットの場合 (詳しくは 3.6.2項 「スナップショットの採取」 をお読みください) 、 --cleanup-algorithm でクリーンアップアルゴリズムを指定しない限り、何もクリーンアップアルゴリズムが割り当てられません。また、自動的に採取されたスナップショットには、 number または timeline のいずれかのアルゴリズムが割り当てられます。 1 つまたは複数のスナップショットに対して、この割り当てを削除したい場合は、下記のようにして行います:

  1. まずは利用可能な全てのスナップショットを一覧表示します:

    > sudo snapper list -a
  2. 削除したくないスナップショットの番号 (複数可) を覚えておきます。

  3. 下記のコマンドを実行します。このとき、上記で覚えておいた番号を #1 #2 #n の部分に指定します:

    > sudo snapper modify --cleanup-algorithm "" #1 #2 #n
  4. 最後にもう一度 snapper list -a を実行して、結果を確認します。変更したスナップショットの Cleanup 欄が空白になっていれば成功です。

問:Snapper に関してさらに詳しい情報を知るには?

Snapper の Web ページ http://snapper.io/ をご覧ください。

このページを印刷