lsyncdをつかって簡単にファイル同期を
lsyncdというツールをご存じでしょうか?これを導入することで、リモートのホストとディレクトリ単位で同期をすることができます。
先日のエントリーでも紹介していますが、実は設定や導入がすごく簡単です。した設定でリモート間でファイルの同期をとれるのはやはり便利ですよね。
さて、今回はlsyncdの簡単な導入方法を紹介したいと思います。
lsyncdの仕組み
lsyncdはlinux kernel2.6.13で導入された、inotifyというAPIをつかって動作しています。
inotifyはファイルシステムのイベントを取得することができるAPIで、ファイルの作成や削除などをそれぞれイベントとして取得をすることができます。
この仕組みと、rsyncを組み合わせてファイルの同期を行うことを実現しています。
lsyncdのインストール
まず、以下のページからsourceをダウンロードしてください。
http://sourceforge.jp/projects/freshmeat_lsycnd/resources/
$ tar xvfz lsyncd-1.25.tar.gz && cd lsyncd-1.25 $ ./configure --prefix=/usr/local/lsyncd $ make && sudo make install
インストールは簡単ですね。特別なことはせずに上記のコマンドだけで簡単に導入することができます。
lsyncdを動かす
さて、それではlsyncdを動作させましょう。ネットワーク越しにファイルを同期させる設定のため、host1とhost2という2つのホストがありそれぞれ名前解決ができるという前提で進めます。
動作イメージ
動作イメージは下記の通りです。
- originalデータ
host1:/var/tmp/original/
- copy先
host2:/var/tmp/copy/
host2の設定
まず先に、コピー先のサーバをセットアップする必要があります。下記のコマンドで設定をしましょう。
$ sudo tee /etc/rsyncd.conf << EOF uid = root gid = root log file = /var/log/rsyncd.log pid file = /var/run/rsyncd.pid [data] comment = rsync server path = /var/tmp/copy/ hosts allow = host1 read only = false EOF
さて、上記の設定ファイルが更新されたらrsyncのdaemonを起動させましょう。
$ sudo rsync --daemon $ ps `cat /var/run/rsyncd.pid` PID TTY STAT TIME COMMAND 22290 ? Ss 0:00 rsync --daemon
上記のように正常にプロセスがあがっていれば成功です。
host1の設定
それでは、ファイルのコピー元のサーバでlsyncdを起動しましょう。オプションを引数に渡すだけで簡単に起動をすることができます。
$ sudo mkdir /var/tmp/original/ $ /usr/local/lsyncd/bin/lsyncd /var/tmp/original/ host2::data
これで完了です!それではテストをしてみましょう。
ファイル同期のテスト
それではhost1側からテストをしてみましょう。
$ for i in {1..10} ; do sudo touch /var/tmp/original/$i ; done $ for i in {11..20} ; do sudo mkdir /var/tmp/original/$i ; done
これでhost2:/var/tmp/copy/を確認してみてください。これで正常にファイルができていれば成功です。
簡単に設定でき、とても便利なツールなのでぜひ導入を検討してみてください。
lsyncdの起動script
かなり簡素なものですが、起動scriptです。centos5.3で動作を確認しています。
#!/bin/bash # # lsyncd # # chkconfig: - 99 20 # description: lsyncd start script LSYNCD=/usr/local/lsyncd/bin/lsyncd SRC=/var/tmp/original/ HOST=localhost DEST=data PID=/var/run/lsyncd/lsyncd.pid . /etc/init.d/functions start() { daemon $LSYNCD $SRC $HOST::$DEST --pidfile $PID } stop() { killproc -p $PID } checkproc() { if [ -e $PID ] ; then echo "Already running..." exit 1 fi } case "$1" in start) checkproc start ;; stop) stop ;; restart) stop start ;; *) echo "Usage: lsyncd [ start | stop | restart ]" exit 1 esac exit $?