rsyncを使ってバックアップ

rsync はファイルのバックアップやシンクロナイズのための道具です。(さまざまな *Nix の上で使うことができます)。> rsyncにできないこととして、リモートシステムから別のリモートシステムへのコピーがあげられます。 どうしてもという場合、一旦元のリモートシステムのファイルをローカルシステムにコピーしてから、そこからコピー先のリモートシステムにコピーすることが必要です。これがrsyncを使う上での制限事項です。

aptosid ではバックアップのプロセスを始めるのにDIY か、または Debian sid のパッケージを使うかの、二通りのやり方があります。:

luckybackup のパッケージを使う方法:
apt-get install luckybackup

luckybackup のホームページ.

ここから先は DIY のやり方です

ここではrsyncの使い方についての基本とバックアップのためのスクリプトの例を示します。

rsyncは簡単に使えるバックアップ用のプログラムで、ファイルやディレクトリを素早くバックアップできます。 変更のあったファイルをチェックする賢いルーチンがあって新しくバックアップが必要なファイルだけを選んでコピーします。 さらに(-zオプションを使えば)圧縮ユーティリティを使ってより素早くコピーします。 この点については後ほど:

rsyncは(サイズまたは変更日時などの)属性が変わったファイルとフォルダーをバックアップが必要なファイルとして探知します。 このプロセスはとても素早く行われます。

一度このリストができてしまえば、変更のあったファイルのコピーは圧縮プロセスのおかげでとても早く行われます。 rsyncはその場で送信前にまず変更ファイルを圧縮し、受信後に展開します。

rsyncのバックアップは:
* 同一のシステム上のファイルのコピー
* ローカルシステムからリモートシステムへのコピー,
* リモートシステムからローカルシステムへのコピー
ができます。

rsyncはデフォルトのsshクライアントか, または両方のシステム上で動いているrsyncデーモンのいずれかを使います。 manページには、sshのログインができるシステムならばrsyncもそのシステムにアクセスできると書いてあります。

rsyncにできないこととして、リモートシステムから別のリモートシステムへのコピーがあげられます。 どうしてもという場合、一旦元のリモートシステムのファイルをローカルシステムにコピーしてから、そこからコピー先のリモートシステムにコピーすることが必要です。これがrsyncを使う上での制限事項です。

具体的な例をあげてみましょう、三つのシステム;

neo      – ローカルシステム
morpheus – リモートシステム
trinity  – リモートシステム

があったとして、rsyncをつかって全部のシステムの /home/[user]/Dataフォルダーの内容をコピー、または同期を取ることにします。 それぞれのシステムで[User]がフォルダーのオーナーであること、つまりユーザーがそれぞれのフォルダーを使っていることを前提にして、それぞれのシステムを他の二つのシステムのソースとして使います。 また、rsyncのコマンドはあなたがいる"ローカルシステム"、つまりneoからだけ実行します:

neoのユーザーはcuddles,
morpheusのユーザーはtartie,
trinityのユーザーはtaylarとします。

次のようにバックアップを、または同期を取ります:

neo's /home/cuddles/Data area to morpheus and trinity,
morpheus's /home/tartie/Data area to neo and trinity,
trinity's /home/taylar/Data area to neo and morpheus.

rsync がリモートシステムから他のリモートシステムにファイルをコピーできない問題は、上の例ではまず trinity から morpheus にまたはその逆方向にファイルをコピーしたいときに起こります。(コピー元もコピー先もリモートであるため)。つまり:

neo --> morpheus – OK ローカルからリモートへ
neo --> trinity  – OK ローカルからリモートへ
morpheus --> neo – OK リモートからローカルへ
trinity  --> neo – OK リモートからローカルへ
morpheus --> trinity  – リモートからリモートへ - ダメ
trinity  --> morpheus – リモートからリモートへ - ダメ

これを解決するには少し上の表を変更する必要があります。 次のようにすればOKです;

