rsync でディレクトリの同期(バックアップ)

提供:maruko2 Note.
移動: 案内, 検索

目次

rsync コマンドは、コピー元ディレクトリと、コピー先ディレクトリを同期させることができる。

書式

rsync [option] SOURCE [SOURCE]... DEST

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バックアップ.png

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 で指定するディレクトリ名の最後にスラッシュを付けるか付けないか

rsyncスラッシュあり.png

SOURCE で指定するディレクトリ名の最後にスラッシュを付けた場合、ディレクトリ内をコピーする。

rsync -av source/ dest

rsyncスラッシュなし.png

スラッシュを付けない場合は、SOURCE ディレクトリごとコピーする。

rsync -av source dest
  • SOURCE で指定するディレクトリ名の最後にスラッシュを付けた場合、ディレクトリ内のファイルをコピーするが、スラッシュを付けない場合は、ディレクトリごとコピーする。
  • DEST では、指定するディレクトリ名の最後にスラッシュを付けても付けなくても同じ。
  • DEST で指定したディレクトリが存在しない場合は、自動的に作成される。

ssh と組み合わせリモートマシンにコピーする

-e ssh オプションを使うことで、ssh 経由でリモートマシンにコピーすることができる 。

rsync+ssh.png

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プロトコルで同期.png

rsync:// プロトコルでコピーor同期する方法は、rsync + ssh よりも高速で動作する。さらに、NFS + rsync(NFS マウントしたボリュームに rsync する)よりも負荷を抑えることができる。

rsyncd.conf

rsync をデーモンモードで動作させるための設定ファイル /etc/rsyncd.conf を作成する。

rsyncデーモンモード.png

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

デーモンモードで起動

デーモンモードで起動するには、--config で rsyncd.conf を指定し、--daemonn オプション付きで起動する。

rsync --daemon --config=/etc/rsyncd.conf

rsync サーバとの同期方法

rsync プロトコルで同期する方法は、次のようになる。

rsync -av source rsync://192.168.1.2/backup

モジュールの指定例

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、ユーザー認証なしで同期可能になっている。

セキュリティ対策としては

などがある。

rsync プロトコルは、フルパスではなくモジュール名を指定し同期させるため、モジュール名がわからなければ同期はできない。

同期元アドレスを限定する設定

rsyncd.conf で、allow/deny する同期元アドレスを指定することができる。

設定例
hosts allow   = 192.168.1.0/24 192.168.2.0/24
hosts deny    = *

同期時にユーザー認証を必要とする設定

rsync プロトコル独自のユーザー認証を有効にする。OS のユーザーとは無関係なので注意。

rsync認証ファイル.png

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 の使い方

LINEで送る このエントリーをはてなブックマークに追加
個人用ツール
名前空間
変種
表示
操作
案内
ツールボックス

注目のページ

このサイトのはてなブックマーク数