• 作成:

デスクトップLinuxにBtrfsとSnapperを使うようになってファイルを間違えて削除してしまう恐怖から開放されました

今の私のデスクトップはbcache+Btrfsで, ラップトップはBtrfsという構成なのですが, Btrfsの機能を活かしたら最高に便利でした.

Btrfsに関する基礎的な知識はこちらを参照してください.

Btrfs - ArchWiki

圧縮にlzoを選んでるのと(zstdの方が良い) discardオプションを使っているのが(NVMeの場合fstrim.timerを使った方が良い) 今風では無いですがそれ以外は網羅しています.

スナップショット

Btrfsにはスナップショット機能があり, その時点でのディレクトリの状態を取っておけます.

もちろんコピーした分だけサイズが増大するということはなく, コピーオンライトを使っているため, スナップショットを取った後に変更した分だけ使うサイズが増加します.

Snapper

これだけだと手動でスナップショットを取らないといけないので面倒くさいですが, スナップショットの取得や削除を自動化してくれるSnapperというツールがあります.

Snapper - ArchWiki

snapper create-config /

で設定を作ることができます. ここで-cオプションでプロファイル名を指定する必要はありません.

むしろ指定しなければrootプロファイルになって暗黙的にそのプロファイルが使われるようになるため, これから先毎回指定しなくて済むように指定しないことを推奨します.

snapper -c root create-config /

でも良いですが.

そして作ったら

sudo systemctl enable snapper-boot.timer snapper-cleanup.timer snapper-timeline.timer

でsnapperが自動的に起動するようにsystemdに設定します.

これでデフォルト設定だと起動した時と1時間毎にスナップショットを取って, ある程度の量を超えた場合はcleanupで自動削除が動きます.

そのへんの値を変動させたい場合は /etc/snapper/configs/root を編集します.

間違えて削除してしまう恐怖からの開放

これによりうっかりファイルをrmしてしまう恐怖から開放されました. これまでもtrash-cliを使ってきましたが, サイズのために削除したい場合やTrashディレクトリを削除してしまった場合やcpなどで上書きした場合には無力でした.

また削除せずに変更してしまった場合でも元に戻せるのは最高に便利です. Emacsで全部のファイルのバックアップを取るようにしてたりしてましたが, ファイルが単純に増えていくためサイズも問題になりますし, Emacs以外で編集した場合に対処できませんでしたからね.

サブボリュームでバックアップを除外

rootのスナップショットを取るように設定したら, 全てのディレクトリのスナップショットが取られることになります.

まあ容量に余裕がある人ならそれで別に問題ないのですが, 私のラップトップはそこまで容量に余裕がないので除外設定を行います.

サブボリュームは再帰的にスナップショットを取られないので, ディレクトリをサブボリュームに設定すれば, スナップショットからは除外されることになります.

私は以下のディレクトリをサブボリュームにして除外設定することにしました. いずれもパッケージ管理システムなどによって自動的に管理されていてバックアップを取る必要がなく, 頻繁に変更が入るディレクトリです.

/bin
/home/ncaq/.cache
/home/ncaq/.cargo
/home/ncaq/.rustup
/home/ncaq/.stack
/opt
/usr
/var/cache
/var/db
/var/lib/docker
/var/log

サイズが大きくても, 頻繁に変更が入らなければコピーオンライトが効くのでサブボリュームにする必要はありません.

またcargoなどでビルドファイルが大量生成されるプロジェクトはサイズ大きくて頻繁に変更もされますが, ソースコードのgit以外でのバックアップを取りたいので対象にしています. まあtargetだけサブボリュームにしても良いのですが一つ一つ設定するのは面倒なので.

Windowsのシャドウコピーよりわかりやすい

こういう「以前のバージョン」的な機能は, WindowsのシャドウコピーやMacのTime Machineという風にいくつも存在します.

しかしSnapperとBtrfsのスナップショット機能は, ただの新しいディレクトリとしてファイルを保存するため, とてもわかり易いです.

閲覧や復元にも専用のソフトウェアは一切必要なく, cpを使えば簡単に復元可能です.

これはMacのAPFSのスナップショットにも共通する仕様のようですね.

GUIもそれなりには便利ですが必須ではない

ricardomv/snapper-gui: GUI for snapper, a tool for Linux filesystem snapshot management, works with btrfs, ext4 and thin-provisioned LVM volumes

というsnapperのGUIフロントエンドがあり, 便利かなと思ってebuildを作ってインストールしました.

ncaq-overlay/app-backup/snapper-gui at master · ncaq/ncaq-overlay

差分が見やすかったりはします.

downloadsの差分

けどそこまで劇的に便利というわけでは無さそう… ファイル指定も出来ませんし.

openSUSEとSnapperを連携させると便利そう

openSUSE のYaSTを使えばsnapper-guiを超えた管理が可能になるようですね.

ファイル個別の視覚的ロールバックなど.

Suse Doc: 管理ガイド - Snapperによるシステム変更の取り消し

これはopenSUSEのYaSTという統合設定ツールに依存しているプラグインのようなので, 別OSに移植するのは簡単ではなさそうですね.

Snapper自体openSUSEからのものなのでそれは仕方がない.

openSUSEはBtrfsをデフォルトのファイルシステムにしている攻めたディストリビューションなので, Btrfsの機能を最大限に活かすならopenSUSEを使うのが一番手軽かもしれません.

SambaでNASを作る時にWindowsのエクスプローラから以前のバージョンに戻せるようにできる

vfs objects = snapperと設定することでBtrfsのスナップショットを使ってくれるようになるようですね.

これでWindows Serverという使いにくい(個人の感想です)ものを使ってNASを作る必要もありませんね! そのおかげでReadyNASやSynologyの上級NASが履歴に対応しているのでしょう.

Btrfsの先進性 – ReadyNASが先進的なファイルシステムBtrfsを採用している理由 – NETGEAR Connection Blog

サーバもext4からBtrfsに移行したい

このサイトが動いているサーバもext4からBtrfsに移行したいですね. CPUもSSDも余ってるのに「面倒くさい」という理由だけで未だにリプレイスしていないのですが…