rsync
CentOS6.5

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

More than 1 year has passed since last update.

はじめに

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

■コマンド書式

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

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

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

■参考サイト様
rsync でディレクトリの同期(バックアップ)

rsyncによるファイル/ディレクトリの同期 - Server World
 

環境

■構成(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を導入

# yum install xinetd rsync

 
■設定
▽xinetd経由でrsyncを起動する設定

# 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の設定ファイルを新規作成

# 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 除外すべきでないリストを指定

 
■ユーザ認証をする場合
▽上記で設定した認証リストファイルを作成する

# vi /etc/rsyncd.secrets
--------------------
rsync_user1:password
rsync_user2:password
# chmod 600 /etc/rsyncd.secrets

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

@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自動起動設定、スタート

# chkconfig xinetd on
# service xinetd start

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

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

■rsyncのインストール

# yum install rsync 

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

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

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

# chmod 600 /etc/rsync.passwd

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

③動作確認

▽rsyncクライアントより下記コマンド実行

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

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

▽結果

[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に設定してみます。

# 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を利用したリアルタイム同期を整理してみたいと思います。
 

以上になります。