rsyncコマンド

2011.12.19 0:35

同サーバー内でのバックアップ

 rsyncはバックアップとったりするのにとても便利です。コピーだと削除したファイルをそのままにマージしてしまうし、完全同期という意味ではrsyncが一番いいです。
 rsyncはcpと基本的には同じ使い方で、
rsync <コピー元> <コピー先>
という使い方ですが、オプションがいろいろあってそれを設定しないとrsyncのよさが出てこないので解説します。

-v バックアップ中にコピーしているファイル名を表示する
-r 指定したディレクトリ以下を再帰的にコピーする
-l シンボリックリンクはそのままコピーする。指定しないとリンク先の実体がコピーされる
-H ハードリンクはそのままコピーする。指定しないとリンク先の実体がコピーされる
-p パーミッション属性をたもったままコピーする
-o 所有者属性をたもったままコピーする。指定しないと属性はコピーしたユーザーのものになる
-g グループ属性をたもったままコピーする。指定しないと属性はコピーしたユーザーのものになる
-t タイムスタンプをたもったままコピーする
-D デバイスファイルをたもったままコピーする
-z データを圧縮して転送する
-u 追加されたファイルだけをコピーする
-a 上記のオプションで「rlptgoD」を同時に指定する
--existing 更新されたファイルだけをコピーし、追加されたファイルは無視する
--delete コピー元で削除されたファイルは、コピー先でも削除する。-aオプションと同時に指定するとコピー元とコピー先を同期できる
--exclude '**' **に一致するファイルはコピーしない。「*.bak」「*~」など特定のファイルを除外したいときに使う
--stats コピーの結果を表示する。指定しないといっさいのメッセージは表示されない
-e ssh 暗号化してファイルを転送する。コピー先としてネットワークでつながった別のホストを指定するときに使う
と山ほどあるオプションですが、基本的は、
rsync -a --delete --exclude '<コピーを除外するファイル>' <コピー元> <コピー先>
が最もポピュラーな同期方法です。
-aでもって、再帰的コピー、シンボリックリンクをそのままコピー、パーミッションコピー、更新時間をそのままコピー、グループをコピー、所有者(ユーザー)をコピー、デバイスファイルを保ったままコピー、します。だいたいこれで全部揃っています。
--deleteで、コピー元で削除されたファイルは、コピー先でも削除します。
--excludeで、何らかの原因でコピーできないファイルなんかを指定しておきます。エラーで処理が止まったりするので。

注意点は、パスの指定の際の最後の/(スラッシュ)の使い方にくせがあるのでご注意です。ディレクトリを含めてまるごとコピーしたい場合は最後のスラッシュなし。ディレクトリ以下のファイルをコピーしたい場合はスラッシュありです。
  • そのディレクトリも含めてコピーしたい場合:「/」なし
  • そのディレクトリ以下のツリーをコピーしたい場合:「/」あり
rsync -a --delete /var /media/disk/system_backup
の場合は、/media/disk/system_backup/varという風にコピーされます。これが、
rsync -a --delete /var/ /media/disk/system_backup
にしてしまうと、/varの中身のファイルが全部ばらけて、/media/disk/system_backupにコピーされます。varディレクトリは作成されません。



私は以下のような感じで使っています。
#!/bin/bash

#シェルのrsyncでホームディレクトリ以下を同期
#/home/username/.gvfsはgnomeのマウントポジションらしいのでコピーできないので除外
#-aですべての属性を同期。--deleteでコピー元の削除ファイルはコピー先でも削除
#$rsync = `rsync -av --exclude '.gvfs' --delete /home /media/disk/`;

rsync -a --delete --exclude '.gvfs' /home /media/disk/system_backup
rsync -a --delete /etc /media/disk/system_backup
rsync -a --delete /root /media/disk/system_backup
rsync -a --delete /var /media/disk/system_backup


# メール送信
address="username@gmail.com"
subject="cronは効いているか?"

mail -s "$subject" $address << TXT
script: /root/bin/backup/rsync-system.sh

rsync -a --delete --exclude '.gvfs' /home /media/disk/
rsync -a --delete /etc /media/disk/
rsync -a --delete /root /media/disk/
rsync -a --delete /var /media/disk/
TXT

exit

リモートサーバー間で同期する

 scpもいいのですが差分をとって同期してくれるrsyncは結構すぐれものです。大容量の場合、こっちを使った方が断然負荷は少ないです。





プロフィール



  • Name :: 山上オサム ♂(39)
  • Hobby :: 武術
  • Work :: Web Designer