同サーバー内でのバックアップ
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



