えんでぃの技術ブログ

えんでぃの技術ブログ

ネットワークエンジニアの視点で、IT系のお役立ち情報を提供する技術ブログです。

TimeshiftによるLinuxシステムバックアップ

timeshift_black_bold
引用元:timeshift_black_bold.png

お伝えしたいこと

Linux のお手軽なシステムバックアップツールであるTimeshiftについて紹介します。

Timeshift の公式情報は、基本的にGitHubのREADMEに全て書いてあります。
https://github.com/teejee2008/timeshift

紹介しているコマンドは、Fedoraを基準にしています。
他のディストリビューションをお使いの方は、上記READMEを参照しつつ、主にインストールコマンドの部分を適宜読み替えてください。

Timeshift とは

Timeshift は、GUI操作により定期・不定期のバックアップを取得し、世代管理するツールです。
/etc, /usr, /boot などのディレクトリに含まれる、システム用途の設定ファイル、バイナリなどのバックアップを取得します。
Linuxは基本的に全てをファイルで表現しますので、システム関連のファイルを復元すれば、システムに対する変更を巻き戻すことができます。
例えばパッケージやカーネルのバージョンアップ、ブートローダー周りの設定変更といったものも基本的には復元できます。

Timeshift の魅力は、マニュアルを読まずとも使いこなせるシンプルなGUIです。
慣れていれば10分以内に初期設定を完了し、1クリックでバックアップし、3クリックで復元できます。
また、バックアップ・復元の動作も非常に高速で、ストレスをほとんど感じません。

一方で、Timeshiftは/home などに保存されたドキュメントや画像などのユーザーデータの保管に使用することは推奨されていません。
私はコマンドラインrsyncをデータバックアップに利用し、Timeshift と相補的に使い分けています。
rsyncの使い方については、別の記事にて紹介します。

基本機能

バックアップ方式

バックアップ方式は以下の2通りから選べます。
BtrFS (B-Tree File System) を使っている方以外は、Rsyncを選択することになります。

Rsync

rsyncコマンドにより、バックアップ先にファイルをコピーする方式です。
事前にコピー先のファイル名やタイムスタンプなどを確認して更新があったファイルのみコピーするため、2度目以降のバックアップが特に高速です。

バックアップの世代管理には--link-destオプションを利用しています。
--link-destを利用することで、以下のような動きになります。

  • 前回バックアップから更新のないファイルは、前回のバックアップファイルからのハードリンクを生成する
  • 前回バックアップから更新のあったファイルは、バックアップ元からコピーを生成する

ハードリンクはファイルの実体 (inode) を共有した複数のファイルを作るという特性を持ちます。
ハードリンクによる差分バックアップは、以下の強力なメリットを持ちます。

  • ハードリンクの作成はディスク容量をほとんど消費しない
  • ハードリンクの作成は非常に高速
  • 世代間に依存関係がないため、各世代は順不同で高速に削除できる
  • ハードリンクは日々使っている基本機能なので、不具合が発生する懸念は少ない

ハードリンクの仕組みについては、以下のリンクが参考になります。

qiita.com

最後に、rsyncはハードリンクの仕組みを利用していることから、当然ながらファイルシステム自体がハードリンクに対応している必要があります。
大抵は問題ないのですが、sshfsはハードリンクに対応していないとのことですのでご注意ください。

BtrFS

BtrFSについては詳しくないので、簡潔に記載します。

  • BtrFSのスナップショット機能を使ってバックアップを取る
  • バックアップ元がBtrFSを利用していることが前提
  • その他、SubVolume構成にも条件がある
  • 詳細はTimeshiftのREADMEを参照

定期バックアップ

バックアップ間隔と保管する世代数を指定できます。
裏ではcrond が関係しています。

バックアップタイミングは起動時、日次、週次、月次、年次、任意の日数、または手動実行から選ぶことができます。
保管する世代数は、バックアップタイミングごとに指定できます。
例えば日次バックアップは7世代保管、月次バックアップは2世代、といった指定が可能です。

