rsync の使い方、オプションについてのまとめ
rsync についてかなり深く調べる機会があったので、そのまとめです。この記事を書いている時点の最新版は 3.0.7 で、すでに 3.0.8pre1 が出ています。
Red Hat Enterprise Linux 5.x (CentOS5 )に付属しているのは 2.6.8 です。
2系と3系での違いとして、2系では差分比較がすべて終わってからファイルの転送が開始されていましたが、3系ではファイルの差分比較をしながら並行してファイル転送されるようになっています。
転送元、転送先ともに rsync コマンドがインストールされている必要があります。ファイルを取ってくることも、送ることもできます。
基本的なオプション
rsync -acvz -e ssh --delete server1:/var/log/hoge/ /var/backup/log/hoge/
server1 の /var/log/hoge/* ファイルをローカルの /var/log/hoge/ に同期します。オプションの -a はアーカイブモードで基本的にこれをしておけばファイル属性やタイムスタンプなどは保存され、サブディレクトリも含めて同期されます。所有者・グループは名前ベースで同期されるのでサーバにより uid, gid が違っていても問題ありません。
scp コマンドで -p オプションをつけた場合、root 権限がない状態で所有者が変更できないとエラーとなりますが、rsync では -a を指定して root 以外の場合、所有者は rsync の実行ユーザとなりエラーにはなりません。
-c はファイルのチェックサムを比較します。このオプションをつけた方が確実ですが、時間・CPU 負荷がかかります。
-v は転送されるファイルの詳細を表示します。-vv とするとさらに動作の詳細が表示され、-vvv と重ねることでさらに細かい情報が出力されます。逆に余計な情報を表示させたくない時は -q を指定します。-z は転送時に gzip 圧縮されて転送されます。もともと圧縮されているファイルに対して指定してもあまり効果はありませんが、大量のログファイルの転送などでは転送時間の短縮に効果があります。
-e はリモートシェルのコマンドを指定します。昔は rsh がデフォルトでしたが、現在は ssh がデフォルトです。ssh のオプションを指定したい時には、 -e 'ssh -c 3des' のようにシングルクォートで囲んで指定可能です。
–delete オプションは、転送元にないファイルを転送先から削除するオプションです。
さまざまなオプション
rsync には様々なオプションがあります。その一部を紹介します。詳しいことを知りたい場合は英語の man を熟読するしかありません。
rsync -avnm --timeout=2 /var/log/hoge/ server2:/var/backup/log/hoge/
ローカルの /var/log/hoge/* ファイルを server2 の /var/backup/log/hoge/ にコピーします。取得ではなく送りつけるパターンです。
-n オプションは実際には転送せずに終了します。-v ともに指定することで、転送・削除するファイルの一覧を出力して終了します。実際に転送する前にテストをこのモードでするのがいいでしょう。
-m は空ディレクトリはコピーしないというオプションです。これは 2.x 系では利用できません。
--timeout は、タイムアウトまでの時間を秒数で指定します。デフォルトは 0 でタイムアウト待ちをしません。その場合、通常は ssh でタイムアウトするまで待ちます。その場合、戻り値のエラーコードが異なります。
rsync -au --rsync-path=/usr/local/bin/rsync /home/foo/bar/ /var/backup/
rsync というとサーバ間のデータコピーにしか使わないイメージがありますが、ローカルホストの別ディレクトリにコピーすることもできます。
-u オプションは日付が新しいものだけをコピーします。単純なバックアップなら問題ありませんが、サーバ間の時刻がきちんと同期されていないと、意図せずファイルが同期されないこともありますので注意しましょう。
--rsync-path で、相手サーバの rsync コマンドをフルパスで指定できます。これにより独自にビルドした異なるバージョンの rsync コマンドを指定することが可能となります。
rsync -auz --bwlimit=8192 www.example.com:/var/log/httpd /var/backup/log/
--bwlimit は帯域制限をするのに使用します。回線が細くて rsync で帯域を占領したくない場合や、逆にサーバスペックが低すぎて負荷が高すぎる場合に使えます。単位は kbps なので、--bwlimit=8192 は 8Mbps ということになります。
コピー元ディレクトリの指定に注意
rsync の転送元の末尾に / をつけるかどうかで挙動が変わるので注意が必要です。上記例では(期待に反して)、httpd/* が /var/backup/log/http/* の下にコピーされます。転送元の末尾に / をつけると /* のファイルが直接 var/backup/log/* にコピーされるという違いがあります。間違いやすいところです。基本的には転送元がディレクトリで終わる場合は / をつける癖をつけましょう。
除外
rsync -az --exclude="*.ssh/*" --cvs-exclude /home/hoge/ server3:/home/hoge/
--exclude で除外するパターンを指定できます。
-C(または--cvs-exclude) オプションを使うと CVS などバージョン管理システムの生成するファイルなどを自動的に除外してくれます。
これは CVS だけではなく、Subversion や .bak .exe などの拡張子を持つファイルも除外されます。具体的には
*~ #* .#* ,* _$* *$ *.old *.bak *.BAK *.orig *.rej .del-* *.a *.olb *.o *.obj *.so *.exe *.Z *.elc *.ln core .svn/
のパターンが除外されます。
除外対象をファイルで指定することもできます。
rsync -az --exclude-from=exlude_list.txt server4:/home/hoge/ /var/backup/hoge/
のように除外に使うファイルを指定しますが、すべて除外して一部を許可するといった使い方をすることができますが、書式には注意が必要です。
############################ # exlude_list.txt ############################ + some/ + some/path/ + some/path/file[0-9] + test/ + test/**.log - *
同期したいファイルの階層を1行ずつ記述していく必要があります。正規表現はあまり使えませんが、[0-9]
のような数値指定は可能です。
また * と ** も使用できます。** はディレクトリ区切りを超えてマッチしますので、この例では test/foo/bar/hoge.log といったファイルもマッチします。# から始まる行はコメントとなります。
その他
一時ファイルが作成するようなディレクトリを同期する際、まれに、file has vanished
, some files vanished before they could be transferred (code 24)
のエラーが出ます。これはディレクトリ比較時には存在したファイルが、転送をしようとしたときにはすでに削除されていた場合に出るようです。通常はエラーが出ても無視すればいいようですが、このエラーを抑止するオプションは存在しないようです。
ssh のパスフレーズなし公開鍵認証の設定をしておけば、cron と rsync を組み合わせて夜間バックアップなどが簡単にできます。
rsync にはデーモンとて動作させるモードがあります。私は使ったことはありません。ポートは TCP の 873 が使われます。
lsyncd という別のアプリケーションを使用すると、リアルタイムで変更のあったファイルを rsync 経由で転送するといったリアルタイム同期が可能なります。ただし lsyncd は Linux カーネルの inotify という機能を利用しているため、これが実装されていない RHEL 4.x (CentOS 4.x) では利用できません。
/
gzip には --rsyncable というオプションがあり、このオプション付きで圧縮された .gz ファイルは rsync での差分比較が早くなるようになっているそうです。私は体感的にわかりませんでしたが、利用できる場合はつかってみるとよいかもしれません。
コメントはまだありません
No comments yet.
Sorry, the comment form is closed at this time.