morpheus --> trinity – の代わりに: morpheus --> neo & neo --> trinity
trinity --> morpheus – の代わりに: trinity  --> neo & neo --> morpheus

これだと直接のコピーより手数は少々かかりますがファイルはいずれneoにも転送されることを考えれば結果には変わりありません。 もちろんバックアップが正常に行われた場合の結果ですが。

バックアップの手順を計画するとき、rsyncのこの制限事項を考慮に入れる必要があります。

rsyncに使うホストネームの登録

neoとmorpheusとtrinityという名前をIPアドレスの代わりに使えればコマンドはずっと読みやすくすっきりします。 これは簡単にできます。

/etc/hostsというファイルを編集し、ここにホストネームとIPアドレスを書き込みます。 このファイルの初めの部分をちょっと見てください。 このようにしてホストネームからIPアドレスへの変換を登録します:

192.168.1.15	 neo
192.168.1.16	 morpheus
192.168.1.17	 trinity

一行めは192.168.1.15のIPアドレスを“neo”という名前に、二行目は192.168.1.16を“morpheus”という名に、最後の行は192.168.1.17のIPアドレスを“trinity”と名付けます。 この3行を加えて /etc/hosts を保存すると、これからIPアドレスの代わりに名前を使うことができます。 もちろんIPアドレスを使いつづけることもできます。 本当に便利なのはたとえばneoがIPアドレスを192.168.1.15から192.168.1.25に変えた時、このファイルの一行を直すだけでこの名前を使っているコマンドやスクリプトを変更なしで使い続けられることです。

もしスクリプトにIPアドレスを直接書き込んであると、変更のたびにアドレスを探して書き換えなければなりませんが、かわりに名前を使っていれば、/etc/hostsのアドレスを変更するだけでスクリプトは全部そのまま動きます。 たくさんのリモートシステムに接続するスクリプトのメンテナンスなどに特に役に立ちます。 それだけでなく、名前を使ったスクリプトの方が読みやすく、また数字で示されるIPより理解もしやすくなります。

rsyncの二つの使い方

一つはファイルをターゲッにコピーする“push”と呼ばれる方法で、もう一つはファイルをリモートシステムからコピーする“pull”と呼ばれる方法です。 それぞれに有利な点と不利な点があります。 具体的な例で見てみましょう。

“push” - 元になるファイルとフォルダはローカルシステムにあって、これを離れた場所のリモートシステムに送ります。 rsyncコマンドはローカルシステムで実行し、ファイルをリモートシステムに"push"します。

有利な点:
* 複数のシステムから一つのターゲットシステムににバックアップのコピーを作れること。
* ネットワークシステム全体のバックアップの負担を各コンピュータに分散でき、バックアップ先のコンピュータだけが過剰な負担を持たないですむこと。
* 速いコンピュータはその分だけ早くバックアップを終了し、すぐ他の仕事を始めることができること。

不利な点:
* バックアップをスクリプトからcronから定期的に実行している場合、変更があるたびにそれぞれのコンピュータのcrontabやスクリプトを更新する必要があること。
* ターゲットシステムのマウントや残りスペースのチェックができないためバックアップに失敗する可能性があること。

“pull” - リモートシステムにコピー元のファイルやフォルダーがあって、これをローカルシステムにバックアップする。 rsyncコマンドはローカルシステムで実行され、ファイルをリモートシステムから"pull"する。

有利な点:
* 一つのシステムがバックアップサーバーとなって、ネットワークシステム全体のバックアップを制御できること。 集中制のバックアップ。
* スクリプトを使う場合、一つのシステムだけの、たった一つのスクリプトで済み、変更や更新の際の手間が少ない。 定期的な実行のためのcrontabも一つですむこと。
* 必要な場合バックアップ先のパーティションのマウントやチェックができること。

rsyncのシンタックス, manページからの抜粋:
       rsync [OPTION]... SRC [SRC]... DEST

       rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST

       rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST

       rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST

       rsync [OPTION]... SRC

       rsync [OPTION]... [USER@]HOST:SRC [DEST]

       rsync [OPTION]... [USER@]HOST::SRC [DEST]

       rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