インストール

以下のコマンドでTimeshiftをインストールします。

sudo dnf install timeshift

初期設定

デスクトップ環境のメニューから timeshift と検索して、Timeshiftを起動します (またはsudo timeshift-gtkコマンド)。

Timeshift は裏で設定内容に応じて /etc/cron.d 配下を編集するため、rootレベルの特権が必要です。
従って、GUIからの起動時に毎回sudoと同様のパスワードを求められます。
このあたりの制御はPolkitで実装されています (/usr/share/polkit-1/actions/in.teejeetech.pkexec.timeshift.policy)。
Polkit とは、特権が必要な操作を非特権プロセスから実行するための仕組みで、sudoコマンドと似たような役割です。
GUIツールで特権操作を実装する時に、Polkitがしばしば利用されるようです。

timeshift_authentication

パスワード認証が通ったら、初期設定を行います。
以下の画面で赤枠のSettings を開きます。
または、隣のWizard を開いてもほぼ同じです。
なお、Timeshift の設定反映のタイミングは、設定ウィンドウの「OK」を選択したタイミングではなく、Timeshift のウィンドウを全て閉じた時になりますのでご注意ください。

timeshift_settings

以降、Settingsの各タブの設定手順を順に紹介します。

Type

バックアップの方式を指定します。
RsyncかBtrFSの二択ですが、バックアップ元でBtrFSを使っていない場合はRsyncしか使えません。

私の環境は LVM + EXT4を利用しているので、無条件でRsyncになります。

1_type

Location

スナップショットの保存場所 (バックアップ先) のデバイスファイルを指定します。

前提として、私の環境は以下のパーティション構成です。

  • /boot: 1 GiB
  • /: 50 GiB
  • /home: 865 GiB

基本方針としては、システムパーティション (/boot, /) のバックアップをデータパーティション (/home) に保存します。
従って、バックアップ先としては/home に対応するデバイスファイルを指定します。

バイスファイルはdfコマンドで特定できます。
LVMの場合は、dfで表示されたファイルに対し、更にls -lfileコマンドを実行してシンボリックリンク先を調べることで特定できます。

$ sudo df -h | grep /home
/dev/mapper/fedora_pc-home  865G  174G  647G  22% /home

$ file /dev/mapper/fedora_pc-home
/dev/mapper/fedora_pc-home: symbolic link to ../dm-1

上記出力から、今回はdm-1を指定すれば良いことがわかります (容量からも自明ですが...)。

2_location

Timeshiftでは、具体的なバックアップ先のパスは指定できません。
バックアップ先は常に<mount-point>/timeshift/ 配下になります。
今回の設定では、/home/timeshift/配下にバックアップデータが蓄積されます。

Schedule

バックアップの取得間隔と保存世代数を指定します。
このあたりの設定はフィーリングです。
一旦適当に設定して、後から必要に応じて設定変更・手動のスナップショット削除などを実施する形でも問題ないと思います。

いずれにしても、リスクのある作業 (OSやパッケージの更新など) の直前に手動でバックアップを取ると思いますし、最低限それだけあれば何とかなります。
定期バックアップは、その上で実施する追加の安全策という位置づけです。

私の場合は、日次バックアップを5回分、週次バックアップを3回分保存しています。
結構長い期間の差分バックアップを保管するため、容量も大きくなる傾向があります。
しかし、日次バックアップでロールバックすればデータ損失を最小限に抑えられますし、対処が遅れて日次バックアップが自動削除されてしまった場合も週次バックアップで何とかなります。
日次バックアップと週次バックアップを数世代ずつ保存しておけば、概ねバランスが良いのではないかと思います。

3_schedule

Users

各ユーザのホームディレクトリをバックアップ対象に含めるか否かを指定します。
デフォルトでは、全てのホームディレクトリはバックアップ対象から除外されます。

