2004年04月12日

ディレクトリ同期

マシン間でファイル同期をさせるのにいまいち良いソフトが見つからず困って居たところunisonというソフトを発見したので試してみました。
同期ソフト自体はそれこそたくさんあるのですが、片方同期(と言うよりはバックアップ)メインだったり、両方同期があっても削除したファイルが同期相手からレストアされて同期中のディレクトリにゴミファイルが溜まっていく一方とかどうにも使い勝手が悪いものばかりでした。

そんなこんなで困っていたところ、それを解決出来そうなunisonというアプリがあることを知ったので、インストールして試してみることにしました。

で、ローカルでテストしてみたところまさに理想の挙動をしたので早速採用することにしました。

ちなみにUnisonの特徴は以下の通り

  • GUI版もあるが基本的にはコマンドラインベース
  • rsyncアルゴリズムを用いた高速な同期
  • 前回同期時の状況を記録しているため、増減したファイルを的確に割り出して、コピーや削除してくれる
  • コンフリクトした場合の処理をいろいろと選べる
それで、とりあえず同期相手のLinuxの方にも入れて見ることにしました。
動かすだけならダウンロードページからコンパイル済み実行ファイルをダウンロードして、パーミッションを755にすればそれだけで動きます。
が、折角ならソースからコンパイルしようと思い「src.tar.gz」をダウンロードして展開→Makefileでインターフェースをどうするかなどの設定をいじってからmakeしてみると、ocamlcが無いと怒られてしまいました。

使っていたディストリビューションにはcoamlのパッケージが無かったためここから「ocaml-3.05-1.src.rpm」をダウンロードしてrpmbuildしてインストール。

その後unisonをmakeしてみたところ、今度は無事makeに成功( ̄▽ ̄)ノ

で、折角なんでcheckinstallでrpmにして入れようかと思ったら、なんか循環エラーが出るため、断念して、出来上がったunisonの実行ファイルだけシステムディレクトリに移動してインストール終了としました。

で、早速使ってみる事にします。
今回はサーバ側がLinuxでクライアント側がWindowsのcygwin環境です。

まず、これまでcygwin上で

rsync -auvz -e ssh --delete  user@hoge.foo.bar:/home/user/datadir/ /cygdrive/c/datadir/
rsync -auvz -e ssh /cygdrive/c/NewDatafile/ user@hoge.foo.bar:/home/user/datadir/
mv /cygdrive/c/NewDatafile/  /cygdrive/c/datadir/
となっていたシェルスクリプトを以下のように修正
unison /cygdrive/c/datadir/ ssh://user@hoge.foo.bar/datadir -batch -prefer older<\pre>
して実行してみると、見事に同期しました。( ̄▽ ̄)ノ
(なお「-prefer older」はコンフリクトしたら古い方を生かすという設定です<上記のケースでは古いファイルの方が重要な事が多かったので)

で次のテスト
これまでは自動削除の為に、cygwin側で新しく作ったファイルは一度「c:\NewDatafile」というディレクトリにおいて、同期してからデータディレクトリに移動してましたが、これだと同期前と同期後でファイルの場所が異なってしまい、ソフトなどの履歴機能が使いにくい状況でしたが、unisonを使えば解決出来るはずです。

そこで、早速ゴミファイルを同期させてから、クライアント側で削除してから再び同期してみました。
すると、見事にクライアント側でもサーバ側でもゴミファイルが削除されました(≧▽≦)ノ

CUIな辺りも正直バッチでしょっちゅう流すものがGUIっていうのはイヤだったのでありがたいですしssh使って暗号化も出来、セキュリティも安心なのでunisonとは長いつきあいになりそうです(笑)

参考URL:

Posted by Takuchan at 2004年04月12日 16:28 | トラックバック(2)