rsyncでバックアップ

今回、僕が試みたケースは、rsyncを使って、『メインに使っているデスクトップ機のデータ』(以下、『メイン機の方の~』、『バックアップ元』、ないし、"/home/graviton1/") を、LAN内の『サブ的なデスクトップ機のホームディレクトリ』(以下、『サブ機の方の~』、『バックアップ先』、ないし、"192.168.x.x:/home/graviton2")にバックアップしよう、ということです。

ちなみに、両方とも、同じヴァージョンのXubuntuの、同じ日本語Remixなデスクトップ版で、ホームディレクトリの中身も、(ドットファイル等以外は、)同じディレクトリ構成で、同じように英語表記にしてあります。

それと、この手のテキストではお約束のヒトコトなのですが、以下内容中のユーザ名、IPアドレス、ディレクトリなどは、各々の環境にあわせて読み替えてください。

簡単な使い方と主な注意

まず、バックアップに使ったコマンドは、以下。

$ rsync -av /home/graviton1 --exclude '.*' --delete graviton2@192.168.x.x:/home/graviton2/

使い方は、上のように、普通に、$ rsync -オプション類 バックアップ元 オプション類 バックアップ先、ないし、復元の際には、$ rsync -オプション類 バックアップ先 オプション類 復元先、なのだけれど、ここで、一つ注意が必要。

バックアップ元ディレクトリの末尾に、スラッシュ記号をつけるかつけないかで、対象のディレクトリ自体をどう扱うかが決まってしまうようなので、気をつけないといけない。

バックアップ元の末尾に、スラッシュをつけると、ディレクトリ『graviton1』自体はコピーされず、その中に有るファイルとディレクトリだけがコピーされ、バックアップ先に送られる。

対して、末尾に、スラッシュを付けずに行うと、ディレクトリ『graviton1』自体もまた、(別段指定がなければ、同じディレクトリ名のまま、)コピーされていくのだ。……って、何よ? 何言ってるのか、さっぱり分からん。

僕も、ここで、大いにこんがらがったので、図解。今回は、下のようなディレクトリを考えた場合のお話ですね。こんなんなってます。

home
└graviton1
    ├Desktop
    ├Documents
    │  ├file1.txt
    │  ├file2.ods
    │  ├file3.csv
    │  └……
    ├Pictures
    │  ├file1.jpg
    │  ├file2.png
    │  └……
    ├Music
    ├……
    └……

で、今回は、『graviton1』以下の中身をバックアップしたいわけですが……。スラッシュをつけると、保存されるのは、以下。

    Desktop
    Documents
        ├file1.txt
        ├file2.ods
        ├file3.csv
        └……
    Pictures
        ├file1.jpg
        ├file2.png
        └……
    Music
    ……
    ……

次に、スラッシュをつけないでやると、以下。

   graviton1
    ├Desktop
    ├Documents
    │  ├file1.txt
    │  ├file2.ods
    │  ├file3.csv
    │  └……
    ├Pictures
    │  ├file1.jpg
    │  ├file2.png
    │  └……
    ├Music
    ├……
    └……

分かってもらえるだろうか? つまり、アーカイブの一番上の入れ物が、付属するか、しないかの違い。

この差がどのような状況を生むのか。メイン機の方の稼働環境をサブ機の方のユーザにコピーしたいなら、スラッシュ付きのほうがことは早いし、ただ、メイン機の方のホームディレクトリのアーカイブを保存したいだけなら、スラッシュなしのほうがまとまりがいい、かもしれない。

オプション類の解説

改めて、コマンドの方を見てみましょ。

$ rsync -av /home/graviton1 --exclude '.*' --delete graviton2@192.168.x.x:/home/graviton2/

こちらですね。

まずは、一番最初の -av。これは、a がアーカイブモード。ディレクトリ構成は元より、パーミッションやグループの情報などを保持したままコピーします……というもの。次の v は、処理中のファイル名などを端末内に表示します。すなわち、verboseのvです。

それから、バックアップ元のディレクトリの指定。先の話の通り、ディレクトリ末尾のスラッシュを外してますんで、ディレクトリ『graviton1』の中に入った状態で、アーカイブされます。

次に--exclude '.*'という文字列。バックアップ対象から、シングルクオートで囲まれた中のパターン(今回は '.*' で、名前の頭にドット(.)のついた、隠しディレクトリ、隠しファイルのようなものをさしてますが)に一致するものを除外(exclude)します。もちろん、逆に、『さらにバックアップ対象に加える』ファイルを指定するために、--includeなどというのもあります。これらは、外部ファイルで指定することも可能です。

続いて、--delete 。バックアップ元から消されたファイルは、バックアップ先からも消す……というオプションで、例えば、何度目かのバックアップの前に、バックアップ元からMusicディレクトリの中のfile1.oggを消した……という状態で、--deleteオプションをつけて、rsyncを掛けると、バックアップ先にあるMusic/file1.oggも消去するよと。

そして、最後に、バックアップ先の指定が入って……という形です。今回の例の場合を解説すると、バックアップ先マシンのユーザ名(graviton2)、@記号、バックアップ先マシンのIPアドレス、コロン記号、アーカイブを保存するディレクトリ、という形。

ちなみに、バックアップ先へは、デフォルトでsshで以て接続しますんで、それで問題がなければ、特別なオプションや操作は要りません。

バックアップを復元

バックアップを取ったからには、有事の際には、復元するのです。バックアップしたファイルを、何らかのトラブルから復旧したマシンに戻す、という体だと、以下のようになる。

$ rsync -av graviton2@192.168.x.x:/home/graviton2/ /home/graviton1/

行き来を逆さにすれば、帰ってくるでしょ。(復元も、バックアップ元から操作)