「Snapper」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(ページの作成:「Category:ファイルシステム en:Snapper {{Related articles start}} {{Related|Btrfs}} {{Related4|mkinitcpio-btrfs}} {{Related4|Btrfs - Tips and tricks}} {{Rel...」)
 
 
(5人の利用者による、間の27版が非表示)
1行目: 1行目:
 
[[Category:ファイルシステム]]
 
[[Category:ファイルシステム]]
 
[[en:Snapper]]
 
[[en:Snapper]]
  +
[[zh-hans:Snapper]]
 
{{Related articles start}}
 
{{Related articles start}}
 
{{Related|Btrfs}}
 
{{Related|Btrfs}}
{{Related4|mkinitcpio-btrfs}}
+
{{Related|mkinitcpio}}
{{Related4|Btrfs - Tips and tricks}}
 
 
{{Related articles end}}
 
{{Related articles end}}
   
 
[http://snapper.io Snapper] は openSUSE の Arvin Schnell によって作られた、[[Btrfs]] のサブボリュームと [[LVM]] のボリュームのスナップショットの管理を助けるツールです。スナップショットを作成して比較したり、前のスナップショットに戻したり、自動スナップショットが行えます。
 
[http://snapper.io Snapper] は openSUSE の Arvin Schnell によって作られた、[[Btrfs]] のサブボリュームと [[LVM]] のボリュームのスナップショットの管理を助けるツールです。スナップショットを作成して比較したり、前のスナップショットに戻したり、自動スナップショットが行えます。
 
{{Warning|カーネル 3.17 と 3.17-1 では、読み取り専用のスナップショットで Snapper と [[Btrfs]] を使用すると [http://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg38049.html 偶に破損が発生] してファイルシステムを再作成しないとスナップショットが削除できなくなることがあります。このバグは 3.17-2 で修正されました。}}
 
   
 
==インストール==
 
==インストール==
安定版 {{Pkg|snapper}} は[[公式リポトリ]]からインストールできます。
+
安定版 {{Pkg|snapper}} パッケージからインストールできます。開発版は {{AUR|snapper-git}} パッケージで利用可能です。
   
開発版 [[AUR]] の {{AUR|snapper-git}} で利用可能です。
+
GUI は {{AUR|snapper-gui-git}} パッケージインストールすることがきます。
   
 
==新しい設定の作成==
 
==新しい設定の作成==
新しい設定を作成するには {{ic|snapper create-config}} コマンドを使います。
 
   
{{Note|設定を作成するにまずサブボリューム作成る必要があります: {{ic|btrfs subvolume create /my/directory}}既存のディレクトリが存在してはいけません。{{ic|/}} を使う場合、サブボリューム作成行う必要はありせん。Btrfs をセットアップした際に {{ic|/}} は既にサブボリュームになっていま。詳しくは [[Btrfs#サブボリュームを作成する]] を参照}}
+
Btrfs サブボリュームで Snapper の設定を作成するに、あらかじめサブボリューム作成されている必要があります。サブボュームが存在しい場合、Snapper 設定するえに[[Btrfs#サブボリュームを作成る|サブボリュームを作成]]してください
   
  +
Btrfs サブボリュームが {{ic|''/path/to/subvolume''}} に存在していて、{{ic|''config''}} という名前で新しく Snapper の設定を作るには:
{{ic|/}} にマウントされたサブボリュームを使用する例:
 
   
# snapper -c root create-config /
+
# snapper -c ''config'' create-config ''/path/to/subvolume''
   
 
上記のコマンドを実行すると:
 
上記のコマンドを実行すると:
*{{ic|/etc/snapper/config-templates}} にあるデフォルトのテンプレートに基づいて {{ic|/etc/snapper/configs/root}} に設定ファイルが作成されます。
+
*{{ic|/etc/snapper/config-templates}} にあるデフォルトのテンプレートに基づいて {{ic|/etc/snapper/configs/''config''}} に設定ファイルが作成されます。
  +
*{{ic|''/path/to/subvolume''/.snapshots}} にサブボリュームが作成されてスナップショットが保存されます。スナップショットのパスは {{ic|''/path/to/subvolume''/.snapshots/''#''/snapshot}} になります ({{ic|''#''}} はスナップショット番号です)。
*サブボリュームのルートにサブボリューム {{ic|.snapshots}} が作成されます (上記の例の場合 {{ic|/.snapshots}})。
 
*{{ic|/etc/conf.d/snapper}} の {{ic|SNAPPER_CONFIGS}} に "root" が追加されます。
+
*{{ic|/etc/conf.d/snapper}} の {{ic|SNAPPER_CONFIGS}} に {{ic|''config''}} が追加されます。
   
  +
例えば、{{ic|/}} にマウントされたサブボリュームの設定ファイルを作成する場合:
コマンドを実行した時点で、設定は有効になります。cron デーモンを実行している場合、Snapper は1時間ごとにスナップショットを取得するようになります。設定ファイルを確認して保存するスナップショットの数を設定することを推奨します。
 
   
  +
# snapper -c root create-config /
{{Note|設定ファイルに記述できる設定の全ては {{ic|man snapper-configs}} を見て下さい。}}
 
  +
  +
この時点で、設定は有効になっています。[[cron]] デーモンが動作している場合、snapper は[[#自動タイムラインスナップショット|自動タイムラインスナップショット]]を作成します。[[cron]] デーモンを使っていない場合、systemd サービスとタイマーを使用する必要があります。[[#有効化/無効化]]を見てください。
  +
  +
設定について詳しくは {{ic|snapper-configs}} の [[man ページ]]を参照。
  +
  +
== スナップショットの作成 ==
  +
  +
=== 自動タイムラインスナップショット ===
  +
  +
Snapper では毎時・毎日・毎月・毎年に保存するスナップショットの数を設定できるスナップショットタイムラインを作成することができます。デフォルトでは1時間毎にスナップショットが取得されます。そして1日1回、タイムラインのクリーンアップアルゴリズムによって"古くなって要らなくなった"スナップショットを削除します。
  +
  +
==== 有効化/無効化 ====
  +
  +
[[cron]] デーモンが動作している場合、自動タイムラインスナップショットは自動的に起動します。無効化するには、サブボリュームに存在する設定ファイルを編集して以下を設定してください:
  +
  +
{{bc|<nowiki>TIMELINE_CREATE="no"</nowiki>}}
   
  +
[[cron]] デーモンを使っていない場合、パッケージに含まれている systemd ユニットを使うことができます。{{ic|snapper-timeline.timer}} を[[起動]]・[[有効化]]することで自動タイムラインスナップショットが開始されます。さらに、{{ic|snapper-cleanup.timer}} を[[起動]]・[[有効化]]すると定期的に古いスナップショットが消去されます。
==自動タイムラインスナップショット==
 
Snapper では毎時・毎日・毎月・毎年に保存するスナップショットの数を設定できるスナップショットタイムラインを作成することができます。
 
   
  +
{{Note|cron デーモンと有効化された systemd ユニットがともに動作すると、重複したスナップショットが作成される結果になる場合があります。systemd ユニットを使いつつ cron 側を無効にできるかもしれない一つの手法に、[[pacman]] の [[pacman#インストールさせないファイルを設定|NoExtract]] および [[pacman#アップグレードさせないファイルを設定|NoUpgrade]] を使い、snapper のパッケージの cron ファイルをインストールしない方法があります。[https://unix.stackexchange.com/questions/425570/snapper-has-recently-started-performing-duplicate-snapshots-each-hour] を見てください。}}
以下のように実行されます:
 
* デフォルトでは1時間毎にスナップショットが取得されます ({{ic|cron.hourly}})。
 
* 1日1回、タイムラインのクリーンアップアルゴリズムによって"古くなって要らなくなった"スナップショットを削除します ({{ic|cron.daily}})。
 
   
  +
==== スナップショットのリミットの設定 ====
上のセクションで説明したように {{ic|snapper create-config}} で新しい設定を作成した場合、この機能がデフォルトで有効になります。無効にするには、設定ファイルを編集して以下のように設定してください:
 
TIMELINE_CREATE="no"
 
   
デフォルト設定では、毎時間10個、毎日10個、毎月10個、毎年10個のスナップショットが保存されます。{{ic|/}} など頻繁にサブボリュームに変更を加える場合は、この設定を変更したほうが良いでしょう。[[#注意事項]] を見て下さい。
+
デフォルト設定では、毎時間10個、毎日10個、毎月10個、毎年10個のスナップショットが保存されます。{{ic|/}} など頻繁にサブボリュームに変更を加える場合は、この設定を変更したほうが良いでしょう。[[#ドライブの負担を抑える]]を見て下さい。
   
 
以下は、5時間、毎日7個のスナップショットだけを維持して、毎月・毎年は保存しない設定の例です:
 
以下は、5時間、毎日7個のスナップショットだけを維持して、毎月・毎年は保存しない設定の例です:
{{hc|/etc/snapper/configs/root|<nowiki>
+
{{hc|head=/etc/snapper/configs/''config''|output=
# limits for timeline cleanup
 
 
TIMELINE_MIN_AGE="1800"
 
TIMELINE_MIN_AGE="1800"
 
TIMELINE_LIMIT_HOURLY="5"
 
TIMELINE_LIMIT_HOURLY="5"
55行目: 63行目:
 
TIMELINE_LIMIT_MONTHLY="0"
 
TIMELINE_LIMIT_MONTHLY="0"
 
TIMELINE_LIMIT_YEARLY="0"
 
TIMELINE_LIMIT_YEARLY="0"
  +
}}
</nowiki>}}
 
   
  +
==== スナップショットとクリーンアップの頻度を変更する ====
数週間後、{{ic|snapper -c root list}} の出力は以下のようになるはずです:
 
   
  +
systemd タイマーを使っている場合、タイマーを[[Systemd#ユニットファイルの編集|編集]]してスナップショットの頻度を変更できます。
{{hc|# snapper -c root list|<nowiki>
 
Type | # | Pre # | Date | User | Cleanup | Description | Userdata
 
-------+------+-------+--------------------------+------+----------+-------------+---------
 
single | 0 | | | root | | current |
 
single | 3053 | | Tue Oct 22 00:01:02 2013 | root | timeline | timeline |
 
single | 3077 | | Wed Oct 23 00:01:01 2013 | root | timeline | timeline |
 
single | 3101 | | Thu Oct 24 00:01:01 2013 | root | timeline | timeline |
 
single | 3125 | | Fri Oct 25 00:01:01 2013 | root | timeline | timeline |
 
single | 3149 | | Sat Oct 26 00:01:01 2013 | root | timeline | timeline |
 
single | 3173 | | Sun Oct 27 00:01:01 2013 | root | timeline | timeline |
 
single | 3197 | | Sun Oct 27 23:01:01 2013 | root | timeline | timeline |
 
single | 3198 | | Mon Oct 28 00:01:01 2013 | root | timeline | timeline |
 
single | 3199 | | Mon Oct 28 01:01:01 2013 | root | timeline | timeline |
 
single | 3200 | | Mon Oct 28 02:01:01 2013 | root | timeline | timeline |
 
single | 3201 | | Mon Oct 28 03:01:02 2013 | root | timeline | timeline |
 
single | 3202 | | Mon Oct 28 04:01:01 2013 | root | timeline | timeline |
 
single | 3203 | | Mon Oct 28 05:01:02 2013 | root | timeline | timeline |
 
single | 3204 | | Mon Oct 28 06:01:01 2013 | root | timeline | timeline |
 
single | 3205 | | Mon Oct 28 07:01:02 2013 | root | timeline | timeline |
 
single | 3206 | | Mon Oct 28 08:01:01 2013 | root | timeline | timeline |
 
single | 3207 | | Mon Oct 28 09:01:01 2013 | root | timeline | timeline |
 
single | 3208 | | Mon Oct 28 10:01:01 2013 | root | timeline | timeline |
 
single | 3209 | | Mon Oct 28 11:01:01 2013 | root | timeline | timeline |
 
single | 3210 | | Mon Oct 28 12:01:01 2013 | root | timeline | timeline |
 
single | 3211 | | Mon Oct 28 13:01:01 2013 | root | timeline | timeline |
 
single | 3212 | | Mon Oct 28 14:01:01 2013 | root | timeline | timeline |
 
single | 3213 | | Mon Oct 28 15:01:01 2013 | root | timeline | timeline |
 
single | 3214 | | Mon Oct 28 16:01:01 2013 | root | timeline | timeline |
 
single | 3215 | | Mon Oct 28 17:01:01 2013 | root | timeline | timeline |
 
single | 3216 | | Mon Oct 28 18:01:01 2013 | root | timeline | timeline |
 
single | 3217 | | Mon Oct 28 19:01:01 2013 | root | timeline | timeline |
 
single | 3218 | | Mon Oct 28 20:01:01 2013 | root | timeline | timeline |
 
</nowiki>}}
 
   
  +
例えば、{{ic|snapper-timeline.timer}} を編集して以下のようにすることで5分毎にスナップショットが作成されます:
スナップショットは {{ic|$BTRFS_ROOT/.snapshots}} に保存されます。より正確に言うと、サブボリュームのパスは {{ic|$BTRFS_ROOT/.snapshots/$SNAPHOST_ID/snapshot}} です。こちらの [https://bbs.archlinux.org/viewtopic.php?pid=1458872#p1458872 フォーラムスレッド] を見て下さい。
 
  +
  +
[Timer]
  +
OnCalendar=
  +
OnCalendar=*:0/5
  +
  +
{{Note|設定パラメータ {{ic|TIMELINE_LIMIT_HOURLY}} は上記の設定に関連付けられています。上の例では5分毎にスナップショットが作成されるようになります。}}
  +
  +
{{ic|snapper-cleanup.timer}} を編集するときは {{ic|OnUnitActiveSec}} を変更してください。1時間毎に古いスナップショットを消去するには、以下を追加:
  +
  +
[Timer]
  +
OnUnitActiveSec=1h
  +
  +
詳しくは [[Systemd/タイマー]]や [[Systemd#ドロップインファイル]]を参照。
  +
  +
=== 手動スナップショット ===
  +
  +
==== シンプルなスナップショット ====
  +
  +
デフォルトでは Snapper は他のスナップショットと特別な関係を持たない、単純なスナップショットを作成します。
  +
  +
手動でサブボリュームのスナップショットを作成するには、以下のコマンドを実行:
  +
  +
# snapper -c ''config'' create --description ''desc''
  +
  +
上記のコマンドはクリーンアップアルゴリズムを使用しないため、スナップショットは明示的に[[#スナップショットの削除|削除]]するまでずっと残り続けます。
  +
  +
クリーンアップアルゴリズムを設定するには {{ic|create}} の後に {{ic|-c}} フラグを使用して {{ic|number}}, {{ic|timeline}}, {{ic|pre}}, {{ic|post}} のどれかを選択してください。{{ic|number}} は設定ファイルで指定された番号にあわせて定期的にスナップショットを削除します。例えば、{{ic|number}} アルゴリズムを使用するスナップショットを作成するには:
  +
  +
# snapper -c ''config'' create -c number
  +
  +
{{ic|timeline}} スナップショットについては[[#自動タイムラインスナップショット|自動タイムラインスナップショット]]を、{{ic|pre}} と {{ic|post}} については[[#事前事後のスナップショット|事前事後のスナップショット]]を見てください。
  +
  +
==== 事前事後のスナップショット ====
  +
  +
シンプルなスナップショットだけでなく、Snapper では事前事後のスナップショットを作成できます。事前 (''pre'') スナップショットには必ず対応する事後 (''post'') スナップショットが存在します。このペアによってシステムに変更を加える前後のスナップショットを作成することができます。
  +
  +
事前事後のスナップショットを作成するには、まず事前スナップショットを作成:
  +
  +
# snapper -c ''config'' create -t pre -p
  +
  +
上記のコマンドでスナップショット番号が出力されます。
  +
  +
それからシステムに何らかの変更を加えます (例えば新しいプログラムをインストールしたり、ソフトウェアをアップグレードするなど)。
  +
  +
次に事後のスナップショットを作成:
  +
  +
# snapper -c ''config'' create -t post --pre-number ''#''
  +
  +
{{ic|''#''}} は事前スナップショットの番号に置き換えてください。
  +
  +
{{ic|create}} に {{ic|--command}} フラグを指定して、コマンドをラップすることもできます:
  +
  +
# snapper -c ''config'' create --command ''cmd''
  +
  +
{{ic|''cmd''}} は事前事後のスナップショットを作成する間に実行したいコマンドに置き換えてください。
  +
  +
[[#pacman のトランザクションをスナップショットで記録|pacman のトランザクションをスナップショットで記録]]も見てください。
  +
  +
=== 起動時にスナップショットを作成 ===
  +
  +
snapper で {{ic|root}} 設定のスナップショットを作成するには {{ic|snapper-boot.timer}} を[[有効化]]してください。
  +
  +
== スナップショットの確認 ==
  +
  +
作成されたスナップショットを確認するには:
  +
  +
# snapper -c ''config'' list
  +
  +
== 設定の確認 ==
  +
  +
全ての[[#新しい設定の作成|設定]]を確認するには:
  +
  +
# snapper list-configs
  +
  +
== スナップショットの削除 ==
  +
  +
スナップショット番号 {{ic|''#''}} を削除するには:
  +
  +
# snapper -c ''config'' delete ''#''
  +
  +
一度に複数のスナップショットを削除できます。例えば、root 設定の65と70のスナップショットを削除するには:
  +
  +
# snapper -c root delete 65 70
  +
  +
{{Note|事前スナップショットを削除した場合、事後スナップショットも一緒に削除してください。逆も然りです。}}
   
 
==root 以外のユーザーでアクセス==
 
==root 以外のユーザーでアクセス==
 
設定は root ユーザーによって作成され、デフォルトでは、root だけが設定を確認したり変更できます。
 
設定は root ユーザーによって作成され、デフォルトでは、root だけが設定を確認したり変更できます。
   
特定のユーザーからもスナップショットを確認できるようにしたいときは、{{ic|/etc/snapper/configs/<config_name>}} ファイルの {{ic|ALLOW_USERS}} の値を変更してください。そうすれば通常ユーザーでも {{ic|snapper -c <config_name> list}} を実行できるようになります。
+
特定のユーザーからもスナップショットを確認できるようにしたいときは、{{ic|/etc/snapper/configs/''config''}} ファイルの {{ic|ALLOW_USERS}} の値を変更してください。そうすれば通常ユーザーでも {{ic|snapper -c ''config''list}} を実行できるようになります。
   
さらに、ユーザーを使って {{ic|.snapshots}} ディレクトリを閲覧できるようにしたい、それでいてディレクトリの所有者は root のままにしておきたいということが考えられます。そのような場合、使用したいユーザーが属しているグループに、グループ所有者を変更してください。例えば {{ic|users}} を使う場合:
+
さらに、ユーザーを使って {{ic|.snapshots}} ディレクトリを閲覧できるようにしたい、それでいてディレクトリの所有者は root のままにしておきたいということが考えられます。そのような場合、使用したいユーザーが属しているグループに、グループ所有者を変更してください。例えば {{ic|users}} を使う場合:
   
 
# chmod a+rx .snapshots
 
# chmod a+rx .snapshots
 
# chown :users .snapshots
 
# chown :users .snapshots
   
  +
== ヒントとテクニック ==
==cron で定期的に実行==
 
{{ic|cronie}} をインストールしていない場合、cron ジョブは実行されません。しかしながら、systemd タイマーを snapper で使うことができます。
 
   
  +
=== pacman のトランザクションをスナップショットで記録 ===
タイムラインタイマーを起動するには:
 
   
  +
pacman の操作時にスナップショットを自動的に作成するために使用されるパッケージがいくつかあります:
# systemctl start snapper-timeline.timer
 
   
  +
* {{App|snap-pac|pacman が自動的に snapper を使用して、openSUSE の YaST のような[[Snapper#事前事後のスナップショット|事前/事後のスナップショット]]を作成します。[[pacman フック]] を使用します。|https://github.com/wesbarnett/snap-pac|{{Pkg|snap-pac}}}}
{{ic|snapper-cleanup.timer}} も起動・有効化すると良いでしょう。ブート時に実行されるようになります。
 
  +
* {{App|grub-btrfs|(''grub-btrfsd'') デーモンが含まれており、''systemctl'' を使って有効にすることで新しいスナップショットを探し、それらを自動的に [[GRUB]] メニューに含めます。|https://github.com/Antynea/grub-btrfs|{{Pkg|grub-btrfs}}}}
  +
* {{App|snap-pac-grub|{{Pkg|snap-pac}} がスナップショットを作った後に、{{Pkg|grub-btrfs}} の [[GRUB]] エントリを更新します。[[pacman フック]] を使用します|https://github.com/maximbaz/snap-pac-grub|{{AUR|snap-pac-grub}}}}
  +
* {{App|refind-btrfs|{{Pkg|snap-pac}} がスナップショットを作成した後に [[rEFInd]] にエントリを追加します。|https://github.com/Venom1991/refind-btrfs|{{AUR|refind-btrfs}}}}
  +
* {{App|snp|任意のシェルコマンドの実行前後に snapper でスナップショットを取るラッパー (例:{{ic|snp pacman -Syu}})|https://gist.github.com/erikw/5229436|{{AUR|snp}}}}
   
  +
==== 読み取り専用スナップショットでの起動 ====
== Tips and Tricks ==
 
===pacman による事前事後のスナップショット===
 
Snapper では事前または事後の"タグ付き"のスナップショットを作成できます。システムアップグレードを行ったようなときに便利です。{{ic|<nowiki>NUMBER_CLEANUP="yes"</nowiki>}} を使うことで、クリーンアップアルゴリズムによって設定したスナップショットの数までスナップショットを消去できます。詳しくは {{ic|man snapper}} や {{ic|man snapper-configs}} を見て下さい。
 
   
  +
{{Pkg|grub-btrfs}} または {{AUR|snap-pac-grub}} に依存しているユーザーは、デフォルトでは Snapper のスナップショットは読み取り専用であり、読み取り専用スナップショットを起動する際に固有の困難があることに注意する必要があります。デスクトップマネージャーなどの多くのサービスは書き込み可能な {{ic|/var}} ディレクトリを必要とするため、読み取り専用スナップショットから起動すると起動に失敗します。
この機能を pacman で使うには、ラッパースクリプトが必要になります。ユーザー [https://aur.archlinux.org/account/erikw/ erikw] が [https://gist.github.com/erikw/5229436 snp] という名前のスクリプトを作成しています。
 
   
  +
これを回避するには、スナップショットを書き込み可能にするか、overlayfs を使用してスナップショットを起動する開発者承認の方法を使用して、スナップショットをライブ CD 環境と同様に動作させます。
スクリプトをダウンロードして {{ic|$PATH}} のどこか (例: {{ic|/usr/local/bin/}}) に配置して、実行可能属性を付与してください。使用例:
 
# snp pacman -Syu
 
   
  +
{{Note|ファイルシステムは RAM 内にのみ存在するため、このスナップショット内のファイルに加えた変更は保存されません。}}
良ければ、[[Pacman ヒント#ショートカット|pacman のエイリアス]]のように、[[Bash#エイリアス|エイリアス]]を作成することができます:
 
alias sysupgrade='sudo snp pacman -Syu'
 
   
エイリアス作ったら、次のコマンドで事前事後のスナップショットを作成してシステムアップグレドを行うことが可能です:
+
overlayfs 使用してスナップショットをるには:
$ sysupgrade
 
   
  +
* {{Pkg|grub-btrfs}} がシステムにインストールされていることを確認してください。
===事前事後のスナップショットでアップグレードをラッピング===
 
  +
* {{ic|/etc/mkinitcpio.conf}} の {{ic|HOOKS}} 配列の最後に {{ic|grub-btrfs-overlayfs}} を追加します: 例えば {{bc|1=# HOOKS=(base udev autodetect modconf kms keyboard keymap consolefont block filesystems fsck grub-btrfs-overlayfs)}}
{{AUR|Pacupg}}, a script written by user [https://aur.archlinux.org/account/crossroads1112/ crossroads1112] is specifically designed to wrap a system upgrade in snapshots. In contrast with the above solution, it downloads the packages first ({{ic|pacman -Syuw}}) and then only wraps the upgrade ({{ic|pacman -Su}}) in snapshots so as to keep the differences between the pre and post snapshots to a minimum. It also detects if the user's {{ic|/boot}} directory is on a separate partition and automatically makes a copy of it when it detects an upgrade to the Linux kernel. Additionally, it will avoid taking snapshots if there is nothing to upgrade and log all upgraded packages (with changed version numbers) to {{ic|/var/local/log/pacupg}}. If {{AUR|pacaur}} is installed, the script can also upgrade AUR packages. It builds them first, then takes a snapshot when they are ready to be installed thus keeping the pre-post snapshot differences minimal. As with regular packages, it logs all upgraded packages and will avoid taking snapshots if no packages are available to upgrade. The script now integrates with {{AUR|grub-btrfs-git}}. If it is installed, {{ic|pacupg}} will automatically regenerate your grub.cfg after every upgrade to include your snapshots as boot options.
 
  +
* initramfs を再生成します: {{bc|# mkinitcpio -P}}
   
  +
参考文献:
====ロールバック操作を楽にする====
 
   
  +
* [https://github.com/Antynea/grub-btrfs/blob/master/initramfs/readme.md grub-btrfs README] ({{Pkg|mkinitcpio}} の代わりに {{Pkg|dracut}} を使用する人のための手順が含まれています)
{{AUR|pacupg}} スクリプトではスナップショットのロールバックも簡単にできます。{{ic|pacupg -r}} を実行するとメニューが表示され、事前事後のスナップショット (アップグレード) や単一のスナップショット (タイムラインスナップショット) をロールバックすることが可能です。
 
  +
* [https://github.com/Antynea/grub-btrfs/issues/92 Discussion on Github]
   
  +
==== pacman トランザクションで非 Btrfs ブートパーティションをバックアップする ====
===推奨ファイルシステムレイアウト===
 
subvolid=0
 
|
 
├── subvol_root
 
| |
 
| ├── /usr
 
| |
 
| ├── /bin
 
| |
 
| ├── /.snapshots
 
| |
 
| ├── ...
 
|
 
├── subvol_snapshots
 
|
 
└── subvol_...
 
   
  +
もし {{ic|/boot}} パーティションが Btrfs 以外のファイルシステム ([[ESP]] など) にある場合、スナップショットによるバックアップはできません。カーネルアップデート時にブートパーティションを自動的に Btrfs root にフックでコピーするには、[[システムバックアップ#スナップショットと/bootパーティション]] を参照してください。これは {{Pkg|snap-pac}} とも相性が良いです。
Where /.snapshots is a mountpoint for subvol_snapshots, and subvol_... is any number of subvolumes - one for every directory that you:
 
*Do NOT wish for snapper to backup
 
*Do NOT wish to lose the contents of when you restore an entire system from a snapshot
 
   
  +
=== 外部ドライブへの増分バックアップ ===
This layout allows the snapper utility to take regular system snapshots, while at the same time making it easy to restore the entire system from an Arch Live CD if it becomes unbootable.
 
   
  +
一部のツールでは、snapper を使用してバックアップを自動化できます。[[Btrfs#外付けドライブへの増分バックアップ]] を参照してください。
In this sceneario, after the initial setup, snapper needs no changes, and will work as expected.
 
   
  +
=== 推奨ファイルシステムレイアウト ===
====Snapper の設定====
 
   
  +
{{Note|1=以下のレイアウトは '''{{ic|snapper rollback}} を使用することは想定していません'''が、[[#/ を @ のスナップショットに復元|/ を @ のスナップショットに復元]]した時の問題を軽減します。[https://bbs.archlinux.org/viewtopic.php?id=194491 フォーラムスレッド] を参照してください。}}
以下の行を {{ic|/etc/fstab}} に追加してください:
 
{{bc|<nowiki>
 
UUID=... /.snapshots btrfs ...,subvol=subvol_snapshots 0 0
 
</nowiki>}}
 
   
  +
以下は {{ic|/}} を簡単に復元できるようにするための推奨ファイルシステムレイアウトです。
上記の設定で、snapper が作成したスナップショットは全て subvol_root サブボリュームの外に保存され、snapper のスナップショットを消すことなくいつでも簡単に subvol_root を置き換えることができるようになります。
 
   
  +
{| class="wikitable"
Now, because snapper does not like /.snapshots to already exist when you run {{ic|snapper -c root create-config /}}, do this:
 
  +
|+ ファイルシステムレイアウト
  +
! サブボリューム !! マウントポイント
  +
|-
  +
| @ || /
  +
|-
  +
| @home || /home
  +
|-
  +
| @snapshots || /.snapshots
  +
|-
  +
| @var_log || /var/log
  +
|}
   
  +
subvolid=5
Make sure /.snapshots does NOT exist
 
  +
|
  +
├── @ -|
  +
| 含まれるディレクトリ:
  +
| ├── /usr
  +
| ├── /bin
  +
| ├── /.snapshots
  +
| ├── ...
  +
|
  +
├── @home
  +
├── @snapshots
  +
├── @var_log
  +
└── @...
   
  +
{{ic|/.snapshots}} は {{ic|@snapshots}} のマウントポイントです。{{ic|@...}} は {{ic|/}} にマウントするサブボリューム ({{ic|@}}) とは別に保存したいサブボリュームになります。{{ic|/}} のスナップショットを作成するとき、他のサブボリュームはスナップショットに含まれません。ただし、別の snapper 設定を作成することで他のサブボリュームもスナップショットで記録できます。システムを {{ic|/}} のスナップショットの時点まで戻したいと思ったときに、他のサブボリュームには影響が及びません。
Create snapper config:
 
{{bc|<nowiki>
 
# snapper -c root create-config /
 
</nowiki>}}
 
Now that snapper is happy, delete /.snapshots subvolume:
 
{{bc|<nowiki>
 
# btrfs subvolume delete /.snapshots
 
</nowiki>}}
 
Create the /.snapshots folder to use as a mountpoint:
 
{{bc|<nowiki>
 
# mkdir /.snapshots
 
# chmod 750 /.snapshots
 
</nowiki>}}
 
Mount subvol_snapshots at /.snapshots
 
{{bc|<nowiki>
 
# mount /.snapshots
 
</nowiki>}}
 
{{note|Since /.snapshots will be in your /etc/fstab at this point, you do not need to specify the device}}
 
   
  +
例えば、{{ic|/}} をスナップショット時に戻したいが {{ic|/home}} は最新の状態のままにしたい場合、サブボリュームを作成して {{ic|/home}} にマウントしてください。詳しくは [[Btrfs#サブボリュームをマウントする]]を参照。
====システム全体のリストア====
 
   
  +
上記のレイアウトは snapper ユーティリティで定期的に {{ic|/}} のスナップショットが作成できるのと同時に、起動できなくなった場合に Arch のライブ CD から {{ic|/}} を簡単に復元することができます。
If you ever want to restore your entire system using one of snapper's snapshots, follow this procedure:
 
   
  +
その場合、初期設定をしたら snapper に特別な設定をする必要はありません。
Boot Arch live CD
 
   
  +
{{Note|
Mount btrfs device (subvolid=0):
 
  +
* サブボリュームが {{ic|@}} 下に入れ子になっていても、{{ic|/}} のスナップショットには含まれません。{{ic|/}} にマウントしているサブボリュームのスナップショットを保存したい場合は snapper でサブボリュームの設定を行ってください。
{{bc|<nowiki>
 
  +
* [[Btrfs#スワップファイル|Btrfs の制限]]により、スナップショットされたボリュームは[[スワップ#スワップファイル|スワップファイル]]を含むことができません。スワップファイルを別のサブボリュームに置くか、[[スワップ#スワップパーティション|スワップパーティション]]を作成してください。
# mount /dev/sdX /mnt
 
  +
}}
</nowiki>}}
 
   
  +
システムを {{ic|@}} の以前のスナップショットに復元した場合、これらの他のサブボリュームは影響を受けません。たとえば、これにより、サブボリュームが {{ic|/home}} にマウントされているため、{{ic|/home}} を変更せずに、{{ic|@}} を以前のスナップショットに復元できます。
Find the snapshot you want to recover:
 
{{bc|<nowiki>
 
# vi /mnt/subvol_snapshots/*/info.xml
 
</nowiki>}}
 
{{note|Here, you can read the {{ic|<description>}} tag and the {{ic|<date>}} tag, and when you find it, remember the {{ic|<num>}} number}}
 
{{note|In vi, use {{ic|:n}} to see the next file, {{ic|:rew}} to go back to the first file, and {{ic|:q}} to quit}}
 
   
  +
このレイアウトにより、snapper ユーティリティは {{ic|/}} の定期的なスナップショットを取得できると同時に、Arch Live CD が起動できなくなった場合に、Arch Live CD から {{ic|/}} を簡単に復元できます。
Delete or move the root subvolume:
 
{{bc|<nowiki>
 
# mv /mnt/subvol_root /mnt/subvol_root.broken
 
</nowiki>}}
 
{{note|If you want to delete it instead, remember to use {{ic|btrfs subvol delete subvol_root}} since subvolumes can't be deleted with rm like folders can}}
 
   
  +
このシナリオでは、初期セットアップの後、snapper は変更を必要とせず、期待どおりに動作します。
Create a read-write snapshot of the read-only snapshot snapper took:
 
{{bc|<nowiki>
 
# btrfs subvol snapshot /mnt/subvol_snapshots/#/snapshot /mnt/subvol_root
 
</nowiki>}}
 
{{note|Where {{ic|#}} is the number of the snapper snapshot you found earlier using vi}}
 
   
  +
{{Tip|
Unmount the btrfs device and reboot:
 
  +
* @ サブボリュームのスナップショットやロールバックに含めたくないデータを含む他のディレクトリー {{ic|/var/cache}}、{{ic|/var/spool}}、{{ic|/var/tmp}}、{{ic|/var/lib/machines}}、([[systemd-nspawn]]), {{ic|/var/lib/docker}}。([[Docker]])、{{ic|/var/lib/postgres}}([[PostgreSQL]])、そして {{ic|/var/lib/}} の下にある他のデータディレクトリです。''フラット'' レイアウトに従うか、ネストしたサブボリュームを作成するかはあなた次第です。一方、{{ic|/var/lib/pacman}} の pacman データベースはルートサブボリューム ({{ic|@}}) に置かなければなりません。
{{bc|<nowiki>
 
  +
* Snapper を {{ic|@home}} と他のサブボリュームで実行し、データのスナップショットとロールバック機能を別々に持つことができます。
# umount /mnt
 
  +
}}
# reboot
 
</nowiki>}}
 
   
  +
==== snapper の設定とマウントポイント ====
For a more detailed description of the problem this layout solves, see: https://bbs.archlinux.org/viewtopic.php?id=194491
 
   
  +
{{ic|/.snapshots}} がマウントされていないこと、フォルダとして存在しないことを確認してください:
== トラブルシューティング ==
 
  +
# umount /.snapshots
===Snapper のログ===
 
  +
# rm -r /.snapshots
Snapper は全ての活動を {{ic|/var/log/snapper.log}} に書き出します。何か問題が発生しているように感じたら真っ先にこのファイルをチェックしてください。
 
   
  +
それから {{ic|/}} の[[#新しい設定の作成|新しい設定を作成]]します。
毎時・毎日・毎週のスナップショットに問題がある場合、おそらく cronie サービス (もしくはその他の cron デーモン) が動いていなかったのが原因だということが多くあります。
 
   
  +
そして {{ic|@snapshots}} を {{ic|/.snapshots}} に[[マウント]]してください。例えば、ファイルシステムが {{ic|/dev/sda1}} に存在する場合:
===IO Error===
 
  +
# mount -o subvol=@snapshots /dev/sda1 /.snapshots
スナップショットを作成しようとすると 'IO Error' が表示される場合、スナップショットを作成しようとしたサブボリュームと関連付けられている [https://bbs.archlinux.org/viewtopic.php?id=164404 .snapshots] ディレクトリもサブボリュームになっていることを確認してください。
 
  +
マウントを永続化させるには、[[fstab]] にエントリを作成します。
   
  +
もしくは fstab エントリが既に存在する場合、スナップショットのサブボリュームを再マウントします:
== 注意事項 ==
 
  +
# mount -a
  +
  +
フォルダには {{ic|750}} の[[ファイルのパーミッションと属性#数字を使う方法|パーミッション]]を設定してください。
  +
  +
snapper が作成するスナップショットは全て {{ic|@}} サブボリュームの外に保存されるため、snapper のスナップショットを削除しなくても {{ic|@}} を簡単に置き換えることができます。
  +
  +
==== {{ic|/}} を {{ic|@}} のスナップショットに復元 ====
  +
  +
snapper のスナップショットを使って {{ic|/}} をリストアしたくなったら、まずは Arch Linux のライブ USB/CD を起動します。
  +
  +
トップレベルのサブボリューム (subvolid=5) を[[マウント]]してください。{{ic|subvolid}} マウントフラグは省略します。''/dev/sda2'' をマウントする例:
  +
  +
# mount -o subvolid=5 ''/dev/sda2'' /mnt
  +
  +
{{ic|/mnt/@snapshots/*/info.xml}} から復元したいスナップショットを確認します:
  +
{{Tip|{{ic|less}} を使ってファイルを確認できます:
  +
# cat /mnt/@snapshots/*/info.xml {{!}} less
  +
次のページを見たいときは {{ic|space}} を、終了するときは {{ic|q}} を使用します。}}
  +
  +
{{ic|<description>}} タグと {{ic|<date>}} タグを見て、リストアしたいスナップショットが確認できたら、{{ic|<num>}} の番号をメモしてください。
  +
  +
そして {{ic|@}} を他の場所 (例: {{ic|/@.broken}}) にして現在のシステムのコピーを保存します。もしくは {{ic|btrfs subvolume delete}} で {{ic|@}} を削除します。
  +
  +
読み取り専用のスナップショットから読み書き可能なスナップショットを作成:
  +
  +
# btrfs subvol snapshot /mnt/@snapshots/''#''/snapshot /mnt/@
  +
  +
{{ic|''#''}} は復元したい snapper のスナップショットの番号に置き換えてください。これで {{ic|/}} は前の状態に戻ります。再起動してください。
  +
  +
==== スナップショットからのファイルの削除 ====
  +
  +
スナップショット自体を削除せずに、過去のスナップショットから特定のファイルまたはフォルダーを削除したい場合、{{AUR|snappers}} は、この機能を Snapper に追加するスクリプトです。このスクリプトは、Snapper が現在サポートしていない他のさまざまな方法で過去のスナップショットを操作するために使用することもできます。
  +
  +
追加のスクリプトを使用せずにファイルを削除したい場合は、[https://unix.stackexchange.com/a/149933 スナップショットのサブボリュームを読み書き可能にする] だけで済みます。次のように実行します:
  +
  +
# btrfs property set /path/to/.snapshots/<snapshot_num>/snapshot ro false
  +
  +
{{ic|1=ro=false}} であることを確認します:
  +
  +
# btrfs property get /path/to/.snapshots/<snapshot_num>/snapshot
  +
ro=false
  +
  +
通常どおり、{{ic|/path/to/.snapshots/<snapshot_num>/snapshot}} 内のファイルを変更できるようになりました。シェルループを使用して、スナップショットを一括で処理できます。
  +
  +
===スナップショットからファイルを削除===
  +
  +
過去のスナップショットから特定のファイルやフォルダを削除したい場合、[https://pypi.python.org/pypi/snapperS snapperS] というスクリプトが存在します。
  +
  +
スクリプトを使わずにファイルを削除したい場合、以下のコマンドを実行して [https://unix.stackexchange.com/a/149933/3587 スナップショットのサブボリュームを読み書き可能] にする必要があります:
  +
  +
# btrfs property set /path/to/.snapshots/<snapshot_num>/snapshot ro false
  +
  +
{{ic|1=ro=false}} となっていることを確認:
  +
  +
{{hc|# btrfs property get /path/to/.snapshots/<snapshot_num>/snapshot|2=ro=false}}
  +
  +
これで {{ic|/path/to/.snapshots/<snapshot_num>/snapshot}} のファイルは通常通りに編集することが可能になります。
  +
  +
=== 速度低下の防止 ===
   
=== root ファイルシステムのスナップショット ===
 
 
頻繁に変更が加わるファイルシステム (例えば多数のシステムアップデートが行われる {{ic|/}} など) で長期間にわたって頻繁にスナップショットを取得すると動作がかなり遅くなることがあります。以下のようにすることで遅くなるのを回避できます:
 
頻繁に変更が加わるファイルシステム (例えば多数のシステムアップデートが行われる {{ic|/}} など) で長期間にわたって頻繁にスナップショットを取得すると動作がかなり遅くなることがあります。以下のようにすることで遅くなるのを回避できます:
* スナップショットする価値がないもの、{{ic|/var/cache/pacman/pkg}} {{ic|/var/abs}} などサブボリュームを作成する。
+
* スナップショットを作成する価値がない {{ic|/var/cache/pacman/pkg}}, {{ic|/var/abs}}, {{ic|/var/tmp}}, {{ic|/srv}} などサブボリュームを[[Btrfs#サブボリュームを作成する|作成]]する。
* [[#自動タイムラインスナップショット]] を使う場合に、毎時・毎日・毎周・毎年のスナップショットのデフォルト設定を変更する。
+
* [[#自動タイムラインスナップショット|自動タイムラインスナップショット]]を使う場合に、毎時・毎日・毎周・毎年のスナップショットのデフォルト設定を変更する。
  +
  +
==== updatedb ====
   
=== updatedb ===
 
 
デフォルトでは、{{ic|updatedb}} は snapper によって作成された {{ic|.snapshots}} ディレクトリのインデックスも作成してしまい、スナップショットが大量にある場合、深刻な遅延が発生したりメモリが異常に消費される原因になります。以下のように設定ファイルを編集することでインデックスを作成しないように {{ic|updatedb}} を設定できます:
 
デフォルトでは、{{ic|updatedb}} は snapper によって作成された {{ic|.snapshots}} ディレクトリのインデックスも作成してしまい、スナップショットが大量にある場合、深刻な遅延が発生したりメモリが異常に消費される原因になります。以下のように設定ファイルを編集することでインデックスを作成しないように {{ic|updatedb}} を設定できます:
 
{{hc|/etc/updatedb.conf|2=PRUNENAMES = ".snapshots"}}
 
{{hc|/etc/updatedb.conf|2=PRUNENAMES = ".snapshots"}}
  +
  +
==== quota グループを無効にする ====
  +
  +
quota グループが原因で大幅な速度低下が発生するという報告があります。たとえば、{{ic|snapper ls}} が結果を返すまでに何分もかかる場合、こちら [https://www.reddit.com/r/btrfs/comments/fmucrq/btrfs_snapshots_make_entire_system_lag_cpu_usage/] を参照してください。
  +
  +
quota グループが有効かどうかを確認するには、次のコマンドを使用します:
  +
  +
# btrfs qgroup show /
  +
  +
その後、次のコマンドを使用して quota グループを無効にできます:
  +
  +
# btrfs quota disable /
  +
  +
==== スナップショットの数を数える ====
  +
  +
quota グループを無効にしても速度低下が改善されない場合は、スナップショットの数をカウントすると役立つ場合があります。次のように実行します:
  +
  +
# btrfs subvolume list -s / | wc -l
  +
  +
=== ユーザーデータとログ用のサブボリュームを作成する ===
  +
  +
ディレクトリに電子メールやログなどのユーザーデータが含まれている場合は、ルートサブボリューム {{ic|/}} ではなく、独自のサブボリュームにディレクトリを保存することをお勧めします。そうすることで、{{ic|/}} のスナップショットが復元された場合、ユーザーデータとログも以前の状態に戻されなくなります。ユーザーデータ用にスナップショットの別のタイムラインを維持できます。{{ic|/var/log}} にログのスナップショットを作成することはお勧めできません。これにより、トラブルシューティングが容易になります。
  +
  +
[[Snapper#フィルター設定]] を使用して、復元中にディレクトリをスキップすることもできます。
  +
  +
こちらも参照して下さい [https://documentation.suse.com/sles/12-SP4/html/SLES-all/cha-snapper.html#snapper-dir-excludes Directories That Are Excluded from Snapshots] SLES ドキュメントに記載されています。
  +
  +
== トラブルシューティング ==
  +
  +
=== Snapper のログ ===
  +
  +
Snapper は全ての活動を {{ic|/var/log/snapper.log}} に書き出します。何か問題が発生しているように感じたら真っ先にこのファイルをチェックしてください。
  +
  +
毎時・毎日・毎週のスナップショットに問題がある場合、おそらく cronie サービス (もしくはその他の cron デーモン) が動いていなかったのが原因だということが多くあります。
  +
  +
=== IO エラー ===
  +
  +
スナップショットを作成しようとすると IO エラーが表示される場合、スナップショットを作成しようとしたサブボリュームと関連付けられている [https://bbs.archlinux.org/viewtopic.php?id=164404 .snapshots] ディレクトリもサブボリュームになっていることを確認してください。
  +
  +
また、{{ic|.snapshots}} の所有者が root になっていない可能性もあります ({{ic|/var/log/snapper.log}} に {{ic|Btrfs.cc(openInfosDir):219 - .snapshots must have owner root}} というエラーが出力されます)。
  +
  +
=== 孤立したスナップショットによりディスク領域が無駄になる ===
  +
  +
スナップショットが '失われる' 可能性があり、スナップショットはディスク上にまだ存在しますが、スナッパーによって追跡されません。これにより、大量の無駄なディスク領域が発生する可能性があります。これを確認するには、次の出力を比較します。
  +
  +
# snapper -c <config> list
  +
  +
# btrfs subvolume list -o <parent subvolume>/.snapshots
  +
  +
最初のリストに存在しない 2 番目のリストのサブボリュームは孤立しており、手動で [[Btrfs#サブボリュームの削除|削除]] することができます。
  +
  +
== 参照 ==
  +
* [http://snapper.io/ Snapper ホームページ]
  +
* [https://en.opensuse.org/Portal:Snapper openSUSE Snapper ポータル]
  +
* [https://btrfs.wiki.kernel.org/index.php/Main_Page Btrfs ホームページ]
  +
* [https://www.linux.com/news/enterprise/systems-management/878490-snapper-suses-ultimate-btrfs-snapshot-manager/ Linux.com: Snapper: SUSE's Ultimate Btrfs Snapshot Manager]

2024年1月6日 (土) 01:54時点における最新版

関連記事

Snapper は openSUSE の Arvin Schnell によって作られた、Btrfs のサブボリュームと LVM のボリュームのスナップショットの管理を助けるツールです。スナップショットを作成して比較したり、前のスナップショットに戻したり、自動スナップショットが行えます。

目次

インストール

安定版は snapper パッケージからインストールできます。開発版は snapper-gitAUR パッケージで利用可能です。

GUI は snapper-gui-gitAUR パッケージでインストールすることができます。

新しい設定の作成

Btrfs サブボリュームで Snapper の設定を作成する前に、あらかじめサブボリュームが作成されている必要があります。サブボリュームが存在しない場合、Snapper の設定をするまえにサブボリュームを作成してください。

Btrfs サブボリュームが /path/to/subvolume に存在していて、config という名前で新しく Snapper の設定を作るには:

# snapper -c config create-config /path/to/subvolume

上記のコマンドを実行すると:

  • /etc/snapper/config-templates にあるデフォルトのテンプレートに基づいて /etc/snapper/configs/config に設定ファイルが作成されます。
  • /path/to/subvolume/.snapshots にサブボリュームが作成されてスナップショットが保存されます。スナップショットのパスは /path/to/subvolume/.snapshots/#/snapshot になります (# はスナップショット番号です)。
  • /etc/conf.d/snapperSNAPPER_CONFIGSconfig が追加されます。

例えば、/ にマウントされたサブボリュームの設定ファイルを作成する場合:

# snapper -c root create-config /

この時点で、設定は有効になっています。cron デーモンが動作している場合、snapper は自動タイムラインスナップショットを作成します。cron デーモンを使っていない場合、systemd サービスとタイマーを使用する必要があります。#有効化/無効化を見てください。

設定について詳しくは snapper-configsman ページを参照。

スナップショットの作成

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

Snapper では毎時・毎日・毎月・毎年に保存するスナップショットの数を設定できるスナップショットタイムラインを作成することができます。デフォルトでは1時間毎にスナップショットが取得されます。そして1日1回、タイムラインのクリーンアップアルゴリズムによって"古くなって要らなくなった"スナップショットを削除します。

有効化/無効化

cron デーモンが動作している場合、自動タイムラインスナップショットは自動的に起動します。無効化するには、サブボリュームに存在する設定ファイルを編集して以下を設定してください:

TIMELINE_CREATE="no"

cron デーモンを使っていない場合、パッケージに含まれている systemd ユニットを使うことができます。snapper-timeline.timer起動有効化することで自動タイムラインスナップショットが開始されます。さらに、snapper-cleanup.timer起動有効化すると定期的に古いスナップショットが消去されます。

ノート: cron デーモンと有効化された systemd ユニットがともに動作すると、重複したスナップショットが作成される結果になる場合があります。systemd ユニットを使いつつ cron 側を無効にできるかもしれない一つの手法に、pacmanNoExtract および NoUpgrade を使い、snapper のパッケージの cron ファイルをインストールしない方法があります。[1] を見てください。

スナップショットのリミットの設定

デフォルト設定では、毎時間10個、毎日10個、毎月10個、毎年10個のスナップショットが保存されます。/ など頻繁にサブボリュームに変更を加える場合は、この設定を変更したほうが良いでしょう。#ドライブの負担を抑えるを見て下さい。

以下は、5時間、毎日7個のスナップショットだけを維持して、毎月・毎年は保存しない設定の例です:

/etc/snapper/configs/config
TIMELINE_MIN_AGE="1800"
TIMELINE_LIMIT_HOURLY="5"
TIMELINE_LIMIT_DAILY="7"
TIMELINE_LIMIT_WEEKLY="0"
TIMELINE_LIMIT_MONTHLY="0"
TIMELINE_LIMIT_YEARLY="0"

スナップショットとクリーンアップの頻度を変更する

systemd タイマーを使っている場合、タイマーを編集してスナップショットの頻度を変更できます。

例えば、snapper-timeline.timer を編集して以下のようにすることで5分毎にスナップショットが作成されます:

[Timer]
OnCalendar=
OnCalendar=*:0/5
ノート: 設定パラメータ TIMELINE_LIMIT_HOURLY は上記の設定に関連付けられています。上の例では5分毎にスナップショットが作成されるようになります。

snapper-cleanup.timer を編集するときは OnUnitActiveSec を変更してください。1時間毎に古いスナップショットを消去するには、以下を追加:

[Timer]
OnUnitActiveSec=1h

詳しくは Systemd/タイマーSystemd#ドロップインファイルを参照。

手動スナップショット

シンプルなスナップショット

デフォルトでは Snapper は他のスナップショットと特別な関係を持たない、単純なスナップショットを作成します。

手動でサブボリュームのスナップショットを作成するには、以下のコマンドを実行:

# snapper -c config create --description desc

上記のコマンドはクリーンアップアルゴリズムを使用しないため、スナップショットは明示的に削除するまでずっと残り続けます。

クリーンアップアルゴリズムを設定するには create の後に -c フラグを使用して number, timeline, pre, post のどれかを選択してください。number は設定ファイルで指定された番号にあわせて定期的にスナップショットを削除します。例えば、number アルゴリズムを使用するスナップショットを作成するには:

# snapper -c config create -c number

timeline スナップショットについては自動タイムラインスナップショットを、prepost については事前事後のスナップショットを見てください。

事前事後のスナップショット

シンプルなスナップショットだけでなく、Snapper では事前事後のスナップショットを作成できます。事前 (pre) スナップショットには必ず対応する事後 (post) スナップショットが存在します。このペアによってシステムに変更を加える前後のスナップショットを作成することができます。

事前事後のスナップショットを作成するには、まず事前スナップショットを作成:

# snapper -c config create -t pre -p

上記のコマンドでスナップショット番号が出力されます。

それからシステムに何らかの変更を加えます (例えば新しいプログラムをインストールしたり、ソフトウェアをアップグレードするなど)。

次に事後のスナップショットを作成:

# snapper -c config create -t post --pre-number #

# は事前スナップショットの番号に置き換えてください。

create--command フラグを指定して、コマンドをラップすることもできます:

# snapper -c config create --command cmd

cmd は事前事後のスナップショットを作成する間に実行したいコマンドに置き換えてください。

pacman のトランザクションをスナップショットで記録も見てください。

起動時にスナップショットを作成

snapper で root 設定のスナップショットを作成するには snapper-boot.timer有効化してください。

スナップショットの確認

作成されたスナップショットを確認するには:

# snapper -c config list

設定の確認

全ての設定を確認するには:

# snapper list-configs

スナップショットの削除

スナップショット番号 # を削除するには:

# snapper -c config delete #

一度に複数のスナップショットを削除できます。例えば、root 設定の65と70のスナップショットを削除するには:

# snapper -c root delete 65 70
ノート: 事前スナップショットを削除した場合、事後スナップショットも一緒に削除してください。逆も然りです。

root 以外のユーザーでアクセス

設定は root ユーザーによって作成され、デフォルトでは、root だけが設定を確認したり変更できます。

特定のユーザーからもスナップショットを確認できるようにしたいときは、/etc/snapper/configs/config ファイルの ALLOW_USERS の値を変更してください。そうすれば通常ユーザーでも snapper -c configlist を実行できるようになります。

さらに、ユーザーを使って .snapshots ディレクトリを閲覧できるようにしたい、それでいてディレクトリの所有者は root のままにしておきたいということが考えられます。そのような場合、使用したいユーザーが属しているグループに、グループ所有者を変更してください。例えば users を使う場合:

# chmod a+rx .snapshots
# chown :users .snapshots

ヒントとテクニック

pacman のトランザクションをスナップショットで記録

pacman の操作時にスナップショットを自動的に作成するために使用されるパッケージがいくつかあります:

https://github.com/wesbarnett/snap-pac || snap-pac
  • grub-btrfs — (grub-btrfsd) デーモンが含まれており、systemctl を使って有効にすることで新しいスナップショットを探し、それらを自動的に GRUB メニューに含めます。
https://github.com/Antynea/grub-btrfs || grub-btrfs
https://github.com/maximbaz/snap-pac-grub || snap-pac-grubAUR
  • refind-btrfssnap-pac がスナップショットを作成した後に rEFInd にエントリを追加します。
https://github.com/Venom1991/refind-btrfs || refind-btrfsAUR
  • snp — 任意のシェルコマンドの実行前後に snapper でスナップショットを取るラッパー (例:snp pacman -Syu)
https://gist.github.com/erikw/5229436 || snpAUR

読み取り専用スナップショットでの起動

grub-btrfs または snap-pac-grubAUR に依存しているユーザーは、デフォルトでは Snapper のスナップショットは読み取り専用であり、読み取り専用スナップショットを起動する際に固有の困難があることに注意する必要があります。デスクトップマネージャーなどの多くのサービスは書き込み可能な /var ディレクトリを必要とするため、読み取り専用スナップショットから起動すると起動に失敗します。

これを回避するには、スナップショットを書き込み可能にするか、overlayfs を使用してスナップショットを起動する開発者承認の方法を使用して、スナップショットをライブ CD 環境と同様に動作させます。

ノート: ファイルシステムは RAM 内にのみ存在するため、このスナップショット内のファイルに加えた変更は保存されません。

overlayfs を使用してスナップショットをブートするには:

  • grub-btrfs がシステムにインストールされていることを確認してください。
  • /etc/mkinitcpio.confHOOKS 配列の最後に grub-btrfs-overlayfs を追加します: 例えば
    # HOOKS=(base udev autodetect modconf kms keyboard keymap consolefont block filesystems fsck grub-btrfs-overlayfs)
  • initramfs を再生成します:
    # mkinitcpio -P

参考文献:

pacman トランザクションで非 Btrfs ブートパーティションをバックアップする

もし /boot パーティションが Btrfs 以外のファイルシステム (ESP など) にある場合、スナップショットによるバックアップはできません。カーネルアップデート時にブートパーティションを自動的に Btrfs root にフックでコピーするには、システムバックアップ#スナップショットと/bootパーティション を参照してください。これは snap-pac とも相性が良いです。

外部ドライブへの増分バックアップ

一部のツールでは、snapper を使用してバックアップを自動化できます。Btrfs#外付けドライブへの増分バックアップ を参照してください。

推奨ファイルシステムレイアウト

ノート: 以下のレイアウトは snapper rollback を使用することは想定していませんが、/ を @ のスナップショットに復元した時の問題を軽減します。フォーラムスレッド を参照してください。

以下は / を簡単に復元できるようにするための推奨ファイルシステムレイアウトです。

ファイルシステムレイアウト
サブボリューム マウントポイント
@ /
@home /home
@snapshots /.snapshots
@var_log /var/log
subvolid=5
  |
  ├── @ -|
  |     含まれるディレクトリ:
  |       ├── /usr
  |       ├── /bin
  |       ├── /.snapshots
  |       ├── ...
  |
  ├── @home
  ├── @snapshots
  ├── @var_log
  └── @...

/.snapshots@snapshots のマウントポイントです。@.../ にマウントするサブボリューム (@) とは別に保存したいサブボリュームになります。/ のスナップショットを作成するとき、他のサブボリュームはスナップショットに含まれません。ただし、別の snapper 設定を作成することで他のサブボリュームもスナップショットで記録できます。システムを / のスナップショットの時点まで戻したいと思ったときに、他のサブボリュームには影響が及びません。

例えば、/ をスナップショット時に戻したいが /home は最新の状態のままにしたい場合、サブボリュームを作成して /home にマウントしてください。詳しくは Btrfs#サブボリュームをマウントするを参照。

上記のレイアウトは snapper ユーティリティで定期的に / のスナップショットが作成できるのと同時に、起動できなくなった場合に Arch のライブ CD から / を簡単に復元することができます。

その場合、初期設定をしたら snapper に特別な設定をする必要はありません。

ノート:
  • サブボリュームが @ 下に入れ子になっていても、/ のスナップショットには含まれません。/ にマウントしているサブボリュームのスナップショットを保存したい場合は snapper でサブボリュームの設定を行ってください。
  • Btrfs の制限により、スナップショットされたボリュームはスワップファイルを含むことができません。スワップファイルを別のサブボリュームに置くか、スワップパーティションを作成してください。

システムを @ の以前のスナップショットに復元した場合、これらの他のサブボリュームは影響を受けません。たとえば、これにより、サブボリュームが /home にマウントされているため、/home を変更せずに、@ を以前のスナップショットに復元できます。

このレイアウトにより、snapper ユーティリティは / の定期的なスナップショットを取得できると同時に、Arch Live CD が起動できなくなった場合に、Arch Live CD から / を簡単に復元できます。

このシナリオでは、初期セットアップの後、snapper は変更を必要とせず、期待どおりに動作します。

ヒント:
  • @ サブボリュームのスナップショットやロールバックに含めたくないデータを含む他のディレクトリー /var/cache/var/spool/var/tmp/var/lib/machines、(systemd-nspawn), /var/lib/docker。(Docker)、/var/lib/postgres(PostgreSQL)、そして /var/lib/ の下にある他のデータディレクトリです。フラット レイアウトに従うか、ネストしたサブボリュームを作成するかはあなた次第です。一方、/var/lib/pacman の pacman データベースはルートサブボリューム (@) に置かなければなりません。
  • Snapper を @home と他のサブボリュームで実行し、データのスナップショットとロールバック機能を別々に持つことができます。

snapper の設定とマウントポイント

/.snapshots がマウントされていないこと、フォルダとして存在しないことを確認してください:

# umount /.snapshots
# rm -r /.snapshots

それから /新しい設定を作成します。

そして @snapshots/.snapshotsマウントしてください。例えば、ファイルシステムが /dev/sda1 に存在する場合:

# mount -o subvol=@snapshots /dev/sda1 /.snapshots

マウントを永続化させるには、fstab にエントリを作成します。

もしくは fstab エントリが既に存在する場合、スナップショットのサブボリュームを再マウントします:

# mount -a

フォルダには 750パーミッションを設定してください。

snapper が作成するスナップショットは全て @ サブボリュームの外に保存されるため、snapper のスナップショットを削除しなくても @ を簡単に置き換えることができます。

/@ のスナップショットに復元

snapper のスナップショットを使って / をリストアしたくなったら、まずは Arch Linux のライブ USB/CD を起動します。

トップレベルのサブボリューム (subvolid=5) をマウントしてください。subvolid マウントフラグは省略します。/dev/sda2 をマウントする例:

# mount -o subvolid=5 /dev/sda2 /mnt

/mnt/@snapshots/*/info.xml から復元したいスナップショットを確認します:

ヒント: less を使ってファイルを確認できます:
# cat /mnt/@snapshots/*/info.xml | less
次のページを見たいときは space を、終了するときは q を使用します。

<description> タグと <date> タグを見て、リストアしたいスナップショットが確認できたら、<num> の番号をメモしてください。

そして @ を他の場所 (例: /@.broken) にして現在のシステムのコピーを保存します。もしくは btrfs subvolume delete@ を削除します。

読み取り専用のスナップショットから読み書き可能なスナップショットを作成:

# btrfs subvol snapshot /mnt/@snapshots/#/snapshot /mnt/@

# は復元したい snapper のスナップショットの番号に置き換えてください。これで / は前の状態に戻ります。再起動してください。

スナップショットからのファイルの削除

スナップショット自体を削除せずに、過去のスナップショットから特定のファイルまたはフォルダーを削除したい場合、snappersAUR は、この機能を Snapper に追加するスクリプトです。このスクリプトは、Snapper が現在サポートしていない他のさまざまな方法で過去のスナップショットを操作するために使用することもできます。

追加のスクリプトを使用せずにファイルを削除したい場合は、スナップショットのサブボリュームを読み書き可能にする だけで済みます。次のように実行します:

# btrfs property set /path/to/.snapshots/<snapshot_num>/snapshot ro false

ro=false であることを確認します:

# btrfs property get /path/to/.snapshots/<snapshot_num>/snapshot
ro=false

通常どおり、/path/to/.snapshots/<snapshot_num>/snapshot 内のファイルを変更できるようになりました。シェルループを使用して、スナップショットを一括で処理できます。

スナップショットからファイルを削除

過去のスナップショットから特定のファイルやフォルダを削除したい場合、snapperS というスクリプトが存在します。

スクリプトを使わずにファイルを削除したい場合、以下のコマンドを実行して スナップショットのサブボリュームを読み書き可能 にする必要があります:

# btrfs property set /path/to/.snapshots/<snapshot_num>/snapshot ro false

ro=false となっていることを確認:

# btrfs property get /path/to/.snapshots/<snapshot_num>/snapshot
ro=false

これで /path/to/.snapshots/<snapshot_num>/snapshot のファイルは通常通りに編集することが可能になります。

速度低下の防止

頻繁に変更が加わるファイルシステム (例えば多数のシステムアップデートが行われる / など) で長期間にわたって頻繁にスナップショットを取得すると動作がかなり遅くなることがあります。以下のようにすることで遅くなるのを回避できます:

  • スナップショットを作成する価値がない /var/cache/pacman/pkg, /var/abs, /var/tmp, /srv などのサブボリュームを作成する。
  • 自動タイムラインスナップショットを使う場合に、毎時・毎日・毎周・毎年のスナップショットのデフォルト設定を変更する。

updatedb

デフォルトでは、updatedb は snapper によって作成された .snapshots ディレクトリのインデックスも作成してしまい、スナップショットが大量にある場合、深刻な遅延が発生したりメモリが異常に消費される原因になります。以下のように設定ファイルを編集することでインデックスを作成しないように updatedb を設定できます:

/etc/updatedb.conf
PRUNENAMES = ".snapshots"

quota グループを無効にする

quota グループが原因で大幅な速度低下が発生するという報告があります。たとえば、snapper ls が結果を返すまでに何分もかかる場合、こちら [2] を参照してください。

quota グループが有効かどうかを確認するには、次のコマンドを使用します:

# btrfs qgroup show /

その後、次のコマンドを使用して quota グループを無効にできます:

# btrfs quota disable /

スナップショットの数を数える

quota グループを無効にしても速度低下が改善されない場合は、スナップショットの数をカウントすると役立つ場合があります。次のように実行します:

# btrfs subvolume list -s / | wc -l

ユーザーデータとログ用のサブボリュームを作成する

ディレクトリに電子メールやログなどのユーザーデータが含まれている場合は、ルートサブボリューム / ではなく、独自のサブボリュームにディレクトリを保存することをお勧めします。そうすることで、/ のスナップショットが復元された場合、ユーザーデータとログも以前の状態に戻されなくなります。ユーザーデータ用にスナップショットの別のタイムラインを維持できます。/var/log にログのスナップショットを作成することはお勧めできません。これにより、トラブルシューティングが容易になります。

Snapper#フィルター設定 を使用して、復元中にディレクトリをスキップすることもできます。

こちらも参照して下さい Directories That Are Excluded from Snapshots SLES ドキュメントに記載されています。

トラブルシューティング

Snapper のログ

Snapper は全ての活動を /var/log/snapper.log に書き出します。何か問題が発生しているように感じたら真っ先にこのファイルをチェックしてください。

毎時・毎日・毎週のスナップショットに問題がある場合、おそらく cronie サービス (もしくはその他の cron デーモン) が動いていなかったのが原因だということが多くあります。

IO エラー

スナップショットを作成しようとすると IO エラーが表示される場合、スナップショットを作成しようとしたサブボリュームと関連付けられている .snapshots ディレクトリもサブボリュームになっていることを確認してください。

また、.snapshots の所有者が root になっていない可能性もあります (/var/log/snapper.logBtrfs.cc(openInfosDir):219 - .snapshots must have owner root というエラーが出力されます)。

孤立したスナップショットによりディスク領域が無駄になる

スナップショットが '失われる' 可能性があり、スナップショットはディスク上にまだ存在しますが、スナッパーによって追跡されません。これにより、大量の無駄なディスク領域が発生する可能性があります。これを確認するには、次の出力を比較します。

# snapper -c <config> list
# btrfs subvolume list -o <parent subvolume>/.snapshots 

最初のリストに存在しない 2 番目のリストのサブボリュームは孤立しており、手動で 削除 することができます。

参照