Snapper
Snapper は openSUSE の Arvin Schnell によって作られた、Btrfs のサブボリュームと LVM のボリュームのスナップショットの管理を助けるツールです。スナップショットを作成して比較したり、前のスナップショットに戻したり、自動スナップショットが行えます。
目次
インストール
安定版の snapper は公式リポジトリからインストールできます。
開発版は AUR の snapper-gitAUR で利用可能です。
新しい設定の作成
新しい設定を作成するには snapper create-config
コマンドを使います。
/
にマウントされたサブボリュームを使用する例:
# snapper -c root create-config /
上記のコマンドを実行すると:
/etc/snapper/config-templates
にあるデフォルトのテンプレートに基づいて/etc/snapper/configs/root
に設定ファイルが作成されます。- サブボリュームのルートにサブボリューム
.snapshots
が作成されます (上記の例の場合/.snapshots
)。 /etc/conf.d/snapper
のSNAPPER_CONFIGS
に "root" が追加されます。
コマンドを実行した時点で、設定は有効になります。cron デーモンを実行している場合、Snapper は1時間ごとにスナップショットを取得するようになります。設定ファイルを確認して保存するスナップショットの数を設定することを推奨します。
自動タイムラインスナップショット
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 snapper
や man snapper-configs
を見て下さい。
この機能を pacman で使うには、ラッパースクリプトが必要になります。ユーザー erikw が snp という名前のスクリプトを作成しています。
スクリプトをダウンロードして $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
システム全体のリストア
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
Delete or move the root subvolume:
# mv /mnt/subvol_root /mnt/subvol_root.broken
Create a read-write snapshot of the read-only snapshot snapper took:
# btrfs subvol snapshot /mnt/subvol_snapshots/#/snapshot /mnt/subvol_root
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"