読者です 読者をやめる 読者になる 読者になる

There's an echo in my head

日々のメモ。

lsyncdとrsync、sshでファイルの同期(rsyncdサーバは立てない)

tips

lsyncdlinux上で動くファイルの更新を検知して処理を走らせるデーモンで、これとrsyncを組み合わせればファイルの更新があったときにリモートサーバとファイルを同期できる。

lsyncdとrsyncぐぐるとrsyncdサーバを立てる記述が目につくけど、sshdが立っていればrsyncdは必要がない。暗号化を行うので若干遅くなるかもしれないけどインターネット越しでも使える。

同期元にはlsyncd, rsync, ssh、同期先にはrsync, sshd、そして同期元から同期先にパスフレーズ無しで入れるようなsshの鍵を設定してあることが必要になる。

lsyncdはyumなどで入る。yumの場合、もしかしたらEPELを設定する必要があるかもしれない。

設定ファイルはLuaで記述する。2.0系と2.1系とでちょっと違っていて、2.1系だとたとえばこんな感じ:

settings {
    logfile      = "/path/to/log",
    pidfile      = "/path/to/pid",
    statusFile   = "/path/to/status", -- 最新の処理結果が書かれる
    maxProcesses = 2,                 -- 同時にsyncを走らせる数
    nodaemon     = false,             -- falseだとdaemonになる。デフォルトはtrue
    insist       = 1,                 -- 起動時に接続に失敗しても再接続を試み続ける
}
sync {
    default.rsync,
    source = "/var/www/html/",             -- 監視対象のディレクトリ。rsyncのSRCに相当
    target = "example.com:/var/www/html/", -- 同期先のホスト名+ディレクトリ。rsyncのDESTに相当
    rsync  = {
        archive = true,
        links   = true,
        update  = true,
        verbose = false,
        exclude = { "*.bak", "*.backup" },
        rsh     = "/usr/bin/ssh -p 2022",    -- 接続時に使うsshコマンド。ポートや鍵のファイルはここで指定できる
        _extra  = {
            "--bwlimit=10000"
        }
    }
}

settingsで全体的な設定をして、syncで個別の監視内容や更新時の処理を記述する。syncは複数記述することができる。

具体的な内容はGitHubのWikiを参照。settingssyncとで別の場所なので要注意。manも-helpコマンドも提供されるのでそれらもみると良いかも。

起動するにはlsyncdコマンドを叩けば良い:

$ lsyncd -log scarce /path/to/conf

settings.nodaemonfalseが設定されていればデーモンとして起動する。settings.pidfileに記述されたpidに対してKILLを発行すれば停止できる。

$ kill -KILL $(cat /path/to/pid)

嵌った点としては、

  • sync.sourceは末尾が必ず/(スラッシュ)で終わるように処理されるrsyncのSRCは/の有無で処理が変わるので要注意。
  • sync.rsh"ssh [OPTIONS]"と書くと実行ファイルが見つからないエラーが発生することがあるので、"/usr/bin/ssh [OPTIONS]"とフルパスで書く必要がある。
  • lsyncdで対応していないオプションはsync.rsync._extraにテーブル{ }で配列っぽく書く。
  • ログの出力レベルは起動時の-logオプションでしか設定できない。allだと全ログを吐き、scarceだとエラーのみを吐く。

ほかにもinotifyの上限にひっかかるとか、普通rootによるsshログインを拒否ってるからそれ以外のユーザが必要だとかあるけど、参考にしたページを参照していただきたく(眠い)。

参考

このブログに出てくるコードスニペッツは、引用あるいは断りがない限りMITライセンスです。