rsync でディレクトリの同期(バックアップ)
目次 |
rsync コマンドは、コピー元ディレクトリと、コピー先ディレクトリを同期させることができる。
- 同期させるディレクトリはローカルのディレクトリだけでなくリモートのディレクトリを指定することができる。
- ssh を使い、ローカル - リモート間を暗号化することができる。
- rsync をデーモンモードで動作させることで、rsync サーバとして運用が可能。
- インクリメントバックアップすることもでき、更新される古いファイルを別ディレクトリにバックアップすることができる。
書式
rsync [option] SOURCE [SOURCE]... DEST
- SOURCE はコピー元ディレクトリ、DEST はコピー先ディレクトリ。
- SOURCE は 複数選択可能。
- コピー元、コピー先のどちらかがリモートマシンになった場合、リモートマシンにも rsync コマンドが必要。
DEST の変更が SOURCE に影響を与えることはないので、SOURCE をオリジナル、DEST をコピー(バックアップ)にすると安全にバックアップできる。 |
option
- -v, --verbose
- コピーするファイル名を標準出力する。
- -a, --archive
- -rlptgoD と同義。(--recursive --links --perms --times --group --owner --devices)
- -r, --recursive
- ディレクトリを再帰的にコピーする。このオプションを指定していないと、rsync はディレクトリを全くコピーしない。
- -l, --links
- シンボリックリンクを DEST で作り直す。
- -p, --perms
- DEST のパーミッションを SOURCE と同じにする。
- -t, --times
- ファイルの転送時に、修正時間情報もリモートへ転送する。
- -g, --group
- DEST の所有グループを SOURCE と同じにする。スーパーユーザで実行しないと所有グループを変更できない。
- グループ ID (GID) を使う場合は --numeric-ids オプションを追加する。
- -o, --owner
- DEST の所有者を SOURCE と同じにする。スーパーユーザで実行しないと所有者を変更できない。
- ユーザ ID (UID) を使う場合は --numeric-ids オプションを追加する。
- -D
- デバイスファイルとスペシャルファイルを維持する。
- --devices --specials と同義。
- -H, --hard-links
- ハードリンクを維持する。
- -I, --ignore-times
- 通常 rsync は、同じファイルサイズと同じ修正時間のファイルは処理をスキップするが、このオプションを付けると、すべてのファイルをアップデートするようになる。
- --numeric-ids
- 数字の uid と gid を使う。
- -E
- リソースフォークもコピー(Mac OS X 10.4 以降 OSX のマイナーバージョンに注意)
- --exclude=PATTERN
- パターンに一致するファイルをコピーしない。
- --delete
- --delete オプションを付けると、SOURCE でファイルを削除すると、DEST のファイルも削除する。
- --exclude=PATTERN オプションで処理しないファイルを指定していても、--delete-excluded で削除することができる。
- --recursive オプションが選択されていない場合、このオプションに効果はない。
- このオプションを使う前に、-n (--dry-run) オプションを使い重要なファイルが削除されないか確認してからおこなうこと。
- SOURCE で I/O エラーが発生すると、DEST での削除はおこなわれなくなる。
- これは、SOURCE でのファイルシステムの問題 (NFS エラーなど) が、DEST のファイルを大量に削除することを防ぐ。
- --ignore-errors オプションでエラーを無視することができる。
- --delete-excluded
- --exclude=PATTERN オプションで除外するファイルについても、DEST にあれば削除する。
- (--exclude=PATTERN しているファイルは rsync の処理から除外されるため、SOURCE に無くて DEST にあっても、--delete で消去されることは無い。しかし、--delete-excluded すると --exclude=PATTERN で rsync の処理から除外されたファイルも削除する。)
- --update
- DEST のファイルを更新しても、SOURCE のファイルで上書きされない。
- DEST のファイルが SOURCE のファイルよりも新しい日付で存在している場合、コピーをスキップする。
- -z, --compress
- 転送時に gzip 圧縮を使用する。
- -R, --relative
- 相対パス名を使う。
- -n, --dry-run
- ファイルのコピーを行わず、コマンドを実行した結果(コピーするファイル名など)を標準出力する。
- -e, --rsh=COMMAND
- リモートシェルを指定する。
- --bwlimit=KBPS
- ファイルの転送(同期)に帯域制限をかける。KBytes/sec で指定する。
- --progress
- 転送(同期)中ファイルの転送速度を表示する。
- --stats
- 転送(同期)完了後に、統計情報を表示する。
- --partial
- 同期途中のファイルを残す。デフォルトでは、同期途中に同期できなくなったファイルは削除される。
- -h, --human-readable
- --progress や --stats で表示される数値を、わかりやすい単位に丸める。
- --inplace
- 同期先ファイルに上書きコピーする。
- rsync は、ファイルを同期先に一時ファイルとしてコピーし、コピー完了後に置き換える動作をする。
- --inplace オプションを付けると、同期先ファイルに直接上書きコピーするため、大サイズのファイルを同期するとき高速化される。
使用例
source ディレクトリ内のファイルを、backup ディレクトリへコピーする
rsync -av source/ backup
SOURCE は、複数指定することができる。(DEST は1つのみ。)
rsync -av SOURCE1 SOURCE2 SOURCE3... DEST
ディレクトリの同期
--delete オプションをつけると、source ディレクトリ内のファイルを削除すると backup ディレクトリ内のファイルも削除される。つまり、backup ディレクトリが source ディレクトリと同期する。
rsync -av --delete source/ backup
backup ディレクトリ内のファイルを削除しても、source ディレクトリ内のファイルは削除されない。
SOURCE で指定するディレクトリ名の最後にスラッシュを付けるか付けないか
SOURCE で指定するディレクトリ名の最後にスラッシュを付けた場合、ディレクトリ内をコピーする。
rsync -av source/ dest
スラッシュを付けない場合は、SOURCE ディレクトリごとコピーする。
rsync -av source dest
|
ssh と組み合わせリモートマシンにコピーする
-e ssh オプションを使うことで、ssh 経由でリモートマシンにコピーすることができる 。
rsync -av -e ssh source user@remote:/path/to/backup
SOURCE と DEST を逆にすれば、リモートマシンのディレクトリをローカルにコピーすることもできる。
rsync -av -e ssh user@remote:/path/to/backup local_dir
ssh により通信は暗号化されるが、オーバヘッドが大きい。 リモートマシンとのオーバーヘッドを少なくするには、rsync をデーモンモード(--daemon)で実行し rsync プロトコル(rsync://)を利用すればよい。 |
ssh の暗号化による負荷を少しでも抑えるには、暗号化方式を次のように指定する。
rsync -av -e 'ssh -c arcfour' source user@remote:/path/to/backup
rsync サーバ
rsync をデーモンモードで動作させることで、rsync プロトコル(rsync://)による リモートから or リモートへ の同期が可能になる。
ssh をリモートシェルとして利用する方法(-e ssh オプション)と比べ、暗号化によるオーバヘッドがなく高速で同期することができる。
rsync:// プロトコルでコピーor同期する方法は、rsync + ssh よりも高速で動作する。さらに、NFS + rsync(NFS マウントしたボリュームに rsync する)よりも負荷を抑えることができる。 |
rsyncd.conf
rsync をデーモンモードで動作させるための設定ファイル /etc/rsyncd.conf を作成する。
rsyncd.conf のシンプルな例
### グローバル・オプション uid = root gid = root log file = /var/log/rsyncd.log pid file = /var/run/rsyncd.pid ### モジュール・オプション [opt] comment = rsyncd server path = /opt read only = no
- rsync をデーモンモードで起動する時の uid と gid を指定する。デーモンモードはポート 873 で LISTEN するので、root で起動する必要がある。
- rsync デーモンの動作ログと、PID ファイルを指定する。
- [ ] はモジュールといい、rsync プロトコルのマウントポイントのようなもの。複数設定可能。
- path で、モジュールのルートにするパス(マウントポイント)を指定する。
- read only はデフォルトで yes なので、読み書きできるようにするには no を指定する。
デーモンモードで起動
デーモンモードで起動するには、--config で rsyncd.conf を指定し、--daemonn オプション付きで起動する。
rsync --daemon --config=/etc/rsyncd.conf
rsync サーバとの同期方法
rsync プロトコルで同期する方法は、次のようになる。
rsync -av source rsync://192.168.1.2/backup
- module は rsyncd.conf で設定した [モジュール名] を指定する。フルパスではないので注意。
モジュールの指定例
rsyncd.conf で、モジュールを次のように設定している場合
[backup] path = /path/to/backup
rsync サーバの /path/to/backup ディレクトリに同期させるには次のように記述する。
正しい同期方法
rsync -av source rsync://192.168.1.2/backup
間違った同期方法
rsync -av source rsync://192.168.1.2/path/to/backup
rsync://192.168.1.2/path/to/backup と記述すると、path モジュールの to/backup ディレクトリと同期することになる。 |
rsync サーバのセキュリティ対策
デフォルト設定の rsync サーバは、ポート番号 873 で LISTEN、ユーザー認証なしで同期可能になっている。
セキュリティ対策としては
- 同期元アドレスを限定する。
- 同期時にユーザー認証を必要とする。
- LISTEN するポート番号を変更する。
などがある。
rsync プロトコルは、フルパスではなくモジュール名を指定し同期させるため、モジュール名がわからなければ同期はできない。 |
同期元アドレスを限定する設定
rsyncd.conf で、allow/deny する同期元アドレスを指定することができる。
- 最初に allow が評価され次に deny が評価される。
- デフォルトではすべての同期元アドレスが許可されている。
- グローバル・オプションと、モジュール・オプションごとに設定することが可能。
設定例
hosts allow = 192.168.1.0/24 192.168.2.0/24 hosts deny = *
同期時にユーザー認証を必要とする設定
rsync プロトコル独自のユーザー認証を有効にする。OS のユーザーとは無関係なので注意。
rsync サーバ側の設定
- rsyncd.secrets
- ユーザー認証するユーザー名とパスワードを記述しておくファイル。
rsync.secrets ファイルの所有者は rsync デーモンを実行するユーザーに設定し(rsyncd.conf の uid)さらに、ファイルのパーミッションを 600 にしないと動作しない。 |
ユーザー名とパスワードの記述例(ユーザー名パスワードともテキスト形式で記述する。)
user:password user2:password2
- rsyncd.conf
[module] auth users = user, user2 secrets file = /etc/rsyncd.secrets
/etc/rsyncd.secrets と /etc/rsyncd.conf を作成・編集後、rsync サーバを再起動する。起動オプションは認証をオンにしても同じ。
rsync --daemon --config=/etc/rsyncd.conf
クライアント側の設定
- rsync.passwd
- rsync サーバに認証接続するときのパスワードを記述しておくファイル。(パスワードのみ記述しておく。)
rsync.passwd ファイルの所有者は rsync を実行するユーザーにしておく。さらにパーミッションを 600 にしないと実行できない。 |
rsync.passwd にはパスワードのみ記述しておく。
password
認証ありで rsync サーバと同期するには、パスワードファイル(rsync.passwd)をオプションで指定する。
rsync -av --password-file=/etc/rsync.passwd source rsync://user@192.168.1.2/module
LISTEN するポート番号を変更する
rsync サーバが Listen するポート番号を --port オプション付きで起動することで、デフォルトのポート番号 873 から変更することができる。
例えば、Listen するポート番号を 10873 に変更する場合、次のように rsync サーバを起動する。
rsync --daemon --config=/etc/rsyncd.conf --port=10873
クライアント側からポート番号を変更して接続するには、次のようにする。
rsync -av --port=10873 source rsync://192.168.1.2/module
rsync サーバの設定例
/etc/rsyncd.conf
# # Global options # uid = root gid = wheel use chroot = yes log file = /var/log/rsyncd.log pid file = /var/run/rsyncd.pid hosts allow = 192.168.1.0/24 192.168.2.0/24 hosts deny = * dont compress = *.gz *.tgz *.zip *.pdf *.sit *.sitx *.lzh *.bz2 *.jpg *.gif *.png # # Module options # [module_name] comment = rsync server path = /Volumes/rsync_server/ auth users = rsync_user, maruko2 secrets file = /etc/rsyncd.secrets read only = no
/etc/rsyncd.secrets
rsync_user:password maruko2:password
rsync サーバー起動オプション例
rsync --daemon --config=/etc/rsyncd.conf --port=10873
rsync クライアントの同期例
/etc/rsync.passwd
password
rsync -av --password-file=/etc/rsync.passwd --port=10873 --delete \ /path/to/source \ rsync://rsync_user@192.168.1.2/module_name/
応用例
インクリメンタルバックアップ
同期時に同期先(dest)で更新してしまうファイルを別ディレクトリに退避(バックアップ)させることができる。
--backup --backup-dir=退避(バックアップ)ディレクトリ名 のように指定する。 例えば、退避(バックアップ)ディレクトリ名を同期時刻にすることで、インクリメントバックアップすることができる。
rsync -av --delete \ --backup --backup-dir=`date +%Y%m%d_%H%M%S` \ path/to/source \ path/to/dest
source ディレクトリが dest ディレクトリ内に同期する時に、dest で更新してしまうファイルを同期時刻のディレクトリ名(20120107_150729)に退避バックアップする。
リアルタイムにディレクトリを同期させる
lsyncd を利用することで、リアルタイムにディレクトリを同期させることができる。
Mac OS X 固有の How to
Mac OS X 10.3 以下でリソースフォークを扱う
Mac OS X 10.3 以下の rsync は、Mac OS 固有のリソースフォークを扱うことができないが、rsyncx を利用することでリソースフォークを扱うことができるようになる。
rsyncx コマンドでリソースフォークを扱うようにするには、--eahfs オプションを付けて実行する。その他のオプションは rsync コマンドと同じ。
rsyncx --eahfs -av SOURCE DEST
--eahfs オプションを付けてリソースフォークを正常にコピーするには、コピー元、コピー先とも rsyncx にしておく必要がある。 rsyncx コマンドは、Mac OS X 10.2/10.3/10.4/10.5/10.6/10.7 で動作可能。 rsyncx のダウンロード rsyncx.gz (RsyncX 2.1 の rsyncx バイナリのみ 104KB) |
Mac OS X 10.4.x の rsync のバグ
Mac OS X の場合、10.4.x 以上からリソースフォークや ACL 情報も同期できる。ただし、10.4.x のバージョンによっては、rsync のリソースフォーク & ACL の扱いに問題があるものがあるため、OS のアップデート、セキュリティアップデートには注意が必要。Mac OS X 10.4.10 では問題ない。
- Apple Support Discussions - "rsync -aE" on Tiger
- http://discussions.info.apple.co.jp/WebX?128@669.p9hCbcMg1I1.28@.f01f8b9
Mac OS X 10.4.x にインストール済みの rsync は、OS のアップデートあるいはセキュリティアップデート後に更新されることがあり、更新された rsync によっては、リソースフォーク & ACL の扱いに問題があるものがある。
- バグの症状
- -E オプションを付けてもリソースフォーク(アイコン、ラベルカラー、Classic アプリケーションなど)がコピーできない。
- リソースフォークがコピーできても、[dest] のファイルの変更日がファイル同期日時に書き換えられてしまう。
- ACL 情報がコピーされない。
Mac OS X 10.4.10 では問題なく動作している。 |
どうしても、問題のないバージョンにすることができない場合は、darwinbuild を使い rsync を再ビルドする。
Windows で rsync を利用する
cwRsync
cwRsync をインストールすると Windows の Cygwin 環境で rsync を利用することができる。(cwRsync の使い方)