「Snapper」の版間の差分
(ページの作成:「Category:ファイルシステム en:Snapper {{Related articles start}} {{Related|Btrfs}} {{Related4|mkinitcpio-btrfs}} {{Related4|Btrfs - Tips and tricks}} {{Rel...」) |
|||
3行目: | 3行目: | ||
{{Related articles start}} |
{{Related articles start}} |
||
{{Related|Btrfs}} |
{{Related|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]] の {{AUR|snapper-git}} で利用可能です。 |
− | + | GUI は {{AUR|snapper-gui-git}} パッケージでインストールすることができます。 |
|
==新しい設定の作成== |
==新しい設定の作成== |
||
− | 新しい設定を作成するには {{ic|snapper create-config}} コマンドを使います。 |
||
− | + | Btrfs サブボリュームで Snapper の設定を作成する前に、あらかじめサブボリュームが作成されている必要があります。サブボリュームが存在しない場合、Snapper の設定をするまえに[[Btrfs#サブボリュームを作成する|サブボリュームを作成]]してください。 |
|
+ | Btrfs サブボリュームが {{ic|''/path/to/subvolume''}} に存在していて、{{ic|''config''}} という名前で新しく Snapper の設定を作るには: |
||
− | {{ic|/}} にマウントされたサブボリュームを使用する例: |
||
− | # snapper -c |
+ | # snapper -c ''config'' create-config ''/path/to/subvolume'' |
上記のコマンドを実行すると: |
上記のコマンドを実行すると: |
||
− | *{{ic|/etc/snapper/config-templates}} にあるデフォルトのテンプレートに基づいて {{ic|/etc/snapper/configs/ |
+ | *{{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}} に |
+ | *{{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>}} |
||
− | ==自動タイムラインスナップショット== |
||
− | Snapper では毎時・毎日・毎月・毎年に保存するスナップショットの数を設定できるスナップショットタイムラインを作成することができます。 |
||
+ | [[cron]] デーモンを使っていない場合、パッケージに含まれている systemd ユニットを使うことができます。{{ic|snapper-timeline.timer}} を[[起動]]・[[有効化]]することで自動タイムラインスナップショットが開始されます。さらに、{{ic|snapper-cleanup.timer}} を[[起動]]・[[有効化]]すると定期的に古いスナップショットが消去されます。 |
||
− | 以下のように実行されます: |
||
− | * デフォルトでは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/ |
+ | {{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行目: | 60行目: | ||
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=*: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 -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/ |
+ | 特定のユーザーからもスナップショットを確認できるようにしたいときは、{{ic|/etc/snapper/configs/''config''}} ファイルの {{ic|ALLOW_USERS}} の値を変更してください。そうすれば通常ユーザーでも {{ic|snapper -c ''config''list}} を実行できるようになります。 |
さらに、ユーザーを使って {{ic|.snapshots}} ディレクトリを閲覧できるようにしたい、それでいてディレクトリの所有者は root のままにしておきたいということが考えられます。そのような場合、使用したいユーザーが属しているグループに、グループ所有者を変更してください。例えば {{ic|users}} を使う場合: |
さらに、ユーザーを使って {{ic|.snapshots}} ディレクトリを閲覧できるようにしたい、それでいてディレクトリの所有者は root のままにしておきたいということが考えられます。そのような場合、使用したいユーザーが属しているグループに、グループ所有者を変更してください。例えば {{ic|users}} を使う場合: |
||
105行目: | 158行目: | ||
# chown :users .snapshots |
# chown :users .snapshots |
||
+ | == Tips and tricks == |
||
− | ==cron で定期的に実行== |
||
− | {{ic|cronie}} をインストールしていない場合、cron ジョブは実行されません。しかしながら、systemd タイマーを snapper で使うことができます。 |
||
+ | === 起動時にスナップショットを作成 === |
||
− | タイムラインタイマーを起動するには: |
||
+ | [[systemd]] ユニットとタイマーを設定することで起動時にスナップショットを作成できます: |
||
− | # systemctl start snapper-timeline.timer |
||
+ | {{hc|1=/etc/systemd/system/snapper-boot.timer|2= |
||
− | {{ic|snapper-cleanup.timer}} も起動・有効化すると良いでしょう。ブート時に実行されるようになります。 |
||
+ | [Unit] |
||
+ | Description=Take snapper snapshot of root on boot |
||
+ | [Timer] |
||
− | == Tips and Tricks == |
||
+ | OnBootSec=1 |
||
− | ===pacman による事前事後のスナップショット=== |
||
− | Snapper では事前または事後の"タグ付き"のスナップショットを作成できます。システムアップグレードを行ったようなときに便利です。{{ic|<nowiki>NUMBER_CLEANUP="yes"</nowiki>}} を使うことで、クリーンアップアルゴリズムによって設定したスナップショットの数までスナップショットを消去できます。詳しくは {{ic|man snapper}} や {{ic|man snapper-configs}} を見て下さい。 |
||
+ | [Install] |
||
− | この機能を pacman で使うには、ラッパースクリプトが必要になります。ユーザー [https://aur.archlinux.org/account/erikw/ erikw] が [https://gist.github.com/erikw/5229436 snp] という名前のスクリプトを作成しています。 |
||
+ | WantedBy=basic.target |
||
+ | }} |
||
+ | {{hc|1=/etc/systemd/system/snapper-boot.service|2= |
||
− | スクリプトをダウンロードして {{ic|$PATH}} のどこか (例: {{ic|/usr/local/bin/}}) に配置して、実行可能属性を付与してください。使用例: |
||
+ | [Unit] |
||
− | # snp pacman -Syu |
||
+ | Description=Take snapper snapshot of root on boot |
||
+ | [Service] |
||
− | 良ければ、[[Pacman ヒント#ショートカット|pacman のエイリアス]]のように、[[Bash#エイリアス|エイリアス]]を作成することができます: |
||
+ | Type=simple |
||
− | alias sysupgrade='sudo snp pacman -Syu' |
||
+ | ExecStart=/usr/bin/snapper --config root create --cleanup-algorithm number --description "boot" |
||
+ | }} |
||
+ | === pacman のトランザクションをスナップショットで記録 === |
||
− | エイリアスを作ったら、次のコマンドで事前事後のスナップショットを作成してシステムアップグレードを行うことが可能です: |
||
− | $ sysupgrade |
||
− | + | pacman の操作時に自動的にスナップショットを作成するためのパッケージが複数存在します: |
|
− | {{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. |
||
+ | * {{App|snap-pac|openSUSE の YaST のように自動的に[[#事前事後のスナップショット|事前事後のスナップショット]]を作成します。[[Pacman#フック]]を使用しています。|https://github.com/wesbarnett/snap-pac|{{AUR|snap-pac}}}} |
||
− | ====ロールバック操作を楽にする==== |
||
+ | * {{App|pacupg|Btrfs のスナップショットでパッケージと AUR のアップグレードを記録して、簡単にロールバックできるようにするスクリプト。|https://github.com/crossroads1112/bin/tree/master/pacupg|{{AUR|pacupg}}}} |
||
+ | === boot パーティションのバックアップ === |
||
− | {{AUR|pacupg}} スクリプトではスナップショットのロールバックも簡単にできます。{{ic|pacupg -r}} を実行するとメニューが表示され、事前事後のスナップショット (アップグレード) や単一のスナップショット (タイムラインスナップショット) をロールバックすることが可能です。 |
||
+ | |||
+ | {{ic|/boot}} パーティションが btrfs ファイルシステム上に存在しない場合、snapper でバックアップすることはできません。フックを使用してカーネルのアップデート時に boot パーティションを自動的に btrfs ファイルシステムにコピーさせることはできます。{{AUR|snap-pac}} でも上手くバックアップされます。 |
||
+ | {{hc|1=/usr/share/libalpm/hooks/50_bootbackup.hook|2= |
||
+ | [Trigger] |
||
+ | Operation = Upgrade |
||
+ | Operation = Install |
||
+ | Operation = Remove |
||
+ | Type = Package |
||
+ | Target = linux |
||
+ | |||
+ | [Action] |
||
+ | Description = Backing up /boot... |
||
+ | When = PreTransaction |
||
+ | Exec = /usr/bin/rsync -avzq --delete /boot /.bootbackup |
||
+ | }} |
||
===推奨ファイルシステムレイアウト=== |
===推奨ファイルシステムレイアウト=== |
||
+ | |||
− | subvolid=0 |
||
+ | {{Note|1=The following layout is intended ''not'' to be used with {{ic|snapper rollback}}, but is intended to mitigate inherit problems with restoring {{ic|/}} with that command. See [https://bbs.archlinux.org/viewtopic.php?id=194491 this forum thread].}} |
||
+ | |||
+ | 以下は {{ic|/}} を簡単に復元できるようにするための推奨ファイルシステムレイアウトです: |
||
+ | |||
+ | subvolid=5 |
||
| |
| |
||
− | ├── |
+ | ├── @ |
| | |
| | |
||
| ├── /usr |
| ├── /usr |
||
149行目: | 226行目: | ||
| ├── ... |
| ├── ... |
||
| |
| |
||
− | ├── |
+ | ├── @snapshots |
| |
| |
||
− | └── |
+ | └── @... |
+ | {{ic|/.snapshots}} は {{ic|@snapshots}} のマウントポイントです。{{ic|@...}} は {{ic|/}} にマウントするサブボリューム ({{ic|@}}) とは別に保存したいサブボリュームになります。{{ic|/}} のスナップショットを作成するとき、他のサブボリュームはスナップショットに含まれません。ただし、別の snapper 設定を作成することで他のサブボリュームもスナップショットで記録できます。システムを {{ic|/}} のスナップショットの時点まで戻したいと思ったときに、他のサブボリュームには影響が及びません。 |
||
− | 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 |
||
+ | 例えば、{{ic|/}} をスナップショット時に戻したいが {{ic|/home}} は最新の状態のままにしたい場合、サブボリュームを作成して {{ic|/home}} にマウントしてください。詳しくは [[Btrfs#サブボリューム]]を参照。 |
||
− | 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 ユーティリティで定期的に {{ic|/}} のスナップショットが作成できるのと同時に、起動できなくなった場合に Arch のライブ CD から {{ic|/}} を簡単に復元することができます。 |
||
− | In this sceneario, after the initial setup, snapper needs no changes, and will work as expected. |
||
+ | その場合、初期設定をしたら snapper に特別な設定をする必要はありません。 |
||
− | ====Snapper の設定==== |
||
+ | {{Note|Even if a subvolume is nested below {{ic|@}}, a snapshot of {{ic|/}} will ''not'' include it. Be sure to set up snapper for any additional subvolumes you want to keep snapshots of besides the one mounted at {{ic|/}}.}} |
||
− | 以下の行を {{ic|/etc/fstab}} に追加してください: |
||
− | {{bc|<nowiki> |
||
− | UUID=... /.snapshots btrfs ...,subvol=subvol_snapshots 0 0 |
||
− | </nowiki>}} |
||
+ | ====snapper の設定とマウントポイント==== |
||
− | 上記の設定で、snapper が作成したスナップショットは全て subvol_root サブボリュームの外に保存され、snapper のスナップショットを消すことなくいつでも簡単に subvol_root を置き換えることができるようになります。 |
||
+ | {{ic|/.snapshots}} がマウントされていないこと、フォルダとして存在しないことを確認してください: |
||
− | Now, because snapper does not like /.snapshots to already exist when you run {{ic|snapper -c root create-config /}}, do this: |
||
+ | # umount /.snapshots |
||
+ | # rm -r /.snapshots |
||
+ | それから {{ic|/}} の[[#新しい設定の作成|新しい設定を作成]]します。 |
||
− | Make sure /.snapshots does NOT exist |
||
+ | そして {{ic|@snapshots}} を {{ic|/.snapshots}} に[[マウント]]してください。例えば、ファイルシステムが {{ic|/dev/sda1}} に存在する場合: |
||
− | Create snapper config: |
||
+ | # mount -o subvol=@snapshots /dev/sda1 /.snapshots |
||
− | {{bc|<nowiki> |
||
+ | マウントを永続化させるには、[[fstab]] にエントリを作成します。 |
||
− | # 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}} |
||
+ | もしくは fstab エントリが既に存在する場合、スナップショットのサブボリュームを再マウントします: |
||
− | ====システム全体のリストア==== |
||
+ | # mount -a |
||
+ | フォルダには {{ic|750}} の[[ファイルのパーミッションと属性#数字を使う方法|パーミッション]]を設定してください。 |
||
− | If you ever want to restore your entire system using one of snapper's snapshots, follow this procedure: |
||
+ | snapper が作成するスナップショットは全て {{ic|@}} サブボリュームの外に保存されるため、snapper のスナップショットを削除しなくても {{ic|@}} を簡単に置き換えることができます。 |
||
− | Boot Arch live CD |
||
+ | ===={{ic|/}} を {{ic|@}} のスナップショットに復元 ==== |
||
− | Mount btrfs device (subvolid=0): |
||
− | {{bc|<nowiki> |
||
− | # mount /dev/sdX /mnt |
||
− | </nowiki>}} |
||
+ | If you ever want to restore {{ic|/}} using one of snapper's snapshots, first boot into a live Arch Linux USB/CD. |
||
− | 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}} |
||
+ | [[Mount]] the toplevel subvolume (subvolid=5). That is, omit any {{ic|subvolid}} mount flags. |
||
− | Delete or move the root subvolume: |
||
+ | |||
− | {{bc|<nowiki> |
||
+ | Find the snapshot you want to recover in {{ic|/mnt/@snapshots/*/info.xml}}. |
||
− | # mv /mnt/subvol_root /mnt/subvol_root.broken |
||
+ | {{Tip| You can use {{ic|vi}} to easily browse through each file: |
||
− | </nowiki>}} |
||
+ | # vi /mnt/@snapshots/*/info.xml |
||
− | {{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}} |
||
+ | Use {{ic|:n}} to see the next file and {{ic|:rew}} to go back to the first file.}} |
||
+ | |||
+ | Browse through the {{ic|<description>}} tags and the {{ic|<date>}} tags, and when you find the snapshot you wish to restore, remember the {{ic|<num>}} number. |
||
+ | |||
+ | Now, move {{ic|@}} to another location (''e.g.'' {{ic|/@.broken}}) to save a copy of the current system. Alternatively, simply delete {{ic|@}} using {{ic|btrfs subvolume delete}}. |
||
Create a read-write snapshot of the read-only snapshot snapper took: |
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}} |
||
+ | # btrfs subvol snapshot /mnt/@snapshots/''#''/snapshot /mnt/@ |
||
− | Unmount the btrfs device and reboot: |
||
+ | |||
− | {{bc|<nowiki> |
||
+ | Where {{ic|''#''}} is the number of the snapper snapshot you wish to restore. Your {{ic|/}} has now been restore to the previous snapshot. Now just simply reboot. |
||
− | # umount /mnt |
||
+ | |||
− | # reboot |
||
+ | ===スナップショットからファイルを削除=== |
||
− | </nowiki>}} |
||
+ | |||
+ | If you want to delete a specific file or folder from past snapshots without deleting the snapshots themselves, [https://pypi.python.org/pypi/snapperS snapperS] is a script that adds this functionality to Snapper. This script can also be used to manipulate past snapshots in a number of other ways that Snapper does not currently support. |
||
+ | |||
+ | === ドライブの負担を抑える === |
||
+ | |||
+ | 頻繁に変更が加わるファイルシステム (例えば多数のシステムアップデートが行われる {{ic|/}} など) で長期間にわたって頻繁にスナップショットを取得すると動作がかなり遅くなることがあります。以下のようにすることで遅くなるのを回避できます: |
||
+ | * スナップショットを作成する価値がない {{ic|/var/cache/pacman/pkg}}, {{ic|/var/abs}}, {{ic|/var/tmp}}, {{ic|/srv}} などのサブボリュームを[[Btrfs#サブボリュームを作成する|作成]]する。 |
||
+ | * [[#自動タイムラインスナップショット|自動タイムラインスナップショット]]を使う場合に、毎時・毎日・毎周・毎年のスナップショットのデフォルト設定を変更する。 |
||
+ | |||
+ | ==== updatedb ==== |
||
+ | |||
+ | デフォルトでは、{{ic|updatedb}} は snapper によって作成された {{ic|.snapshots}} ディレクトリのインデックスも作成してしまい、スナップショットが大量にある場合、深刻な遅延が発生したりメモリが異常に消費される原因になります。以下のように設定ファイルを編集することでインデックスを作成しないように {{ic|updatedb}} を設定できます: |
||
+ | {{hc|/etc/updatedb.conf|2=PRUNENAMES = ".snapshots"}} |
||
+ | |||
+ | ==== 外部ドライブに差分バックアップ ==== |
||
+ | |||
+ | [https://gist.githubusercontent.com/wesbarnett/c9d12e60d17cf8a73c485ad4bb9037e9/raw/4f74040ea8a0b0cca73305550681b8c2b2669f89/backup このスクリプト] を使うことでシステムにマウントされた外部ドライブに差分バックアップを作成することができます。 |
||
+ | |||
+ | また、{{AUR|buttersink-git}} を使うことでスナップショットをローカルのバックアップドライブや、ssh を使って外部のバックアップドライブに転送できます。Buttersink はスナップショットの差分だけを送信することで自動的に同期を最適化します。間違って削除してしまったデータがバックアップ先でも削除されてしまわないように、外部のアクセスから保護するように設定することを推奨します。 |
||
+ | # mkdir -p -m 750 /run/media/hdd/backup |
||
+ | # buttersink /.snapshots/ /run/media/hdd/backup |
||
+ | |||
+ | === ログファイルの保持 === |
||
+ | {{ic|/var/log}} のサブボリュームを作成して {{ic|/}} のスナップショットに含まれないようにすることを推奨します。{{ic|/}} のスナップショットを復元したときにログファイルまで前の状態に戻ってしまうことがなくなり、トラブルシューティングが楽になります。 |
||
− | For a more detailed description of the problem this layout solves, see: https://bbs.archlinux.org/viewtopic.php?id=194491 |
||
== トラブルシューティング == |
== トラブルシューティング == |
||
237行目: | 313行目: | ||
毎時・毎日・毎週のスナップショットに問題がある場合、おそらく cronie サービス (もしくはその他の cron デーモン) が動いていなかったのが原因だということが多くあります。 |
毎時・毎日・毎週のスナップショットに問題がある場合、おそらく cronie サービス (もしくはその他の cron デーモン) が動いていなかったのが原因だということが多くあります。 |
||
− | ===IO |
+ | ===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}} というエラーが出力されます)。 |
||
− | == 注意事項 == |
||
+ | == 参照 == |
||
− | === root ファイルシステムのスナップショット === |
||
+ | * [http://snapper.io/ Snapper ホームページ] |
||
− | 頻繁に変更が加わるファイルシステム (例えば多数のシステムアップデートが行われる {{ic|/}} など) で長期間にわたって頻繁にスナップショットを取得すると動作がかなり遅くなることがあります。以下のようにすることで遅くなるのを回避できます: |
||
+ | * [https://en.opensuse.org/Portal:Snapper openSUSE Snapper ポータル] |
||
− | * スナップショットする価値がないもの、{{ic|/var/cache/pacman/pkg}} や {{ic|/var/abs}} などでサブボリュームを作成する。 |
||
+ | * [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] |
||
− | |||
− | === updatedb === |
||
− | デフォルトでは、{{ic|updatedb}} は snapper によって作成された {{ic|.snapshots}} ディレクトリのインデックスも作成してしまい、スナップショットが大量にある場合、深刻な遅延が発生したりメモリが異常に消費される原因になります。以下のように設定ファイルを編集することでインデックスを作成しないように {{ic|updatedb}} を設定できます: |
||
− | {{hc|/etc/updatedb.conf|2=PRUNENAMES = ".snapshots"}} |
2016年9月22日 (木) 21:06時点における版
関連記事
Snapper は openSUSE の Arvin Schnell によって作られた、Btrfs のサブボリュームと LVM のボリュームのスナップショットの管理を助けるツールです。スナップショットを作成して比較したり、前のスナップショットに戻したり、自動スナップショットが行えます。
目次
インストール
安定版の snapper は公式リポジトリからインストールできます。開発版は AUR の 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/snapper
のSNAPPER_CONFIGS
にconfig
が追加されます。
例えば、/
にマウントされたサブボリュームの設定ファイルを作成する場合:
# snapper -c root create-config /
この時点で、設定は有効になっています。cron デーモンが動作している場合、snapper は自動タイムラインスナップショットを作成します。cron デーモンを使っていない場合、systemd サービスとタイマーを使用する必要があります。#有効化/無効化を見てください。
設定について詳しくは snapper-configs
の man ページを参照。
スナップショットの作成
自動タイムラインスナップショット
Snapper では毎時・毎日・毎月・毎年に保存するスナップショットの数を設定できるスナップショットタイムラインを作成することができます。デフォルトでは1時間毎にスナップショットが取得されます。そして1日1回、タイムラインのクリーンアップアルゴリズムによって"古くなって要らなくなった"スナップショットを削除します。
有効化/無効化
cron デーモンが動作している場合、自動タイムラインスナップショットは自動的に起動します。無効化するには、サブボリュームに存在する設定ファイルを編集して以下を設定してください:
TIMELINE_CREATE="no"
cron デーモンを使っていない場合、パッケージに含まれている systemd ユニットを使うことができます。snapper-timeline.timer
を起動・有効化することで自動タイムラインスナップショットが開始されます。さらに、snapper-cleanup.timer
を起動・有効化すると定期的に古いスナップショットが消去されます。
スナップショットのリミットの設定
デフォルト設定では、毎時間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=*:0/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
スナップショットについては自動タイムラインスナップショットを、pre
と post
については事前事後のスナップショットを見てください。
事前事後のスナップショット
シンプルなスナップショットだけでなく、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 -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
Tips and tricks
起動時にスナップショットを作成
systemd ユニットとタイマーを設定することで起動時にスナップショットを作成できます:
/etc/systemd/system/snapper-boot.timer
[Unit] Description=Take snapper snapshot of root on boot [Timer] OnBootSec=1 [Install] WantedBy=basic.target
/etc/systemd/system/snapper-boot.service
[Unit] Description=Take snapper snapshot of root on boot [Service] Type=simple ExecStart=/usr/bin/snapper --config root create --cleanup-algorithm number --description "boot"
pacman のトランザクションをスナップショットで記録
pacman の操作時に自動的にスナップショットを作成するためのパッケージが複数存在します:
- snap-pac — openSUSE の YaST のように自動的に事前事後のスナップショットを作成します。Pacman#フックを使用しています。
- pacupg — Btrfs のスナップショットでパッケージと AUR のアップグレードを記録して、簡単にロールバックできるようにするスクリプト。
boot パーティションのバックアップ
/boot
パーティションが btrfs ファイルシステム上に存在しない場合、snapper でバックアップすることはできません。フックを使用してカーネルのアップデート時に boot パーティションを自動的に btrfs ファイルシステムにコピーさせることはできます。snap-pacAUR でも上手くバックアップされます。
/usr/share/libalpm/hooks/50_bootbackup.hook
[Trigger] Operation = Upgrade Operation = Install Operation = Remove Type = Package Target = linux [Action] Description = Backing up /boot... When = PreTransaction Exec = /usr/bin/rsync -avzq --delete /boot /.bootbackup
推奨ファイルシステムレイアウト
以下は /
を簡単に復元できるようにするための推奨ファイルシステムレイアウトです:
subvolid=5 | ├── @ | | | ├── /usr | | | ├── /bin | | | ├── /.snapshots | | | ├── ... | ├── @snapshots | └── @...
/.snapshots
は @snapshots
のマウントポイントです。@...
は /
にマウントするサブボリューム (@
) とは別に保存したいサブボリュームになります。/
のスナップショットを作成するとき、他のサブボリュームはスナップショットに含まれません。ただし、別の snapper 設定を作成することで他のサブボリュームもスナップショットで記録できます。システムを /
のスナップショットの時点まで戻したいと思ったときに、他のサブボリュームには影響が及びません。
例えば、/
をスナップショット時に戻したいが /home
は最新の状態のままにしたい場合、サブボリュームを作成して /home
にマウントしてください。詳しくは Btrfs#サブボリュームを参照。
上記のレイアウトは snapper ユーティリティで定期的に /
のスナップショットが作成できるのと同時に、起動できなくなった場合に Arch のライブ CD から /
を簡単に復元することができます。
その場合、初期設定をしたら snapper に特別な設定をする必要はありません。
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 のスナップショットを削除しなくても @
を簡単に置き換えることができます。
/
を @
のスナップショットに復元
If you ever want to restore /
using one of snapper's snapshots, first boot into a live Arch Linux USB/CD.
Mount the toplevel subvolume (subvolid=5). That is, omit any subvolid
mount flags.
Find the snapshot you want to recover in /mnt/@snapshots/*/info.xml
.
Browse through the <description>
tags and the <date>
tags, and when you find the snapshot you wish to restore, remember the <num>
number.
Now, move @
to another location (e.g. /@.broken
) to save a copy of the current system. Alternatively, simply delete @
using btrfs subvolume delete
.
Create a read-write snapshot of the read-only snapshot snapper took:
# btrfs subvol snapshot /mnt/@snapshots/#/snapshot /mnt/@
Where #
is the number of the snapper snapshot you wish to restore. Your /
has now been restore to the previous snapshot. Now just simply reboot.
スナップショットからファイルを削除
If you want to delete a specific file or folder from past snapshots without deleting the snapshots themselves, snapperS is a script that adds this functionality to Snapper. This script can also be used to manipulate past snapshots in a number of other ways that Snapper does not currently support.
ドライブの負担を抑える
頻繁に変更が加わるファイルシステム (例えば多数のシステムアップデートが行われる /
など) で長期間にわたって頻繁にスナップショットを取得すると動作がかなり遅くなることがあります。以下のようにすることで遅くなるのを回避できます:
- スナップショットを作成する価値がない
/var/cache/pacman/pkg
,/var/abs
,/var/tmp
,/srv
などのサブボリュームを作成する。 - 自動タイムラインスナップショットを使う場合に、毎時・毎日・毎周・毎年のスナップショットのデフォルト設定を変更する。
updatedb
デフォルトでは、updatedb
は snapper によって作成された .snapshots
ディレクトリのインデックスも作成してしまい、スナップショットが大量にある場合、深刻な遅延が発生したりメモリが異常に消費される原因になります。以下のように設定ファイルを編集することでインデックスを作成しないように updatedb
を設定できます:
/etc/updatedb.conf
PRUNENAMES = ".snapshots"
外部ドライブに差分バックアップ
このスクリプト を使うことでシステムにマウントされた外部ドライブに差分バックアップを作成することができます。
また、buttersink-gitAUR を使うことでスナップショットをローカルのバックアップドライブや、ssh を使って外部のバックアップドライブに転送できます。Buttersink はスナップショットの差分だけを送信することで自動的に同期を最適化します。間違って削除してしまったデータがバックアップ先でも削除されてしまわないように、外部のアクセスから保護するように設定することを推奨します。
# mkdir -p -m 750 /run/media/hdd/backup # buttersink /.snapshots/ /run/media/hdd/backup
ログファイルの保持
/var/log
のサブボリュームを作成して /
のスナップショットに含まれないようにすることを推奨します。/
のスナップショットを復元したときにログファイルまで前の状態に戻ってしまうことがなくなり、トラブルシューティングが楽になります。
トラブルシューティング
Snapper のログ
Snapper は全ての活動を /var/log/snapper.log
に書き出します。何か問題が発生しているように感じたら真っ先にこのファイルをチェックしてください。
毎時・毎日・毎週のスナップショットに問題がある場合、おそらく cronie サービス (もしくはその他の cron デーモン) が動いていなかったのが原因だということが多くあります。
IO エラー
スナップショットを作成しようとすると IO エラーが表示される場合、スナップショットを作成しようとしたサブボリュームと関連付けられている .snapshots ディレクトリもサブボリュームになっていることを確認してください。
また、.snapshots
の所有者が root になっていない可能性もあります (/var/log/snapper.log
に Btrfs.cc(openInfosDir):219 - .snapshots must have owner root
というエラーが出力されます)。