rsyncコマンドの具体例:
rsync -agEvz --delete-after --exclude=”*~” morpheus:/home/tartie /media/sda7/SysBackups/morpheus/home

このコマンドを詳しく見てみましょう:

コピー元のファイルのパスは: morpheus:/home/tartie
ターゲットは: /media/sda7/SysBackups/morpheus/home

/home/tartie にあるファイル全てが /media/sda7/SysBackups/morpheus/homeにバックアップされ、次のようなフォルダになります:

/media/sda7/SysBackups/morpheus/home/tartie...

ここで tartie が home のサブディレクトリとしてバックアップされるのはソース(コピー元)のパラメータのためではなく、ターゲット側のパラメータに home が指示されているためです。ソースのパラメータはバックアップするファイルの場所を示すだけで、どこに保存されるかには影響しません。 ターゲット側のパラメータだけがコピー先のファイルの保存場所を指定します。 もう一つの例を見てみましょう:

rsync [...] /home/user/data/files /media/sda7/SysBackups/neo

このコマンドではコピー元の files というフォルダとその下のサブフォルダだけが、コピー先の neo の下にコピーされます。 /media/sda7/SysBackups/neo/home/user/data/files にではありません。

rsyncを使うバックアップコマンドを作るときはこのことを考慮に入れてください。

オプションについての説明:
-a はアーカイブモードを示します。 manページではこのオプションは「簡単にいってファイルを再帰的にバックアップして
   "ほとんど"すべてを保存する」と説明されています。 ハードリンクは複雑な処理を理由に保存されないと書いてあります。
-a オプションは -rlptgoD のオプションと同じだと書かれています。 つまり:
  -r = ricursive – コピー元の場所から下のサブフォルダを全てバックアップします。
  -l = links – シンボリックリンクがあったら保存先でも同じリンクを作成します。
  -p = permission – rsyncは保存先でもファイルのパーミッションを元の通りにセットします。
  -t = times – rsyncは保存先のファイルの時間データを元の通りにセットします。
  -q = quiet – 最小限必要なだけのメッセージを表示します。
	  	この後ろに -v オプションをつけてメッセージ表示のレベルを変えることもできます。
  		"v"を取り除けばメッセージを表示しないようにセットできます。
  -o = owner – rootとして実行された場合、コピー先のファイルのオーナーを元のファイルの通りにセットします。
-D = これは --devices と --specials の二つのオプションを書いたのと同じです。
 --devices = コピー元の文字デバイスとブロックデバイスをターゲットに転送して同じデバイスを作ります。
	  残念なことに --super オプションもついている場合でないとこのオプションには何の効果もありません。
 --specials = named sockets や fifo といった特殊ファイルもコピーします。
-g オプションはコピー先のファイルのオーナーグループ属性も保存します。
-E オプションはコピー先のファイルの実行可能属性も保存します。
-v は表示されるメッセージのレベルを変更します。
   テストがうまく言って望むべきファイルが全てバックアップされることが確認できたら、"v" を取り除くことができます。
   ここではプロセスがcronから実行されるため、どのファイルがコピーされたかあとでチェックできるように
   わざと "v" をのこしてあります。  お好みに応じて決めてください。
-z オプションはコピーするファイルを圧縮します。 これによって転送されるファイルのサイズが小さくなって
   バックアップのスピードが早くなります。
--delete-after = コピー先のファイル/フォルダでコピー元にないものを自動的に消去します。
   消去はデータ転送の前でなく、転送が済んだ後("after")に行われます。 これはバックアップ中の事故などに備えるもので,
   "delete"はコピー元ですでになくなったファイルがいつまでもコピー先に残らないように掃除するオプションです。
--exclude = コピー対象から除くファイル名のパターンを指示します。  上の例では --exclude=“*~” で最後に'~'がつく
   ファイルとフォルダーをバックアップ対象から除きます。
