なぜFedoraのBtrfsにSnapperが必要なのか?
Fedoraをメインの開発マシンとして2年以上使用してきましたが、パッケージの更新速度の速さは非常に気に入っています。しかし、それには代償も伴います。以前、Kernel 6.xのアップデートがNVIDIAドライバーと競合し、デモの直前にシステムがフリーズして苦労したことがありました。FedoraはBtrfsをデフォルトで使用していますが、ユーザーを保護する自動メカニズムが欠けています。
Btrfsは、一瞬でスナップショット(その時点の状態の記録)を作成できる強力な機能を備えています。残念ながら、Fedoraはdnf updateを実行する前に自動でシステムのスナップショットを撮ってくれません。Snapperはこの欠落を埋めるために存在します。
Snapperを自動カメラのようなものだと考えてください。ソフトウェアをインストールしたりOSをアップグレードしたりするたびに、システムの状態を保存します。もしアップデートによってWi-Fiが壊れたり音が鳴らなくなったりしても, コマンド一つでシステムが正常に動作していた時点へ「時間を巻き戻す」ことができます。
ステップ 1:SnapperとDNFプラグインのインストール
まず、Snapper本体と、DNFの動作時に自動的にトリガーされるプラグインをインストールする必要があります。
sudo dnf install snapper python3-dnf-plugin-snapper
python3-dnf-plugin-snapperパッケージはこの組み合わせの核となる部分です。これにより、何かをインストールするたびにシステムが自動的に「Pre」(前)と「Post」(後)のスナップショットを作成するようになります。
ステップ 2:Rootパーティション用のSnapper設定
デフォルトでは、Snapperはどのパーティションも監視していません。オペレーティングシステムの魂とも言えるrootパーティション(/)を保護するように指定する必要があります。
初期化のために以下のコマンドを実行します:
sudo snapper -c root create-config /
このコマンドは/etc/snapper/configs/rootに設定ファイルを作成します。同時に、将来のスナップショットを保存するために、/.snapshotsに隠しサブボリュームが作成されます。
一般ユーザーへの権限付与
通常、スナップショットを表示できるのはrootのみです。使いやすくするために、設定ファイルに自分のユーザー名を追加することをお勧めします:
sudo vi /etc/snapper/configs/root
ALLOW_USERS=""という行を探し、自分のユーザー名を入力します(例:ALLOW_USERS="haoit")。
ステップ 3:容量の最適化(クリーンアップ)
Btrfsのスナップショットは即座に容量を消費するわけではありません。しかし、10GBのデータを変更すると、古いスナップショットはその10GBをバックアップとして保持し続けます。クリーンアップを行わないと、ディスクがすぐに一杯になってしまいます。
安全面とストレージ容量のバランスをとるために、/etc/snapper/configs/rootファイルのパラメータを調整しましょう:
# 1時間ごとのスナップショットを5つ、1日ごとのスナップショットを7つ保持する
TIMELINE_LIMIT_HOURLY="5"
TIMELINE_LIMIT_DAILY="7"
TIMELINE_LIMIT_WEEKLY="0"
TIMELINE_LIMIT_MONTHLY="0"
# DNFによって作成されたスナップショットを最大10個保持する
NUMBER_LIMIT="10"
NUMBER_LIMIT_IMPORTANT="5"
システムの自動クリーンアップサービスを有効にするのを忘れないでください:
sudo systemctl enable --now snapper-cleanup.timer
ステップ 4:動作確認
htopのような軽量なパッケージをインストールして、Snapperがどのように動作するか確認してみましょう:
sudo dnf install htop
その後、スナップショットのリストを確認します:
snapper list
説明欄に「number」と記載された2つの新しい行が表示されます。これが、システムをいじる際の安心材料となる保険です。
ステップ 5:トラブル発生時のロールバック方法
ここがSnapperの真骨頂です。例えば、新しいドライバーのせいでグラフィカルインターフェースが起動しなくなったとしましょう。
ケース 1:ターミナルにアクセスできる場合
snapper listコマンドで、最も安定していたスナップショットのID(通常は直近の「Pre」)を確認します。そのIDが15であれば、次のように入力します:
sudo snapper rollback 15
これで、Snapperはスナップショット15をデフォルトのrootパーティションとして設定します。あとは再起動(reboot)するだけで、システムはその時点の状態に戻ります。
ケース 2:システムが起動しない場合
運悪くログイン画面すら表示されない場合は、grub-btrfsをインストールしておくべきです。このツールは、GRUBの起動メニューにスナップショットのリストを直接追加してくれます。
sudo dnf install grub-btrfs
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
今後は、システムに不具合が生じても、起動時に古いスナップショットを選択するだけで復旧作業が行えます。
Btrfs管理のちょっとしたコツ
- 実際の使用量を測定する:
df -hコマンドはBtrfsの容量を正しく報告しないことがよくあります。スナップショットが何GB占有しているか正確に知るには、sudo btrfs filesystem du -s /を使用してください。 - ディレクトリの除外:
/var/cacheや/var/tmpのようなディレクトリはスナップショットに含めないでください。これらは頻繁に変更されますが、OSの復旧には価値がありません。 - 手動削除: Fedoraのバージョンアップ(例:39から40)を行い、安定していることが確認できたら、
snapper delete [ID]を使用して古い数GBの容量を解放しましょう。
Snapperの設定には5分もかかりませんが、OSの再インストールにかかる数時間を節約できます。これからは、sudo dnf upgradeと入力する際、システム破損のリスクを心配することなく自信を持ってEnterキーを押せるようになります。

