Snapper

提供: ArchWiki
2015年10月22日 (木) 23:24時点におけるKusakata (トーク | 投稿記録)による版 (ページの作成:「Category:ファイルシステム en:Snapper {{Related articles start}} {{Related|Btrfs}} {{Related4|mkinitcpio-btrfs}} {{Related4|Btrfs - Tips and tricks}} {{Rel...」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

関連記事

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

警告: カーネル 3.17 と 3.17-1 では、読み取り専用のスナップショットで Snapper と Btrfs を使用すると 偶に破損が発生 してファイルシステムを再作成しないとスナップショットが削除できなくなることがあります。このバグは 3.17-2 で修正されました。

インストール

安定版の snapper公式リポジトリからインストールできます。

開発版は AURsnapper-gitAUR で利用可能です。

新しい設定の作成

新しい設定を作成するには snapper create-config コマンドを使います。

ノート: 設定を作成するには、まずサブボリュームを作成する必要があります: btrfs subvolume create /my/directory。既存のディレクトリが存在していてはいけません。/ を使う場合、サブボリュームの作成を行う必要はありません。Btrfs をセットアップした際に / は既にサブボリュームになっています。詳しくは Btrfs#サブボリュームを作成する を参照。

/ にマウントされたサブボリュームを使用する例:

# snapper -c root create-config /

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

  • /etc/snapper/config-templates にあるデフォルトのテンプレートに基づいて /etc/snapper/configs/root に設定ファイルが作成されます。
  • サブボリュームのルートにサブボリューム .snapshots が作成されます (上記の例の場合 /.snapshots)。
  • /etc/conf.d/snapperSNAPPER_CONFIGS に "root" が追加されます。

コマンドを実行した時点で、設定は有効になります。cron デーモンを実行している場合、Snapper は1時間ごとにスナップショットを取得するようになります。設定ファイルを確認して保存するスナップショットの数を設定することを推奨します。

ノート: 設定ファイルに記述できる設定の全ては man snapper-configs を見て下さい。

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

Snapper では毎時・毎日・毎月・毎年に保存するスナップショットの数を設定できるスナップショットタイムラインを作成することができます。

以下のように実行されます:

  • デフォルトでは1時間毎にスナップショットが取得されます (cron.hourly)。
  • 1日1回、タイムラインのクリーンアップアルゴリズムによって"古くなって要らなくなった"スナップショットを削除します (cron.daily)。

上のセクションで説明したように snapper create-config で新しい設定を作成した場合、この機能がデフォルトで有効になります。無効にするには、設定ファイルを編集して以下のように設定してください:

TIMELINE_CREATE="no"

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

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

/etc/snapper/configs/root
# limits for timeline cleanup
TIMELINE_MIN_AGE="1800"
TIMELINE_LIMIT_HOURLY="5"
TIMELINE_LIMIT_DAILY="7"
TIMELINE_LIMIT_WEEKLY="0"
TIMELINE_LIMIT_MONTHLY="0"
TIMELINE_LIMIT_YEARLY="0"

数週間後、snapper -c root list の出力は以下のようになるはずです:

# snapper -c root list
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    |

スナップショットは $BTRFS_ROOT/.snapshots に保存されます。より正確に言うと、サブボリュームのパスは $BTRFS_ROOT/.snapshots/$SNAPHOST_ID/snapshot です。こちらの フォーラムスレッド を見て下さい。

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

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

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

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

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

cron で定期的に実行

cronie をインストールしていない場合、cron ジョブは実行されません。しかしながら、systemd タイマーを snapper で使うことができます。

タイムラインタイマーを起動するには:

# systemctl start snapper-timeline.timer

snapper-cleanup.timer も起動・有効化すると良いでしょう。ブート時に実行されるようになります。

Tips and Tricks

pacman による事前事後のスナップショット

Snapper では事前または事後の"タグ付き"のスナップショットを作成できます。システムアップグレードを行ったようなときに便利です。NUMBER_CLEANUP="yes" を使うことで、クリーンアップアルゴリズムによって設定したスナップショットの数までスナップショットを消去できます。詳しくは man snapperman snapper-configs を見て下さい。

この機能を pacman で使うには、ラッパースクリプトが必要になります。ユーザー erikwsnp という名前のスクリプトを作成しています。

スクリプトをダウンロードして $PATH のどこか (例: /usr/local/bin/) に配置して、実行可能属性を付与してください。使用例:

# snp pacman -Syu

良ければ、pacman のエイリアスのように、エイリアスを作成することができます:

alias sysupgrade='sudo snp pacman -Syu'

エイリアスを作ったら、次のコマンドで事前事後のスナップショットを作成してシステムアップグレードを行うことが可能です:

$ sysupgrade

事前事後のスナップショットでアップグレードをラッピング

PacupgAUR, a script written by user crossroads1112 is specifically designed to wrap a system upgrade in snapshots. In contrast with the above solution, it downloads the packages first (pacman -Syuw) and then only wraps the upgrade (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 /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 /var/local/log/pacupg. If pacaurAUR 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 grub-btrfs-gitAUR. If it is installed, pacupg will automatically regenerate your grub.cfg after every upgrade to include your snapshots as boot options.

ロールバック操作を楽にする

pacupgAUR スクリプトではスナップショットのロールバックも簡単にできます。pacupg -r を実行するとメニューが表示され、事前事後のスナップショット (アップグレード) や単一のスナップショット (タイムラインスナップショット) をロールバックすることが可能です。

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

subvolid=0
   |
   ├── subvol_root
   |       |
   |       ├── /usr
   |       |
   |       ├── /bin
   |       |
   |       ├── /.snapshots
   |       |
   |       ├── ...
   |
   ├── subvol_snapshots
   |
   └── subvol_...

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.

In this sceneario, after the initial setup, snapper needs no changes, and will work as expected.

Snapper の設定

以下の行を /etc/fstab に追加してください:

UUID=...        /.snapshots             btrfs   ...,subvol=subvol_snapshots    0       0

上記の設定で、snapper が作成したスナップショットは全て subvol_root サブボリュームの外に保存され、snapper のスナップショットを消すことなくいつでも簡単に subvol_root を置き換えることができるようになります。

Now, because snapper does not like /.snapshots to already exist when you run snapper -c root create-config /, do this:

Make sure /.snapshots does NOT exist

Create snapper config:

# snapper -c root create-config /

Now that snapper is happy, delete /.snapshots subvolume:

# btrfs subvolume delete /.snapshots

Create the /.snapshots folder to use as a mountpoint:

# mkdir /.snapshots
# chmod 750 /.snapshots

Mount subvol_snapshots at /.snapshots

# mount /.snapshots
ノート: Since /.snapshots will be in your /etc/fstab at this point, you do not need to specify the device

システム全体のリストア

If you ever want to restore your entire system using one of snapper's snapshots, follow this procedure:

Boot Arch live CD

Mount btrfs device (subvolid=0):

# mount /dev/sdX /mnt

Find the snapshot you want to recover:

# vi /mnt/subvol_snapshots/*/info.xml
ノート: Here, you can read the <description> tag and the <date> tag, and when you find it, remember the <num> number
ノート: In vi, use :n to see the next file, :rew to go back to the first file, and :q to quit

Delete or move the root subvolume:

# mv /mnt/subvol_root /mnt/subvol_root.broken
ノート: If you want to delete it instead, remember to use btrfs subvol delete subvol_root since subvolumes can't be deleted with rm like folders can

Create a read-write snapshot of the read-only snapshot snapper took:

# btrfs subvol snapshot /mnt/subvol_snapshots/#/snapshot /mnt/subvol_root
ノート: Where # is the number of the snapper snapshot you found earlier using vi

Unmount the btrfs device and reboot:

# umount /mnt
# reboot

For a more detailed description of the problem this layout solves, see: https://bbs.archlinux.org/viewtopic.php?id=194491

トラブルシューティング

Snapper のログ

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

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

IO Error

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

注意事項

root ファイルシステムのスナップショット

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

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

updatedb

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

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