同期設定(rsync)を今一度整理してみました

# はじめに

■rsyncコマンドとは
サーバ間でファイル、ディレトリを同期させることが出来るコマンド

■コマンド書式

```bash
# rsync [option] SOURCE1 [SOURCE2]... DEST
```

※SOURCE は 複数選択可能
※SOURCE で指定するディレクトリ名の最後にスラッシュを付けた場合、ディレクトリ内をコピーする。スラッシュを付けない場合は、ディレクトリごとコピーする。
※DEST で指定したディレクトリが存在しない場合は、自動的に作成される。
　
■今回の目的
rsync を デーモンモードで動作させ、rsyncサーバとして利用する


# rsync を デーモンモードで動作させ、rsyncサーバとして利用する

■参考サイト様
[rsync でディレクトリの同期（バックアップ）](http://www.maruko2.com/mw/rsync_%E3%81%A7%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AE%E5%90%8C%E6%9C%9F%EF%BC%88%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%EF%BC%89)

[rsyncによるファイル/ディレクトリの同期 - Server World](http://www.server-world.info/query?os=CentOS_6&p=rsync)
　
## 環境

■構成(AWS EC2)

| 用途 | ホスト名 | Private IP |
|:-----------:|:------------:|:------------:|
| rsyncサーバ | Mitzi-veri | 10.0.1.108 |
| rsyncクライアント | Mitzi-dev | 10.0.2.138 |

　
■ミドルウェア

+ CentOS 6.5
+ rsync 3.0.6
+ xinetd 2.3.14
　

## ①rsyncサーバ側(同期元) の 設定

■セキュリティグループ
　互いが所属するネットワークアドレス に対して、rsyncデーモンモードのデフォルトLISTENポート873番を開放する。
今回だと、 ``10.0.0.0/16`` ``TCP 873`` を開放する

■ xinetdとrsyncを導入

```bash
# yum install xinetd rsync
```
　
■設定
▽xinetd経由でrsyncを起動する設定

```bash
# vi /etc/xinetd.d/rsync
--------------------
# default: off
# description: The rsync server is a good addition to an ftp server, as it \
#       allows crc checksumming etc.
service rsync
{
        disable = no　←変更
        flags           = IPv6
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/bin/rsync
        server_args     = --daemon
        log_on_failure  += USERID
}
```
　
▽rsyncの設定ファイルを新規作成

```bash
# vi /etc/rsyncd.conf
--------------------
#--------------
# Global options
#--------------
uid           = root
gid           = root
log file      = /var/log/rsyncd.log
pid file      = /var/run/rsyncd.pid
hosts allow   = 10.0.0.0/16
hosts deny    = *
dont compress = *.gz *.tgz *.zip *.pdf *.sit *.sitx *.lzh *.bz2 *.jpg *.gif *.png


#--------------
# Module options
#--------------
[tmp]
        comment      = rsync server
        path         = /tmp/mitzi
        use chroot    = true
        auth users   = rsync_user1, rsync_user2
        secrets file = /etc/rsyncd.secrets
        read only    = false
        exclude      = *.mp
        include      = *.mp30
```
　
■各モジュールオプションの説明:

| オプション | 説明 |
|:-----------:|:------------|
| uid/gid | rsyncをデーモンモードで起動する時の UID/GIDを指定 |
| log file/pid file | rsyncデーモンの動作ログと、PID ファイルを指定 |
| hosts allow | 接続を許可するクライアントのホスト名とIPアドレスのパターンを指定。スペース区切りで複数指定 |
| hosts deny | 接続を拒否するリスト。 ※"hosts allow"、"hosts deny"どちらにもマッチしなかった場合、その接続元は接続許可 |
| dont compress | 転送の際に圧縮したくないファイル名を指定 (既に圧縮されたファイルを指定するのが有効) |
| [] | 上記だと[tmp]の箇所をモジュールといい、rsync プロトコルのマウントポイントのようなもの。複数設定可能 |
| path | モジュールのルートにするパス（マウントポイント）を指定(コピー先) |
| use chroot | デフォルト"true"。その場合、ファイル転送する前に "path" で chroot |
| read only | クライアントがファイルをアップロードできるかどうかを設定。"true"ならばアップロード出来ない |
| auth users、secrets file | ユーザ認証する場合,slave側に設定する(ユーザ名とパスワード設定ファイルを指定する) |
| exclude | 除外リストを指定 |
| include | 除外すべきでないリストを指定 |
　
■ユーザ認証をする場合
▽上記で設定した認証リストファイルを作成する

```bash
# vi /etc/rsyncd.secrets
--------------------
rsync_user1:password
rsync_user2:password
```

```bash
# chmod 600 /etc/rsyncd.secrets
```

※01. /etc/rsyncd.secrets ファイルの所有者は rsync デーモンを実行するユーザーに設定し（rsyncd.conf の uid）さらに、ファイルのパーミッションを 600にする必要がある。
そのように設定していないと、rsyncコマンド実行時に以下エラーが発生する。

```bash
@ERROR: auth failed on module tmp
rsync error: error starting client-server protocol (code 5) at main.c(1503) [receiver=3.0.6]
```
※02. passwordに設定には文字数制限があるようです。 【2016/03/29　追記】

・公式ドキュメント(日本語版)より
http://www.infoscience.co.jp/technical/rsync/rsyncd_conf.html
> パスワードには様々な文字が 入りますが、多くの OS ではクライアントが入力するパスワード長を制限しています。おそらく 8 文字以上 では認証できません。


■xinetd自動起動設定、スタート

```bash
# chkconfig xinetd on
# service xinetd start
```

※この状態で、"xinetd"を起動すると、"rsync"がデーモンモードで利用できるようになります。

## ②rsyncクライアント側(同期先) の 設定

■rsyncのインストール

```bash
# yum install rsync 
```

　
■ユーザ認証をする場合
▽rsyncサーバに認証接続するときのパスワードファイルを設定

```bash
# vi /etc/rsync.passwd 
--------------------
password
```

※パスワードのみ記述する

```bash
# chmod 600 /etc/rsync.passwd
```

※/etc/rsync.passwd ファイルの所有者は rsync を実行するユーザーに設定しさらに、ファイルのパーミッションを 600にする必要がある。
そのように設定していないと、rsyncコマンド実行時に上述したものと同様のエラーが発生する。


## ③動作確認
▽rsyncクライアントより下記コマンド実行

```bash
# rsync -avz --password-file=/etc/rsync.passwd rsync://rsync_user1@10.0.1.108/tmp /var/www/test
```

※rsyncサービスを起動しておく必要はない

▽結果

```bash
[root@Mitzi-dev www]# pwd
/var/www

[root@Mitzi-dev www]# ll
合計 16
drwxr-xr-x 2 root root 4096  7月 23 23:18 2014 cgi-bin
drwxr-xr-x 3 root root 4096  9月  4 15:42 2014 error
drwxr-xr-x 2 root root 4096  7月 23 23:18 2014 html
drwxr-xr-x 3 root root 4096  9月  4 15:43 2014 icons

[root@Mitzi-dev www]# rsync -avz --password-file=/etc/rsync.passwd rsync://rsync_user1@10.0.1.108/tmp /var/www/test
receiving incremental file list
created directory /var/www/test
./
rsync-test.html

sent 82 bytes  received 173 bytes  510.00 bytes/sec
total size is 12  speedup is 0.05

[root@Mitzi-dev www]# ls -l /var/www/test/
合計 4
-rw-r--r-- 1 root root 12  9月  8 17:32 2014 rsync-test.html
（testディレクトリと配下のファイルがコピーされた）
```

## ④定期的に同期するよう設定

例としてrootアカウントのcrontabに設定してみます。

```bash
# crontab -e
-------------
*/5 * * * * /usr/bin/rsync -avz --password-file=/etc/rsync.passwd rsync://rsync_user1@10.0.1.108/tmp /var/www/test
```

※5分毎に同期する設定
※同期元にないファイルを削除したい場合は、「--delete」オプションを付与
※--exclude-from=/etc/rsync_exclude.lst のように設定し、除外リストを作成することも可能


## まとめ
これでサーバ間の同期処理が出来るようになりました。
次回はlsyncdを利用したリアルタイム同期を整理してみたいと思います。
　

以上になります。