rsyncは、差分符号化というアルゴリズムを用いた差分転送ツールです。 rsyncを使用することで遠隔サーバ上のファイルやディレクトリを同期することができ、 この機能を利用することで簡単にバックアップを実現ができます。
また、差分バックアップされるため、初回に全体をバックアップしますが、 2回目以降は、転送量が削減されます。
rsync [OPTIONS] [[USER_NAME@]HOST_NAME:]SRC_DIR DEST_DIR
rsync [OPTIONS] SRC_DIR [[USER_NAME@]HOST_NAME:]DEST_DIR
バックアップしたい転送元ディレクトリと、 バックアップを保存したい転送先ディレクトリを指定します。 転送先か転送元がリモートホストの場合は、以下のように指定します。
<リモートホストのユーザ名>@<リモートホスト名>:<転送元または転送先>
例)
rsync -av /home/user_1 user_1@192.168.0.2:/home/user_1/backup
これは/home/user_1のuser_1というディレクトリを192.168.0.2というホストの /home/user_1/backupディレクトリ内に転送します。
上記の例ではuser_1ディレクトリ自体を転送しますが、これを少しだけ変えて、 以下のようにするとuser_1の中身だけが転送されます。
rsync -av /home/user_1/ user_1@192.168.0.2:/home/user_1/backup
注意するとともに用途に応じて使い分けが必要です。
リモートのホストに同じユーザ名が存在するのであれば、user_1@の部分は省略できます。
よく使うオプションは-a, -v, --delete, -n, --excludeと言ったところです。
中でも最もよく使うオプションは、aとvです。 この後の例でもオプションaとvを指定していますが、aはrlptgoDの省略形で、 ごく一般的なオプションがすべて入っている便利なオプションです。
vはverboseで進行中の状態が表示されます。-v,-vv,-vvvとvを増やすと情報量が増えます。
特定のファイルを除外したい場合は、--exclude=".swap"といったように--excludeで除外したりできます。 また、--filter-from, --include-from, --exclude-fromを使うことで、 ファイルに記述した細いルールで対象ファイルを指定することができます。 この辺りは本格運用のためによく調べて利用してください。
これらのルールが心配であれば-n(--dry-run)オプションで何がバックアップされるかを確認することが出来ます。
rsync -avn --exclude="ルール" /home/user_1/ user_1@192.168.0.2:/home/user_1/backup
で確かめて、以下で実行するという流れがよいかもしれません。
rsync -av --exclude="ルール" /home/user_1/ user_1@192.168.0.2:/home/user_1/backup
deleteオプションについては後述します。
基本の挙動を理解するために、ローカルでの操作を使って説明します。 リモートで実施する場合は、転送元か転送先をリモートホストの指定方法に変えてください。 まず作業用ディレクトリとテスト用のファイルを作ります。
$ mkdir src
$ mkdir dest
$ echo "src_file" > src/src_file_1
$ ls src
src_file_1
srcが転送元でdestが転送先のディレクトリです。 転送元のディレクトリ(src)にはsrc_file_1というファイルがあります。
$ rsync -av src dest
building file list ... done
src/
src/src_file_1
sent 160 bytes received 48 bytes 416.00 bytes/sec
total size is 9 speedup is 0.04
確認してみます。
$ ls dest
src
$ ls dest/src
src_file_1
destディレクトリにsrcディレクトリが出来ていて、ディレクトリの中にsrc_file_1が存在していることから、 想定通り転送されていることがわかります。
元のファイルにさらに変更を加えてみます。
$ echo "add data" >> src/src_file_1
$ diff src/src_file_1 dest/src/src_file_1
2d1
< add data
これも転送します。
$ rsync -av src dest
building file list ... done
src/src_file_1
sent 163 bytes received 42 bytes 410.00 bytes/sec
total size is 18 speedup is 0.09
きちんと転送されたか確認してみます。
$ diff src/src_file_1 dest/src/src_file_1
(何も表示されません)
何も表示されないのでちゃんと変更分が転送されたことがわかります。
新しいファイルを作ってさらに転送してみます。
$ echo "next_file" > src/src_file_2
$ rsync -av src dest
building file list ... done
src/src_file_2
sent 163 bytes received 42 bytes 410.00 bytes/sec
total size is 28 speedup is 0.14
$ ls dest/src
src_file_1
src_file_2
ちゃんと転送されていることがわかります。
では、転送もとでファイルが削除された場合はどうなるのでしょうか?
$ rm src/src_file_2
$ ls dest/src
src_file_1
src_file_2
この時点ではまだ同期されていませんので転送先では削除されていません。 ここでこれまで通り、rsyncをかけてみます。
$ rsync -av src dest
building file list ... done
sent 99 bytes received 20 bytes 238.00 bytes/sec
total size is 18 speedup is 0.15
$ ls dest/src
src_file_1
src_file_2
結果は、転送先で、転送もとでのファイル削除は反映されていません。
実は、rsyncはファイルを勝手には削除しません。 これはrsyncがバックアップと同期の機能を明確に分けているからです。
バックアップではなく同期として使うには別オプションが必要です。
バックアップと同期は混同されがちではありますが、 まったくことなった概念です。 これまでの説明で使っていたのはバックアップに適しています。 逆に同期に使うためには--deleteオプションを追加します。
転送もとでの削除を転送先に反映するためには、--deleteオプションが必要です。
$ rsync -av --delete src dest
building file list ... done
deleting src/src_file_2
sent 99 bytes received 20 bytes 238.00 bytes/sec
total size is 18 speedup is 0.15
$ ls dest/src
src_file_1
結果、src_file_2は削除されました。
以上が、最も基本的なrsyncの使い方でした。