rsync によるフルシステムバックアップ
関連記事
この記事では rsync を使って、特定のフォルダを除いて、"/" ツリーのコピーを転送する方法を説明します。異なるサイズ、パーティションテーブル、ファイルシステムを使っていてもコピーができるので、dd
によるディスクのクローンよりも利用しやすく、ファイルのパーミッションや属性、アクセス制御リスト (ACL) や拡張属性を使うことができるため、cp -a
でコピーするよりも細かい制御ができます [1]。
どちらの方法でもシステムが動作していてもバックアップできます。バックアップには時間がかかるため、バックアップ中はウェブを自由にブラウズすると良いでしょう。最悪の場合でも、バックアップをリストア (あるいはバックアップを起動) したときに保存していなかったタブが開けなくなる程度です。大したことではありません。
コマンドでバックアップ
以下のコマンドは bash や zsh シェルで利用できるブレース展開を使っています。別のシェルを使用する場合、--exclude
を手動で繰り返す必要があります。
# rsync -aAXv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} / /path/to/backup/folder
-aAX
オプションによってファイルはアーカイブモードで転送されるので、シンボリックリンクやデバイス、パーミッションや所有者、変更日時、ACL あるいは拡張属性は保たれます。
--exclude
オプションは指定したパターンにマッチするファイルを除外します。/dev
, /proc
, /sys
, /tmp
, /run
は起動時に作成されるものなので除外しています (フォルダそのものは作成されませんが)、/lost+found
はファイルシステムが作成します。除外パターンをクォートで囲っているのはシェルによって展開されないようにするためで、特に SSH を使ってバックアップする場合は必須です。除外パターンの末尾に付いている *
はディレクトリが存在しなかった場合に確実に作成するよう指示します。
以下のように rsync のオプションを追加するのも良いでしょう (完全なオプションのリストは man rsync
を見てください):
- ハードリンクを頻繁に使用している場合、
-H
オプションを追加する価値があります。メモリを大量に使用するためデフォルトではオフになっていますが、最近のマシンでは問題ないはずです。/usr/
フォルダの下には大量にハードリンクが存在するため、ディスク容量が節約できます。 - 同一のバックアップフォルダで複数回コマンドを実行する場合は rsync の
--delete
オプションを追加すると良いでしょう。追加するときはバックアップ元のパスを/*
で終わらせないようにしてください。そうしないとバックアップ元ディレクトリのサブディレクトリのファイルにしかオプションの効果が適用されず、バックアップ元ディレクトリの直下にあるファイルに効果がありません。 - 仮想ディスクや Docker イメージなどのスパースファイルを使用している場合、
-S
オプションを追加するべきです。 --numeric-ids
オプションはユーザーやグループ名のマッピングを無効化して、代わりに数字のグループやユーザー ID が転送されます。SSH でバックアップする場合やライブ環境を使って別のシステムディスクをバックアップするようなときに有用です。-v
ではなく--info=progress2
オプションを使うと、膨大なファイルのリストの代わりに全体の進捗状況や転送速度が表示されます。
自動バックアップ
バックアッププログラム#Rsync タイプのバックアップを見てください。
起動要件
バックアップを起動できるようにしておくとファイルシステムが破損したりアップデートでシステムが壊れたときに便利です。また、バックアップをアップデートのテストベッドとして [testing] リポジトリを有効にするなどして使うこともできます。システム全体を起動したい別のパーティションやドライブに転送したら、後はバックアップの /etc/fstab
とブートローダーの設定ファイルを更新するだけで起動させることができます。
fstab の更新
再起動しないで、バックアップの fstab を編集して変更を反映させます:
/path/to/backup/etc/fstab
tmpfs /tmp tmpfs nodev,nosuid 0 0 /dev/sda1 /boot ext2 defaults 0 2 /dev/sda5 none swap defaults 0 0 /dev/sda6 / ext4 defaults 0 1 /dev/sda7 /home ext4 defaults 0 2
rsync で root ファイルシステム全体を再帰的にコピーしているので、sda
のマウントポイントは全て問題があり、バックアップの起動に失敗します。以下の例では、問題のあるエントリを全て単一のエントリに置き換えています:
/path/to/backup/etc/fstab
tmpfs /tmp tmpfs nodev,nosuid 0 0 /dev/sdb1 / ext4 defaults 0 1
適切なデバイス名とファイルシステムタイプを使うようにしてください。
ブートローダーの設定ファイルの更新
このセクションではシステムを他のドライブやパーティションにバックアップして、現在のブートローダーが問題なく動作することが前提で、バックアップからも起動できるようにします。
Syslinux の場合、現在使用しているエントリを複製するだけです。別のドライブやパーティションを使うように設定してください。
GRUB の場合、自動的にメインの設定ファイルを再生成することを推奨します。
/boot/grub/grub.cfg
の新しいメニューエントリを確認してください。UUID が新しいパーティションになっていることを確認します。変えられていないと古いシステムが起動してしまいます。パーティションの UUID は以下のようにして確認してください:
# lsblk -no NAME,UUID /dev/sdb3
/dev/sdb3
は使用するパーティションに置き換えて下さい。GRUB から起動できるパーティションの UUID を確認するには、grep を使用:
# grep UUID= /boot/grub/grub.cfg
lsblk で確認したパーティションが grep で確認できないときは、grub-mkconfig が正しく機能していません。複製したファイルシステムに chroot して mkinitcpio を使う必要があります。例えば、rsync を使って root を /dev/sdb3
に複製した場合、以下のように mkinitcpio を使います:
# mkdir /mnt/arch # mount /dev/sdb3 /mnt/arch # cd /mnt/arch # mount -t proc proc proc/ # mount --rbind /sys sys/ # mount --rbind /dev dev/ # chroot /mnt/arch /bin/bash # mkinitcpio -p linux
終了後、再度 grub.cfg を生成して新しい UUID が記述されていることを確認してください。
最初の起動
コンピュータを再起動してブートローダーから適切なエントリを選択してください。これで初めてシステムがロードされます。周辺機器が全て検出されて /
に空のフォルダが作成されます。
/etc/fstab
を再度編集することで先に削除したパーティションやマウントを追加することができます。
HDD から SSD (ソリッドステートドライブ) にデータを転送した場合、TRIM を忘れずに有効化してください。また、HDD や tmpfs のマウントポイントを使うことで SSD の摩耗を減らすことができます。詳しくはパフォーマンスの最大化#ファイルを tmpfs に再配置するやソリッドステートドライブ#SSD の読み書きを最小化するヒントを参照。
参照
- Howto – local and remote snapshot backup using rsync with hard links Includes file deduplication with hard-links, MD5 integrity signature, 'chattr' protection, filter rules, disk quota, retention policy with exponential distribution (backups rotation while saving more recent backups than older)