Edited at

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

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

 

以上になります。