以前のrsync + ssh でファイルの同期をとるで rsync によるサーバー間でのファイルの同期について話をしました。
また、lsyncd 2.0.x (最新版) を Debian 6 にインストールするでは、lsyncdのインストールに関して触れました。
今回は、その lsyncd と rsync を使って リアルタイムなサーバー間ファイルおよびディレクトリの同期を実現してみたいと思います。
この同期をどのような仕組みで実現するかを以下に簡単に解説してみます。
- ユーザが サーバー#1 (ここではMaster) のファイルやディレクトリの作成、更新、削除などを行います。
- OSのInotify APIは、ファイル、ディレクトリが更新されたことをイベント発行します。
- そのイベント監視を行っている Lsyncd がイベントを受信し、rsync コマンド発行し、同期をしようとします。
- rsync では、同期をする対象がサーバー#2 (ここではSlave) なので、サーバー#2へ通信を行い、更新されたことを通知します。
- その更新通知を受信するのは、サーバー#2のrsyncd (rsyncのデーモンプロセス) で、更新情報から自サーバー内のファイル、ディレクトリの更新を行います。
- サーバー#2でファイル、ディレクトリの更新が終わると、サーバー#1 、サーバー#2 のいずれから同じファイル、ディレクトリを読み込んでも同じ内容になっています。
若干、サーバー間のやり取りは、省略している部分もありますが、おおむね、この流れになります。
ここでおわかりのとおり、
Lsyncd、rsync(対抗側のデーモンプロセスを含め) の2つの設定ができれば、サーバー間のファイル同期ができることがご理解いただけたのではないでしょうか。
今回は、このサーバー間のファイル同期をLsyncd、rsync(対抗側のデーモンプロセスを含め) で実現してみます。
なお、ここでは、コピー元をMaster、コピー先をSlave と表記します。
- 目次
- 履歴
2012年12月1日 初版
lsyncd , rsync を インストールする
まずは、必要なパッケージをインストールします。
この時、lsyncd は、バージョン 2 以降の新しいものを利用します。
Debian 6 では、デフォルトのlsyncd のバージョン1.3.x なので、lsyncd 2.0.x (最新版) を Debian 6 にインストールするを参考にインストールしてみてください。
CentOS 6, ScientificLinux 6では、lsyncd のバージョン2以降が Repoforge(RPMforge)のリポジトリを使ってインストールすることができます。
リポジトリの追加は、リポジトリの追加・削除、無効・有効の設定をしてみるを参考にインストールしてみてください。
Ubuntu 12, Debian 7 では、デフォルトでlsyncd のバージョン2以降がインストールされます。
- Master
Master側では、rsync、lsyncdが必要です。
Debian 6 , Ubuntu 12, Debian 7
$ aptitude install rsync lsyncd ...
CentOS 6, ScientificLinux 6
$ yum install rsync lsyncd --enablerepo=rpmforge ...
- Slave
Slave側では、rsyncが必要です。
ただし、CentOS 6, ScientificLinux 6 では、 rsyncのデーモンプロセスを動作させるためにxinetdが必要になります。
( Debian系では、rsyncでデーモンプロセスを動かせるスクリプトまで含まれているので必要ありません。 )
Debian 6 , Ubuntu 12, Debian 7
$ aptitude install rsync ...
CentOS 6, ScientificLinux 6
$ yum install rsync xinetd ...
lsyncd , rsync の設定を行う
次に、Master、Slave のそれぞれで、lsyncd , rsync の設定を行います。
ここでは、
Master : コピー元サーバーは、IPアドレス: 192.168.1.111 、
Slave : コピー先サーバーは、IPアドレス: 192.168.1.222 、
それぞれ同じディレクトリ名の /var/www/html/ をミラーリング(同期)するように設定してみます。
- Slave
rsyncd(rsync のデーモンプロセス) の設定ファイルを編集します。
/etc/rsyncd.conf
uid = root gid = root read only = no log file = /var/log/rsyncd.log pid file = /var/run/rsyncd.pid [sample_sync] path = /var/www/html/ hosts allow = localhost 192.168.1.111 hosts deny = * read only = false exclude = .svn
グローバルオプション
グローバルオプションは、設定ファイルの先頭に[モジュール名]が記述される前に設定されなければなりません。
また、グローバルオプションは共通オプションやデフォルトオプションのような扱いをすることもできます。
それは、以降に説明のあるモジュールオプションもここで指定することができることに起因します。 モジュールオプションをグローバルオプションの設定箇所で設定するとそれはモジュールオプションのデフォルト値として認識されます。motd file = FILENAME“motd file” は、各接続先クライアントに表示する”message of the day”を指定することができます。 通常はサイト情報や、法的な通知等を表示します。 デフォルトでは motd ファイルを使いません。pid file = FILENAME“pid file” は、rsync デーモンがプロセス id をそのファイルに書き込むようにします。port = PORTNUMBER“port” は、rsync デーモンが使用するTCPポート番号です。デフォルトでは、873が使用されます。address = IPADDRESS“address” は、rsync デーモンが使用するIPアドレスを指定することができます。socket options = STRING“socket options” は、システムを最大限までチューンしたい方のために提供されるオプションです。 転送速度をより高速化した場合などに、このオプションを指定することで高速化を図ることができる場合があります。 設定可能なオプションの詳細については setsockopt() system call の man ページを参照してください。 コマンドラインの オプションとして、–sockopts を指定することができます。 デフォルトでは特別なソケットオプションは設定されません。
モジュールオプション
モジュールオプションは、いわゆる同期情報設定箇所になります。[モジュール名]以降に設定されなければなりません。
このモジュール名が、rsyncのターゲット名に使われます。
comment = STRING“comment” は、クライアントが利用可能なモジュールのリストを取得するときに、モジュール名の横に表示される簡単な説明文を設定します。 デフォルトでは何も設定されません。path = DIRECTRYPATH“path” は、このモジュールが利用するサーバのファイルシステムにあるディレクトリを指定します。つまり同期先ディレクトリになります。 設定ファイル ( /etc/rsyncd.conf )内の 各モジュールについてこのオプションを指定しなければなりません。
use chroot = BOOLEAN (true/false)“use chroot” が true なら、rsync サーバはクライアントにファイル転送する前に “path” で chroot します。( つまり、”path”で指定したディレクトリがルートパスになるということです。 ) このオプションの利点は、セキュリティホールの可能性を排除することです。 しかし、スーパーユーザの権限を要求することと、新しい root パスの外にあるシンボリックリンクを利用できない点においては欠点になります。 デフォルトは、 true : 有効です。デフォルト動作はよりセキュアですが、どうしても使用したくない場合は、falseを明示的に指定する必要があります。numeric ids = NUMBERこの”numeric ids” を有効にすることで、ユーザのマッピングやカレントデーモンモジュールの名前によるグループを無効にすることができます。 これは、任意のユーザ/グループ関連のファイルやライブラリをロードしようすることからデーモンを防ぎます コマンドラインからのオプションとして–numeric-ids を指定することで有効にすることもできます。 デフォルトでは、このパラメータは、”chroot”が有効なら有効となり、”chroot”が無効なら無効となります。 また、必要なリソースを持っているか、または、それらのリソースを変更することがユーザに不可能かを確認するための措置を講じることなく、このパラメータを利用すべきではありません。munge symlinks = BOOLEAN“munge symlinks”は、利用できないが復元できる方法ですべての着信のシンボリックリンクを変更したことをrsyncへ通知します。(下記参照) これは、デーモンモジュールが書き込み可能であるときに、利用者の偽装からファイルを保護するのに役立ちます。 デフォルトは、”use chroot” が有効で、かつchrronの内部パスが”/”であるなら無効です。それ以外は有効です。
あなたが、読み込み専用でないデーモンのこのパラメータを無効にするなら、 ユーザは、(モジュールが何かを持っているなら)デーモン除外アイテムへのアクセスをアップロードされたシンボリックリンクで行うことができます。 そして、 “use chroot”は、無効であるなら、 rsyncでさえ、(アクセス権限が許す限り)モジュールのパスの外にあるデータを見せる、あるいは変更することで騙すことができます。 rsync がシンボリックリンクの利用を無効にする方法は、”/rsyncd-munged/”の文字列で一つずつ接頭辞に付加することです。 これは、そのディレクトリが存在しない限り、使用されているからリンクを防ぐことができます。 このパラメータが有効な場合、rsyncはそのパスがディレクトリへのディレクトリまたはシンボリックリンクである場合、実行を拒否します。 chrootの内部パス”/”を持っているchrootの領域で “munge symlinks”を使っているとき、 利用者がそれを作成しようとすることができないようなモジュールの除外設定のために “/rsyncd-munged/” を追加すべきです。
注意:rsyncは、モジュールの階層内の任意の既存のシンボリックリンクが、(もちろん、それがまさに階層全体の中でコピーしなかった限り)あなたが望むのと同じように安全であるかどうか全く検証しようとしません。
あなたは、新しい領域にrsyncデーモンをセットアップしたり、局所的に、シンボリックリンクを追加する場合、 手動ですべてのシンボリックリンクの値の先頭に “/rsyncd-munged/” を付けることによって、悪用されることからシンボリックリンクを保護することができます。 シンボリックリンクから、この接頭辞を追加または削除するために使用できるPerlスクリプトが、”munge-symlinks” という名前のソースコードのsupportディレクトリにあります。
このパラメータは、書き込み可能なモジュールを無効で”use chroot” が無効(あるいは chrootのパスが”/”でない) とき、 着信のシンボリックリンクは、先頭のスラッシュをドロップすると、削除するように変更され、 “..” rsyncは信じているパス要素は、シンボリックリンクは、モジュールの階層をエスケープすることができます。 それでもこの問題を回避するトリッキーな方法がありますので、パラメーターのこの組み合わせを選択した場合はより信頼できるようになるでしょう。charset = STRINGこれはモジュールのファイル名が格納されている文字セットの名前を指定します。 クライアントが–iconv オプションを使用している場合、デーモンは、クライアントが実際に渡した文字セットの”charset”のパラメータ値を使います。 これは、デーモンがchroot領域の余分なファイルを使わずにchrootのモジュールで文字コード変換をサポートすることができ、また、名前翻訳が一貫した方法で行われることが保証されます。
“charset”が設定されない場合、–iconv オプションは拒否されます。まさに、”iconv”が”refuse options”で指定されているように拒否されます。 特定のモジュールにおいて強制的に–iconv を常に使用するようにしたいなら、”refuse options”パラメータに”no-iconv”を加えると良いです。 これは非常に新しいrsyncクライアントにあなたのモジュールへのアクセスを制限することも覚えておきましょう。max connections = NUMBER“max connections” は、同時接続の最大数を指定することができます。 クライアントの接続数が最大値に達したときに、「後で接続してください (try later)」というメッセージを出力します。 デフォルトでは、0で無制限を意味します。 負の値は、無効です。 また、 “lock file” を参照してください。log file = FILENAME“log file” は、rsyncデーモンが、syslogでなくファイルへログを出力するときにファイル名を指定します。 これは、syslogがchrootされたプログラムで動作しないような (AIXのような)システムでは、特に役に立ちます。 ファイルがchrootが呼ばれる前にオープンされ、それを転送外の場所へ配置されることを許可しています。 この値がグローバルオプションのかわりにモジュール単位で設定されているなら、グローバルログは、まだ、許可障害(authorization failures)あるいは設定ファイルエラーのメッセージを出力するでしょう。 指定されたファイルをデーモンプロセスがオープンできなかったら、それは、syslogへ切り替えます。そして、障害についてのエラーを出力します。 (指定されたログファイルのオープン失敗は、致命的なエラーとして取り扱われることに注意してください。)syslog facility = STRING“syslog facility” は、rsync サーバからのメッセージをログするための syslog ファシリティ名を指定します。システムで定義されている標準の syslog ファシリティ名を使います。一般的なものとしては、 auth, authpriv, cron, daemon, ftp, kern, lpr, mail, news, security, syslog, user, uucp, local0, local1, local2, local3, local4, local5, local6, local7 です。デフォルトは、daemon です。 この設定は、”log file” が設定されている(モジュール毎の設定、あるいはグローバルオプションでの設定があるなら継承されるので、それも含みます)なら無効です。max verbosity = NUMBER“max verbosity” は、(ログファイルへ情報を書き込みはじめてから)詳細情報の最大量を制御することができます。 このパラメータを使うと、(情報がログ・ファイルに記録されますので)デーモンが生成することができますことを、詳細情報の最大量を制御することができます。 デフォルトでは、クライアントが冗長の1レベルを要求することを可能にする 1 です。lock file = FILENAME“lock file” は “max connections” オプションをサポートするために使うファイルを指定します。 rsync サーバは最大接続数の制限を超えないようにするために、このファイルでレコード・ロックを使います。 デフォルトでは /var/run/rsyncd.lock です。 このパラメータは、 “最大接続数”パラメータをサポートするために使用するファイルを指定します。 rsyncデーモンは、最大接続数の制限は、ロックファイルを共有モジュールを超えていないことを確認するために、このファイルにレコードロックを使用しています。 デフォルトは/var/run/rsyncd.lock 。read only = BOOLEAN“read only” は、クライアントがファイルをアップロードできるかどうかを設定します。 もし “read only” が true ならアップロードはできません。”read only” が false の場合には、サーバにあるファイルのパーミッションが許す限りアップロードが可能になります。 デフォルトでは全てのモジュールに関して “read only” (true)です。write only = BOOLEAN“write only” は、クライアントがファイルをダウンロードできるかどうかを設定します。 もし “write only” が true ならダウンロードはできません。”write only” が false の場合には、サーバにあるファイルのパーミッションが許す限りダウンロードが可能になります。 デフォルトではこのオプションは無効(false)です。list = BOOLEAN“list” は、クライアントが利用できるモジュールのリスト表示を求めた時に、このモジュールを表示するかどうかを設定します。 この設定が false ならモジュールを隠すことができます。 デフォルトでは、true です。uid = USERID“uid” は、デーモンが root で走っているときに、モジュールからの転送、またはモジュールへの転送で生じるユーザ名とユーザ id を指定します。 “gid” との組み合わせでファイルのパーミッションを設定します。 デフォルトのユーザは、通常 “nobody” である uid -2 です。gid = GROUPID“gid” は、デーモンが root で走っているときに、 モジュールからの転送、またはモジュールへの転送で生じるグループ名とグループ id を指定します。 “uid” の補足です。 デフォルトのグループは、通常 “nobody” である gid -2 です。fake super = YES/NO“fake super = yes” と設定した場合、コマンドラインにて–fake-superオプションを設定したときと同じようにモジュールに対して振舞います。 これは、実際にrootとして動作しているデーモンでなくともファイルのフル属性を許可します。fake super = YES/NO“fake super = yes” と設定した場合、コマンドラインにて–fake-superオプションを設定したときと同じようにモジュールに対して振舞います。 これは、実際にrootとして動作しているデーモンでなくともファイルの全属性に対して許可します。filter = STRINGデーモンは、クライアントからどのファイルをアクセスできるか決定する独自のフィルタチェーンを持っています。 このチェーンは、クライアントに送信せず、クライアントが指定している可能性がある任意のフィルタとは独立しています。 たとえクライアントが、それらを抜き出そうとしても、デーモンフィルターチェーン(デーモン除外ファイル)によって除外されたファイルは存在しないものとして扱われます。 また、たとえクライアントが、それらを(exitコード23をきっかけに)押しこもうとしてもエラーメッセージを出力してスキップされます。 そして、モジュールから決して削除されることはありません。
uid/gid と名前変換をサポートするために追加するような固有の管理ファイルのダウンロード、改ざんから防ぐためにデーモンフィルターを使うことができます。 デーモンフィルタチェーンは、 “filter”, “include from”, “include”, “exclude from”, “exclude” の優先順位のオプションから構築されています。 Anchored (結びつかられた)パターンはモジュールのrootに固定されます。
サブツリー全体へのアクセスを防止するには、たとえば、除外すべきサブツリーを”/secret”としましょう、このもっとも簡単な方法は、”/secret/***” のような3個の”*”でパターンを表現することです。
それが、(たとえば “- /foo – /bar” は2つのルールと解析されます)ルールで空白で区切らなくても理解するの十分に賢いにも関わらず、 “filter”は、デーモンフィルタールールの空白で区切られたリストで設定されます。
あなたは、通常の構文を使用して、1つ以上のマージファイルのルールを指定することもできます。 唯一の “filter”パラメータは、configファイルで指定されたモジュールに適用されますので、単一のパラメータで必要なすべてのルールを置くことができます。 ディレクトリごとのマージファイルのルールがグローバルルール同様の保護を提供しないことがありますが、 ディレクトリごとのマージファイルが転送の中に含まれている、またクライアントがそれらが使われることを要求するなら、それらは、クライアントのダウンロード操作の間により良く –delete work をさせるために使かわれることができます。exclude = STRING“exclude” は、除外リストにスペースで区切られたパターンのリストを追加します。 これは、クライアントが –exclude オプションを用いてこれらのパターンを指定するのと同じですが、除外リストはクライアントには不可視で、サーバ上でのみ適用されます。 “exclude” オプションは一つだけ指定されますが、指定する exclude/include パターンの前に “-” と “+” を使うことができます。
除外されたファイルはデーモンにどのような影響を与えるかについては、 “filter”パラメータを参照してください。include = STRING“include” は rsync が除外するべきでない、スペースで区切られたパターンのリストを指定します。 これは、”exclude” の上書きしたいときに使います。 指定される”include” オプションは一つだけ、モジュールに適用することができます。
除外されたファイルはデーモンにどのような影響を与えるかについては、 “filter”パラメータを参照してください。exclude from = FILENAME“exclude from” は1行毎に、除外パターンを含んだサーバのファイル名を指定します。 “exclude from”は、モジュールに一つだけ適用されます。 もし、複数の除外用ファイルがあるなら、それらをマージファイルとして”filter”に設定することができます。
除外されたファイルはデーモンにどのような影響を与えるかについては、 “filter”パラメータを参照してください。include from = FILENAME“include from” は1行毎に、除外すべきでないパターンを含んだサーバのファイル名を指定します。(“exclude from”とよく似ています) “include from”は、モジュールに一つだけ適用されます。
除外されたファイルはデーモンにどのような影響を与えるかについては、 “filter”パラメータを参照してください。incoming chmod = STRING“incoming chmod” は、すべての受信ファイル(デーモンによって受信されているファイル)の権限を変更する カンマ区切りのchmodの文字列のセットを指定することができます。 これらの変更は、他のすべてのアクセス許可に関する処置後に発生し、クライアントが –perms を指定していないときでも 既存の権限を上書きするでしょう。
この文字列の形式については、コマンド rsyncのオプション –chmod および chmod(1)の man ページの説明を参照してください。outgoing chmod = STRING“outgoing chmod” は、すべての送信ファイル(デーモンによって送信されているファイル)の権限を変更する カンマ区切りのchmodの文字列のセットを指定することができます。
These changes happen first, making the sent permissions appear to be different than those stored in the filesystem itself. For instance, you could disable group write permissions on the server while having it appear to be on to the clients.
これらの変更は最初に行われ、ファイルシステムで保存されたものと異なる送信されるパーミッションを作ることが発生します。 たとえば、あなたは、それがクライアント上にあるように見せている間は、サーバー上でグループの書き込み許可を無効にすることができたでしょう。
(poorな英語力では、よく理解できません。)
この文字列の形式については、コマンド rsyncのオプション –chmod および chmod(1)の man ページの説明を参照してください。auth users = STRING“auth users” は、このモジュールへの接続を許可するユーザ名の、コンマとスペースで区切られたリストを指定します。 ユーザ名がローカルのシステムに存在する必要はありません。ユーザ名は、シェルのワイルドカード文字を含めることができます。 “auth users” が設定されると、クライアントはモジュール接続時にユーザ名とパスワードの入力を要求されます。 ここではチャレンジ・レスポンス認証プロトコルが使われます。 プレインテキストのユーザ名とパスワードは “secrets file” オプションによって指定されるファイルに書き込んでおくことができます。 デフォルトでは、全てのユーザがパスワードなしで接続することができます(これは “anonymous rsync” と呼ばれます)。secrets file = FILENAME“secrets file” は、このモジュールの認証で使われる username:password を記述したファイル名を指定します。 このファイルは “auth users” オプションが指定されているときにだけ機能します。 ファイル内の記述は行区切りで、シングルコロンによって区切られた username:password の形式で記述されます。 行頭にハッシュ(#)があるとコメント行として解釈されます。パスワードには様々な文字が入りますが、多くの OS ではクライアントが入力するパスワード長を制限しています。 そのため、8 文字以上では認証できないことがあります。
“secrets file” にはデフォルトがないので /etc/rsyncd.secrets のようなファイル名を設定しなければなりません。このファイルは、通常 “other” から読めるようにしておく必要があります。(参照 “strict modes”)strict modes = BOOLEAN“strict modes” は secrets file のパーミッションをチェックするかどうかを設定します。 “strict modes” が true なら secrets file は rsync のデーモンを走らせているユーザ以外のアクセスを禁止します。 “strict modes” が false ならチェックは行われません。デフォルトでは true です。 このオプションは Windows マシンで rsync を走らせるために使われます。hosts allow = STRING“hosts allow” は、接続を許可するクライアントのホスト名と IP アドレスのパターンリストを指定します。 パターンと一致しなければ接続は拒否されます。
パターンの記述は次の5つの内の1つです:
- ドットで区切られた 10 進法の IP アドレス。IP アドレスと完全に一致していれば接続が許可されます。
- a.b.c.d/n という記述の address/mask。この場合、ネットマスクの1ビットの番号は n です。 マスクされた IP アドレスと一致していれば接続が許可されます。
- a.b.c.d/e.f.g.h という記述の address/mask。この場合、ドットで区切られた 10 進法のネットマスクは e.f.g.h です。マスクされた IP アドレスと一致していれば接続が許可されます。
- ホスト名。逆引きのルックアップによるホスト名がパターンと一致(大文字小文字の区別をしない)していれば接続が許可されます。完全一致だけが許可されます。
- ワイルドカードを使ったホスト名。Unix のファイル名一致と同じルールを使います。 パターンと一致していれば接続が許可されます。
IPv6リンクローカルアドレスは、アドレスの仕様に範囲を持つことができます:
- fe80::1%link1
- fe80::%link1/64
- fe80::%link1/ffff:ffff:ffff:ffff::
“hosts deny” と “hosts allow” を組み合わせて使うこともできます。 両方のオプションが指定されると、まず “hosts allow” オプションがチェックされて、クライアント側と一致すれば 接続を許可します。”hosts deny” オプションはその後にチェックされて、クライアント側と一致すれば接続を 拒否します。もし “hosts allow” と “hosts deny” の両方に一致しなければ接続は許可されます。
デフォルトでは “hosts allow” は設定されていません。全てのホストが接続できます。hosts deny = STRING“hosts deny” は、接続を拒否するクライアントのホスト名と IP アドレスのパターンリストを指定します。 パターンと一致していれば接続は拒否されます。詳しくは “hosts allow” を見てください。
デフォルトでは “hosts deny” は設定されていません。全てのホストが接続できます。
ignore errors = BOOLEAN“ignore errors” は、転送の delete フェーズを走らせるかどうかを決定するときに、サーバの IO エラーを無視するようにします。 普通 rsync は、テンポラリのリソースが不足しているか、他の IO エラーがあれば、誤って削除するのを避けるために –delete をスキップします。 このテストが非生産的な場合は、このオプションを off にして使うことができます。ignore nonreadable = BOOLEANこれはユーザーが読めるようにされていないファイルを完全に無視するようにrsyncデーモンに指示します。 これは、ディレクトリの間でいくつかの非読み取り可能なファイルを持つことができ、システム管理者は、それらのファイルが全く見られたくないパブリックアーカイブする場合に便利です。transfer logging = BOOLEAN“transfer logging” は ftp デーモンで使われるものと類似した、ダウンロードとアップロードのファイル毎のロギングを可能にします。 ログフォーマットをカスタマイズしたければ、log format を見てください。log format = STRING“log format” は、転送のロギングが可能であるときにファイル転送のログフォーマットを指定します。 フォーマットはパーセント (%) 文字のプレフィックスが付いた、一文字のエスケープ・シーケンスが組み込まれたテキスト文字です。
オプションの数値フィールド幅は、パーセント、エスケープ文字(例えば “%-50n %8l %07p”)で指定することができます。
デフォルトのログ形式は “%o %h [%a] %m (%u) %f %l”, “%t [%p] ” で “log file” パラメータを使用する場合は常に付加されます。 ( このデフォルトのログ形式を要約する perlスクリプトは、rsyncのソースコードディストリビューションの “support” のサブディレクトリ : rsyncstats に含まれています。)
決められたプレフィックスは:
- %a リモート IP アドレス
- %b 実際に転送されたバイト数
- %B ファイルのパミッション(例 rwxrwxrwt)
- %c ファイル転送時にファイルに受信されたチェックサムのバイト数
- %f ファイル名
- %h ホスト名
- %i 更新されているかの項目別リスト
- %l ファイル長(バイト)
- %L 文字列 ” -> SYMLINK”, ” => HARDLINK”, or “” (where SYMLINK or HARDLINK is a filename)
- %m モジュール名
- %M ファイルの最終更新日時
- %n ファイル名 (short form; dirの場合は末尾 “/” )
- %o “send” または “recv” のどちらかの操作
- %p この rsync セッションのプロセス id
- %P モジュールのパス
- %t 現在のデータ時間
- %u 認証されたユーザ名 (または null 文字列)
- %U ファイルのuid(数値)
文字列が”%i”によって出力される意味のリストは、rsyncのmanページ の –itemize-changes オプションを参照してください。
ログ出力のいくつかは変更されていますので、rsyncが古いバージョンの場合は注意してください。 たとえば、削除されたファイルは、rsync 2.6.4より以前は、詳細メッセージとして出力されていました。
timeout = NUMBER“timeout” はこのモジュールに対する IO のタイムアウトを設定します。 このオプションを使えば、rsync は接続が切れたクライアントを待ち続けずに済みます。 タイムアウトは秒数で指定します。0 という値はタイムアウトがないことを意味します。 デフォルトは 0 です。anonymous rsync サーバなら 600 (タイムアウトは 10 分間)が妥当でしょう。refuse options = STRING“refuse options” は、rsyncデーモンにて拒否したい rsyncコマンドラインオプションのリストをスペースで区切って指定することができます。 あなたは、完全なオプション名でも、その一文字の省略形でも、または複数のオプションに一致するワイルドカード文字列をも指定することができます。 例えば、以下のように記述すると –checksum (-c) と すべての 様々な”delete” オプション を拒否します:
refuse options = c delete
上記のすべての 様々な “delete” オプションを拒否するという意味は、オプションが –delete として暗示する、また、オプションが暗黙に指定された場合でも 明白にオプションが指定されたときのように拒否されるということです。 追加の安全機能として、デーモンが送信側であるとき “delete”の拒否は、”remove-source-files”もまた拒否します。 前者なしに後者を使いたいならば、代わりに “delete-*” で拒否します。 — それは、すべての”delete” モードを “–remove-source-files” に影響を及ぼすことなく拒否します。
オプションが拒否された場合、デーモンはエラーメッセージを出力して終了します。 ファイルを提供しているときにすべての圧縮を防止するには、圧縮を要求し、そのクライアントにエラーが戻されるのを回避するために “refuse options = compress” の代わりに “dont compress = ” (以降参照)を使うことができます。dont compress = FILENAME“dont compress” は、転送の際に圧縮したくないファイル名を指定することができます。 ファイル名にはワイルドカードを使うことができます。 圧縮は過度の CPU 時間を消費することがあるので、既に圧縮済みのファイル等を圧縮しないようにすると良いでしょう。
“dont compress” は大文字小文字の区別をしないワイルドカードのパターンリストで記述されます。 リストはスペース区切りです。パターンに一致するソースファイルは転送の際に圧縮されません。
デフォルトでは圧縮されないファイルの拡張子(*.gz *.tgz *.zip *.z *.rpm *.debなど)が、rsync(1)のmanページで “–skip-compress” オプションを参照してください。 デーモンが送信側であるときに、”dont compress” パラメータを設定することは、デフォルトを変更するころです。pre-xfer exec, post-xfer exec = STRING“pre-xfer exec”, “post-xfer exec” は、 それぞれ転送の前後に実行したいコマンドを指定することができます。”pre-xfer exec” のコマンドが失敗したら、転送は、それが始まる前に中止されます。
The following environment variables will be set, though some are specific to the pre-xfer or the post-xfer environment: 以下の環境変数は、設定されます。(一部は、”pre-xfer” or “post-xfer”固有の環境変数です)
- RSYNC_MODULE_NAME: アクセスされているモジュールの名前
- RSYNC_MODULE_PATH: モジュールごとに設定されたパス.
- RSYNC_HOST_ADDR: アクセスしているホストのIPアドレス.
- RSYNC_HOST_NAME: アクセスしているホストの名前.
- RSYNC_USER_NAME: アクセスしたユーザの名前(無い場合は空).
- RSYNC_PID: この転送のための一意の番号.
- RSYNC_REQUEST: (pre-xfer only) ユーザによって指定された module/path 情報 (ユーザが複数のソースを指定でき、そして、要求は、”mod/path1 mod/path2″などのようものであることに注意してください。).
- RSYNC_ARG#: (pre-xfer only) プレリクエストの引数は、これらの番号が付けられた値に設定されています。 RSYNC_ARG0は常に “rsyncd”と、最後の値が単一のピリオドが含まれています。
- RSYNC_EXIT_STATUS: (post-xfer only) サーバー側の終了値。 これは、正常に実行された場合は0、サーバーでエラーが発生した場合は正の値、あるいは、rsync が正しく終了したなかった場合は-1となります。 クライアント側で発生したエラーが現在のサーバー側に送信されないことに注意してください、そしてこれは全体の転送のために最終的な終了ステータスではありません。
- RSYNC_RAW_STATUS: (post-xfer only) waitpid()の終了コード(生値) .
ここで記載している内容は、英語を直訳したにすぎません。直訳が間違っている可能性もありますので、あらかじめご了解ください。
rsyncd(rsync のデーモンプロセス) の設定ファイル名およびディレクトリは、以下のように設定されている、あるいは設定します。
Debian 6 , Ubuntu 12, Debian 7
/etc/init.d/rsync
#! /bin/sh ... RSYNC_CONFIG_FILE=/etc/rsyncd.conf ...
ここで定義しているファイル名をそのまま利用します。
あえて変更したい場合は、ここを変更すると良いでしょう。
設定を終えたら、rsyncd(rsync のデーモンプロセス) を起動します。
$ /etc/init.d/rsync start ...
CentOS 6, ScientificLinux 6
/etc/xinetd.d/rsync
# default: off ... service rsync { ... disable = no ... server_args = --daemon --config=/etc/rsyncd.conf ... }
まず、
disable = no : rsyncのデーモンを有効にします。
server_args = –daemon –config=/etc/rsyncd.conf : 設定ファイルに /etc/rsyncd.conf を指定します。
CentOS系では、xinetd を使って rsync デーモンを起動することに注意してください。
設定を終えたら、rsyncd(rsync のデーモンプロセス) をxinetdを起動することで 実行します。
$ /etc/init.d/xinetd start ...
- Master
lsyncd の設定ファイルを編集します。
/etc/lsyncd.conf
---- -- User configuration file for lsyncd. -- -- Simple example for default rsync. -- settings = { logfile = "/var/log/lsyncd.log", statusFile = "/tmp/lsyncd.stat", statusInterval = 1, } sync{ default.rsync, source="/var/www/html/", target="192.168.1.222::sample_sync", }
この設定ファイルはサンプルがあります。
CentOS系なら、
/usr/share/doc/lsyncd/lrsync.lua をコピーして使うと良いでしょう。
Debian系なら、
/usr/share/doc/lsyncd/examples/lrsync.lua をコピーして使うと良いでしょう。
以下は、この設定ファイルで設定できる基本的な事項です。これ以外にもたくさんありますが、主要なもの(ほとんどここで記載事項で事足りると思います)についてのみ記載しておきます。
settings : 基本設定情報
logfile = FILENAMEここで指定したファイル名にログ情報を出力します。nodaemon = trueデタッチしません。statusFile = FILENAME指定したファイル名に定期的にステータスレポートを出力します。statusInterval = NUMBER何秒間隔でステータスファイルへ書き込むかを指定します。logfacility = STRINGsyslogのファシリティを指定します。デフォルトは、”user”です。logident = STRINGsyslogのタグ名(ID名)を指定します。 デフォルトは、”lsyncd”です。inotifyMode = STRING(Lsyncd >= 2.0.5) inotifyシステム上で 何を監視するかを指定します。 “Modify” , “CloseWrite”(デフォルト)または “CloseWrite or Modify” のいずれかを指定することができます。maxProcesses = NUMBERLysncdは、ここで指定したプロセス数を超えないようにします。この総数は、すべての sync{}s で定義したものにわたった数を意味します。
sync : 同期設定情報
default . SYNCTYPEデフォルトの同期手段を定義します。
.rsync
.rsyncssh
.direct
のいずれかを指定することができます。rsyncを使って同期をとるには、単純に default.rsync を指定します。source = DIRNAME同期元のディレクトリ名を指定します。
ローカルディレクトリを指定する場合は、絶対パスで指定します。
- default.rsync の場合、
コマンドのrsyncのイメージでは、
のSRCに相当します。rsync [OPTION...] SRC... [DEST]
- default.rsyncssh の場合、
コマンドのsshのイメージでは、
のORIGINに相当します。ssh HOST [mv ORIGIN DESTINATION]
(ここでの例 mv コマンドは、その他 mv,del,cp,mkdirなどのディレクトリ、ファイル操作コマンドになります。)
target = DIRNAME同期先のディレクトリ名を指定します。
- default.rsync の場合、
コマンドのrsyncのイメージでは、
のDESTに相当します。rsync [OPTION...] SRC... [DEST]
- default.rsyncssh の場合、
コマンドのsshのイメージでは、
のDESTINATIONに相当します。ssh HOST [mv ORIGIN DESTINATION]
(ここでの例 mv コマンドは、その他 mv,del,cp,mkdirなどのディレクトリ、ファイル操作コマンドになります。)
rsyncでは、ターゲットとなるホスト名+ディレクトリ定義名で指定することができますが、rsyncsshでは、ディレクトリのみの指定となります。 ホスト名は、hostにて設定します。
host = TARGETHOST同期先のホスト名を指定します。
- default.rsyncssh の場合、
コマンドのrsyncのイメージでは、
のHOSTに相当します。ssh HOST [mv ORIGIN DESTINATION]
rsync のようにtarget 内でホストとディレクトリを同時に指定することができないために用意されました。
init = BOOLEAN- default.rsync の場合、
false を指定するとrsyncの初期化プロセスをスキップすることができます。
rsyncOpts = STRINGS- default.rsync の場合、
コマンドのrsyncのイメージでは、
のOPTIONに相当します。rsync [OPTION...] SRC... [DEST]
などのように設定します。-- 単独指定の場合 rsyncOpts = "-ltus" -- 複数指定の場合 rsyncOpts = {"-ltus", "--numeric-ids", "--bwlimit=10000"}
- default.rsyncssh の場合、
default.rsyncと同じように設定、変更することができます。
excludeFrom = FILENAME指定されたファイル名、ルールに従い除外します。exclude = LIST指定されたルールリストに従い除外します。
- 一般的な例は、”foo” と指定した場合、”/bin/foo/bar” というパス+ファイル名は除外となります。
- “/” を先頭に記載した場合、それがパス名の先頭だと認識します。
- “/” を最後に記載した場合、それがパス名の最後尾だと認識します。
- “?” は、”/”以外の文字列だと認識します。
- “*” は、”/”以外の0個かそれ以上の文字列だと認識します。
- “**” は、0個かそれ以上の文字列だと認識します。”*” との違いは、”/”も文字列と認識する点です。
ここで記載している内容は、英語を直訳したにすぎません。直訳が間違っている可能性もありますので、あらかじめご了解ください。lsyncd の設定ファイル名およびディレクトリは、以下のように設定されている、あるいは設定します。
Debian 6 , Ubuntu 12, Debian 7
/etc/init.d/lsyncd
#! /bin/sh ... CONFIG=/etc/lsyncd.conf ...
デフォルトの設定では、
CONFIG=/etc/lsyncd/lsyncd.conf.lua となっていますが、ここでは変更しました。
変更したくない場合は、上記のデフォルトのファイル名で設定ファイルを作成すれば良いです。
CentOS 6, ScientificLinux 6
/etc/init.d/lsyncd
#! /bin/sh ... OPTIONS="-pidfile /var/run/lsyncd.pid /etc/lsyncd.conf" ...
設定を終えたら、lsyncdを起動します。
$ /etc/init.d/lsyncd start ...
- default.rsync の場合、
これで設定は終わりです。あとは、簡単な確認を行いましょう。
同期の動作確認を行ってみる
設定を終えたら、最後に簡単な動作確認をしておきましょう。
- Master 側でファイルを作成してみる。
$ echo 'test' > /var/www/html/test_sync.txt
- Slave 側で同じファイルが作成されたか確認してみる。
$ ls /var/www/html/test_sync.txt /var/www/html/test_sync.txt
このようにファイルが作成されればOKですね。
もちろんファイルの作成だけでなく削除や更新なども確認しておきましょう。
|
まずは、対象ディレクトリのパーミッションとrsyncd.confで設定しているuid を確認してみてください。
次に確認するのは、/etc/rsyncd.conf 設定ファイルでしょう。以下の設定を行って再度やってみてください。
|
SELinuxが有効になっていないか確認してみてください。
以下は、SELinuxを無効にする手順です。
|
|
おそらくは、上記の3点が主な原因だろうと思います。
同時に同期するファイル数が多い場合、更新を監視するファイル数には限界があります。 その設定値は、以下のファイル(max_user_watches)を確認することで知ることができます。
|
|
ちょっとタイムラグが発生することがありますが、ほぼリアルタイムで同期できます。
サイトが分散していたり、バックアップ用に別のサーバーへ毎日バックアップさせる必要もありませんから、非常に便利ですね。
ちょっと、面倒といえば面倒な設定箇所もありますが、これも慣れでしょうね。でも一度設定しておくとあとは非常に便利ですから、まずは、やってみましょう。
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない、検索ができないことがあります。
コメントを投稿 :