一つの --exclude オプションにつき一つのパターンだけを指示できるので、いくつかのパターンの
   ファイル名を除きたいときはあらためて別の --exclude オプションを続けます。

さらに他にも便利なオプションがあります:

-c – オプションを使うとバックアップが終わったあと追加のチェックとしてコピー元のファイルと比較をおこないます。
   ただこれによりバックアップに余計に時間がかかり、またrsyncはバックアップ処理の一部として既にファイルの比較を行うので、
			実際のところこのオプションはただ処理のスピードを落とすだけなので、上の例には使われていません。
--super – これはmanページにもあるように、コピー先のシステムにsuper-userとしてふるまいいます。
--dry-run – これは実際のコピーを行わずに、このコマンドでコピーされるファイル名の表示だけするオプションで、
   apt-get install や apt-get dist-upgrade の-sオプションのように使うことができます。

上の例のコマンドの残りの部分はコピー元のファイル/フォルダ名と、とコピー先のフォルダの場所だけです。

コマンド例:
rsync -agEvz --delete-after --exclude=”*~” morpheus:/home/tartie /media/sda7/SysBackups/morpheus/home

このコマンドは"morpheus"という名のシステムの/home/tartieの下にあるファイルとフォルダーのうち名前の最後が'~'なファイルを除いたすべてを、ローカルシステムに転送し、/media/sda7/SysBackups/morpheus/home というフォルダにもとのディレクトリツリー構造のまま保存します。

rsync -agEvz --delete-after --exclude=”*~” /home/tartie neo:/media/sda7/SysBackups/morpheus/home

このコマンドは一つ上の例の反対で、/home/tartie フォルダを"push”して、そこにあるファイルとフォルダを"neo"という名のシステムに転送しコピーします。 パスの前に":"(コロン)がつくとリモートシステムとして取扱います。

rsync -agEvz --delete-after --exclude=”*~” /home/cuddles /media/sda7/SysBackups/neo/home

このコマンドはローカルからローカルへ、同じシステム上のバックアップを行います。 コピー元とコピー先のフォルダのパスの前に":"(コロン)がないことに注目してください。 このコマンドは同一のシステム上で /home/cuddles のファイルを/media/sda7/SysBackups/neo/homeにバックアップします。

複数の --exclude コマンドを使う例を見てみましょう:

rsync -agEvz --delete-after --exclude=”*~” --exclude=”*.c” --exclude=”*.o” "/*" /media/sda7/SysBackups/neo

このコマンドだとローカルシステムのrootから下の全てを/media/sda7/SysBackups/neo にバックアップします。 ただし最後が “~”, “.c” または “.o”のファイル名のファイルは除外します。

次の例は、リモートシステムからリモートシステムへ転送しようとする間違った使い方です。 実行すればエラーになるはずで、このようなrsyncの使い方は避けるべきです:

rsync -agEvz --delete-after --exclude=”*~” morpheus:/home/tartie trinity:/home

上に述べた通り、これはrsyncの使用にあたっての制限事項です

最後の例としてシステムの"名前"の代わりにIPアドレスを使うとどうなるか見てみましょう。

二行のうち一つ目は"名前"を使った例、二つめは同じコマンドのIPアドレスを使った例です

rsync -agEvz --delete-after --exclude=”*~” morpheus:/home/tartie /media/sda7/SysBackups/morpheus/home
rsync -agEvz --delete-after --exclude=”*~” 192.168.1.16:/home/tartie /media/sda7/SysBackups/morpheus/home

前にも述べたように、ホストネームを使う必要はありませんが、上の例でもコマンドの実行する内容がずっと読みやすくなると思いませんか?

ここまで読んだあなたは上の例を参考に、それぞれのバックアップの必要に応じて変更を加えた簡単なスクリプトを自分で用意できると思います。

Page last revised 14/08/2010 0100 UTC