rsyncの使い方めも

7年くらい昔に書いたのを人から質問されて発掘して紹介したのでいちおう転載しておこうかという備忘録です。

###<b>rsyncでデータを同期する</b>


####<b>・なぜrsyncを使いたいか</b>
　　　　実行にかかる時間が非常に短く、rcpやtar+sshより高速
　　　　一度同期しておいてメンテナンス時は差分のみで時間を短縮可能
　　　　一括転送かつ柔軟に対象を除外したりできる

　　　　上記の理由によって、コンテンツ移行・サーバ移設などの要件に利用することが多い。
　　　　冗長構成となっているコンテンツの同期をcronで定期的にrsyncを実行させて取っているというサービスもある。（このメモ書いた当時は2009年とかです。）

####<b>・実行時の権限について</b>
　　　　rootで実行しないと同期の対象に含まれるあらゆるユーザのファイル権限が保てない。
　　　　同期対象に含まれるファイルのオーナが1アカウントのみならそのユーザでrsyncを実行する。

####<b>・主要なオプションについて</b>
　　　　http://www.infoscience.co.jp/technical/rsync/rsync.html

####<b>・負荷について</b>
　　　　運用中環境ではCPUとI/Oを食うのを覚悟するか初回はtarアーカイブをばらまく方法に変えるか等工夫がいる。
　　　　以下リンク先にリモートサーバの負荷を抑える方法がかかれている。
　　　　https://sakuhindb.com/pj/6_B4C9CDFDBFCDA4B5A4F3/200909231.html

▽良く使う、使ったことがあるオプション

```
 -a, --archive               アーカイブモード(-rlptgoD オプションと同義)
　　　　 -r, --recursive             ディレクトリで再帰的に実行する
　　　　 -l, --links                 ソフトリンクを維持する
　　　　 -p, --perms                 パーミッションを維持する
　　　　 -t, --times                 タイムスタンプを維持する
　　　　 -g, --group                 グループを維持する
　　　　 -o, --owner                 オーナーを維持する (root のみ)
　　　　 -D, --devices               デバイスを維持する (root のみ)
 -u, --update                アップデートのみ許可 (上書き禁止)
 -n, --dry-run               実行時の動作だけを表示
 -e, --rsh=COMMAND           rsh の代替を指定
 -C, --cvs-exclude           システム間で転送したくない広範囲のファイルを除外(CVSの方法と同じ)
     --delete                送信側にないファイルを削除
     --timeout=TIME          IO タイムアウトを設定(秒)
 -z, --compress              受信ファイルを圧縮compress file data
     --exclude=PATTERN       パターン一致するファイルを除外
     --exclude-from=FILE     ファイルに記述されたパターンと一致するファイルを除外
```

####<b>・deleteオプションについて</b>
　　　　付けると、同期元に存在しないファイルは同期先で消される。
　　　　　(切戻しの際につけてしまうと新規に追加したファイルが消えてしまう)
　　　　付けないと、同期元で削除・整理したファイルが同期先で消えない。
　　　　　(見えてはならないファイルが見えてしまうという障害が発生する)
　　　　良く状況を確認して場合によって使い分ける必要がある。
　　　　送信元ディレクトリ/*などとアスタリスクをつけると効かないので注意。
　　　　http://www.1x1.jp/blog/2008/04/rsync_delete_asterisk.html

####<b>・ssh空鍵認証で使う</b>
　　　　rootでコピーする必要がある場合、rootログイン(PermitRootLogin)を
　　　　sshd設定(/etc/ssh/sshd_config)で許可する必要がある。
　　　　　　　　その方法には2つの選択肢がある。

　　　　　　　　単純に、許可する
　　　　　　　　　　　　PermitRootLogin yes
　　　　　　　　公開鍵に許可するコマンドを書く
　　　　　　　　　　　　PermitRootLogin forced-commands-only
　　　　　　　　鍵認証を許可する(コマンド制限なし)
　　　　　　　　　　　　PermitRootLogin without-password

　　　　設定を変更した場合、sshdをリスタートして設定を読み込ませる必要がある。
　　　　その際に既に接続しているセッションは切れないが念のためtelnetで限定的にアクセス可能にする方法もある。

　　　　ssh鍵認証したい場合、アクセス元の公開鍵(～.pub)を、
　　　　アクセス先の公開鍵リング(~/.ssh/authorized_keys)に1行1鍵登録する必要がある。
　　　　(.sshディレクトリや鍵の権限は他人がアクセス不可能なようにしないと動作しない)

 -e, --rsh=COMMAND           rsh の代替を指定

例）
　　同期元にrsync用の鍵を作る

```
# ssh-keygen -t dsa -N "" -f /root/.ssh/rsync
```

　　まずテストディレクトリにverboseモード(-vv)で送信して実行されるコマンドを確かめる

```
# rsync -vv -az --exclude "backup*.tar.gz" -e "ssh -p 1220 -i /root/.ssh/rsync" /home/user/ root@hp01:/home/user/
opening connection using ssh -p 1220 -i /root/.ssh/rsync -l root hp01 rsync --server -vvlogDtprz . /home/user/
```

　　同期先のユーザ@サーバの公開鍵リングに、頭(1行1鍵なので同じ行)に以下のようにコマンドを付けた鍵を追加する。（PermitRootLogin forced-commands-onlyの場合）

```
/root/.ssh/authorized_keys
---------------------------------------------------------------------------
command="rsync --server -vvlogDtprz . /home/user/tmp/" ssh-dss AAAAB3..
---------------------------------------------------------------------------
```

※scpの場合は-tでターゲットディレクトリを指定する

```
---------------------------------------------------------------------------
command="/usr/bin/scp -t /data02/kudan-xoops01" ssh-dss AAAA..
---------------------------------------------------------------------------
```


####<b>・NFSmountして使う</b>
　　　　ssh鍵認証よりも簡単なので、NFSが起動しているならこちらの方が工数がかからなくて良い。
　　　（NFSは頻度高い更新に不向きでCPU負荷アラート出るかも）
　　　　同期元をリードオンリーでマウントすると、もし方向を間違ったとしても上書きが不可能なので安全。


```text:例）
# mount -t nfs server:/public/dir /tmp -o ro,intr,soft,bg,async
# cd /tmp
# rsync -a -u --delete --exclude-from=/opt/exclude.txt ./ /dest-dir/
```

####<b>・デーモンとして使う</b>
　　　　一般的な使い方と言えなくもないが、rsyncのバージョンの差によってはrsync実行不可能な場合もある。

####<b>・まず最小構成でテストを行う</b>
　　　　cpと同じように使えるので、テスト用の場所とファイルを作成し、timeで時間なども計測する

####<b>・ドライランで同期されるファイルのリストを取得する</b>

 -n, --dry-run               実行時の動作だけを表示

例）

```text:例）
# time rsync -n -a -u ./* /data1/data/messages/ >/home/sg_ope/rsync_mes.log
```

####<b>・スクリプト化して自動実行する</b>
　　　　ファイルにコマンドを書いて実行権を付ければスクリプトになる。
　　　　cronでの自動実行を停止し忘れないように十分注意しなければならない。

####<b>・帯域制限する</b>
　　　　--bwlimit=200をつける（200KB/秒で転送）
　　　http://d.hatena.ne.jp/isher/20080817/1218996948

参考）
http://www2s.biglobe.ne.jp/~nuts/labo/inti/cron-rsync-ssh-nodaemon.html
http://d.hatena.ne.jp/isher/20080817/1218996948