繰り返しになりますが、Timeshift はシステムデータのバックアップ用ツールです。
ユーザーデータのバックアップをTimeshiftで実施することは非推奨になります (可能ですが)。

私の環境では、全てのホームディレクトリをバックアップ対象から除外しています。
ユーザーデータのバックアップは、rsyncコマンドにて別途手動で実行しています。
手動実行としているのは、バックアップ先が外付けHDDで、バックアップするときのみ接続するためです。

4_users

Filters

ホームディレクトリ以外に、細かくバックアップ対象・対象外のファイル/ディレクトリを指定します。
Users タブで設定した内容は、この画面にも自動で表示されます。

私の環境では、特に何の設定追加もしていません。

5-1_filters

画面下部のSummary を選択すると、バックアップ対象外のファイル一覧を確認できます。
この画面で指定されているホームディレクトリ以外にも、/dev/*, /proc/*, /sys/*, /home/*/** などのディレクトリが自動的にバックアップ対象外として指定されています。
この中で例外的にバックアップを取得したいディレクトリ / ファイルがあれば、バックアップ対象として別途指定する (+フラグをつける) 必要があります。

なお、rsyncの仕様として --include, --excludeオプションは先に指定したほうが優先されます。
従って、例えば/home/*は除外したいけど、/home/somefileだけはバックアップを取りたいという場合、/home/somefileの追加ルールを/home/*の除外ルールよりも上に書く必要があります。

rsyncのフィルタについては、他にも複雑なルールがいくつかあります。
詳しくはこちらのブログが参考になります。

tech.nitoyon.com

あまり複雑なフィルタを書くとハマります。
フィルタは可能な限りはシンプルに保つことをおすすめします。

5-2_exclude_list

Misc

バックアップを実行するたびに、バックアップ先に世代ごとのディレクトリが追加されていきます。
ここでは世代ごとのディレクトリ名に使用されるタイムスタンプの形式を指定します。

私はデフォルトのまま変更しませんでした。

6_misc

設定完了

基本設定が終わったら、Timeshiftのウィンドウを閉じれば完了です。
後はLinuxが起動している間に、crond/anacron がジョブを開始し、自動的にバックアップを取得します。

繰り返しになりますが、Timeshift の全てのウィンドウを閉じたタイミングで設定が反映されます。
設定画面の「OK」をクリックしたタイミングではないので、ご注意ください。

バックアップ手動実行

手動でバックアップを取得する際は、Create を選択します。
パッケージ一括更新やOS更新など、リスクの高い作業を実施する直前に実行する使い方が基本かなと思います。

timeshift_create

過去の状態への復元

過去の状態に戻したい場合は、スナップショットを選択の上、Restoreを選択します。
現在のファイルを全てバックアップ時のファイルに書き換えた上で、OSを再起動します。
うまく行けば、元の状態に復旧します。

timeshift_restore

(参考) Timeshift によるデータバックアップが推奨されない理由

TimeshiftのREADME には、以下のように書かれています。

Timeshift is similar to applications like rsnapshot, BackInTime and TimeVault but with different goals. It is designed to protect only system files and settings. User files such as documents, pictures and music are excluded. This ensures that your files remains unchanged when you restore your system to an earlier date. If you need a tool to backup your documents and files please take a look at the excellent BackInTime application which is more configurable and provides options for saving user files.

GitHub - teejee2008/timeshift

要約すると、以下のようになります。

  • Timeshift をシステムバックアップ用途に限定することで、復元したときもユーザーデータが変更されないようにできる
  • ユーザーデータのバックアップを取得するなら、BackInTime や TimeVaultのような他のツールを使ったほうが良い
    • (えんでぃ追記) BackInTimeを実際に使ってみたら実行速度が非常に遅かった
    • (えんでぃ追記) TimeVault は開発がストップしていた
    • (えんでぃ追記) 結局、rsyncコマンドを使うことにした。詳細は次の記事を参照

確かに上に書いてある通りの理由で、システムバックアップとデータバックアップで分けて管理すべきだと思います。
それぞれのバックアップは取得タイミングも復元タイミングも全く別になるはずです。

Timeshiftをシステムバックアップ用、rsyncコマンドをデータバックアップ用で分けて使うことで、上記のような使い分けを容易に実現できます。

(参考) CLIによる操作

Timeshift はCLIからの操作にも一部対応しています。
timeshift コマンドによってスナップショットの一覧表示や、スナップショットの即時取得、特定スナップショットへのリストアが可能です。
使い方の詳細はman timeshift を参照してください。
timeshiftコマンド自体は、結構お手軽に使えそうです。

しかし、スケジュールやオプションの設定はtimeshiftコマンドではできず、やはりGUIからの操作が基本となるようです。
GUIで設定した内容は/etc/timeshift.jsonに保管されているようなので、CLI環境においてはこのjsonファイルを編集することで挙動を変えることもできそうです。

ただ、jsonを書き換える利用法は本来の利用方法と異なりますし、何らかの副作用を生む可能性もあります。
CLIで定期バックアップを取得したい場合は、自前でcrondにrsyncベースのスクリプトを登録することをご検討いただくのが良いと個人的には思います。

Timeshift と rsync の違い

詳細は次の記事に譲りますが、Timeshift が内部的に発行しているrsync コマンドを確認すると、-AHX オプションが付与されていません。
また2021年1月現在、GUIからこれらのオプションを有効化/無効化する機能が実装されていません。
従って、以下の機能が必要な場合は、残念ながらTimeshiftよりもrsyncコマンドの方が向いています。

  • ACL (Access Control List) の保持 (-A, --acls)
  • ハードリンクの関係性の保持 (-H, --hard-links)
    • Linux のシステムディレクトリではもちろんハードリンクのファイルも存在する
    • この関係性をリストア後も維持するなら、-Hオプションは必須となる
  • 拡張ファイル属性の保持 (-X, --xattrs)

差分同期のスケジュール実行も含めて全て自力で実装しようとすると難易度が高いですが、以下のバランスであれば比較的簡単に実装できると思います。
このあたりの細かい実装方法は、後続の記事にまとめます。

  • バックアップのスケジュール実行はTimeshiftに任せる (-AHXの部分は妥協する)
  • OSバージョンアップなどリスクの高い作業前のみ、rsyncコマンドで-AHXも含めたバックアップを取得する

参考にした動画

Timeshift の概要を知るのに参考になりました。
Chris Titus 氏の動画は、Linux / Windows / Mac 関連の情報を普段遣いの観点で調べるのにいつも重宝しています。

まとめ

システムバックアップのツールとして、Timeshiftを紹介しました。

カーネルディストリビューションをアップグレードするときは、デスクトップやOSそのものが起動しなくなるリスクを伴います。
過信は禁物ですが、Timeshiftでバックアップを取得してから作業することで、メンテナンス作業のリスクを手軽に、しかし大幅に軽減できます。

Linux PC関連まとめ

endy-tech.hatenablog.jp

次の記事

Timeshift の動作について詳細を確認してまとめました。
以下の内容に触れています。

  • Timeshift はanacron 的な動作をすること、
  • cronとanacronの違い、そして
  • Timeshift が内部的に発行しているrsyncコマンドラインオプション

endy-tech.hatenablog.jp

Timeshift とセットでコマンドラインrsyncでシステム・データバックアップを取得する方法については、以下の記事でまとめています。
rsyncコマンドに-Hを指定することで、ハードリンクの関係性を維持したシステムバックアップも取得可能です。
rsyncはTimeshiftを置き換えるものではなく、両方を使い分けます。
本文では、これらを使い分けるべき理由についても触れています。

endy-tech.hatenablog.jp