scpやrsyncなどの単純なコマンド形式ツールから、Krusaderといった異なるマシン間のディレクトリ同期に対応したユーティリティなどを試してみたことがある。そして最近使い出したのが、本稿で紹介するUnisonというユーティリティだ。
Unisonによるファイル同期は、Unix、Linux、Windowsの各マシン間で実行でき、例えばWindowsラップトップとUnixサーバとの間での同期といった作業も、2つのLinuxマシン間の同期と同様に簡単に行える。同期するマシン同士はインターネット経由で接続するが、セキュリティに関してはSSH接続による暗号化が施されるようになっている。
UnisonについてはGNU GPLライセンス適用下におけるフリーな使用が許可されている。残念ながら現状での開発作業は一時中断されているようであり、メンテナンスやバグフィックスを誰が担当しているかも明示されていない。もっとも配布サイトの説明によると、オリジナルの開発者たちはこのプログラムを今でも使用し続けており、今後もメンテナンスとサポートを継続して、バグフィックスや小規模な改修を施したバージョンを(適時)リリースしていくとされている。このサイトで公開されている現行の安定版はバージョン2.13.16であるが、ベータ版はバージョン2.27.29であり(番号的にはかなり開きがある)、開発途上の不安定版はバージョン2.28.15とされている。
このユーティリティは公開されてからかなりの年月を経ており、大方のディストリビューションのリポジトリに収録されるようになっている。私が使用しているopenSUSE(10.1および10.2)でも、Unisonは簡単にインストールすることができた。もっとも完全にトラブルフリーに進んだ訳ではなく、openSUSE 10.1でインストールされたのはバージョン2.13.16であったのに、openSUSE 10.2ではそれより新しいバージョン2.17.1がインストールされたのである。このユーティリティの場合、同期させるマシン間で同じバージョンを使用する必要があるため、今回はopenSUSE 10.1マシン側にもrpmseek.comから入手したバージョン2.17.1をインストールしておいた。
ダミーファイルを使った各種のテスト
同期させる各マシンへのUnisonのインストールが終了したら、ターミナルウィンドウを開いて事前に各種のテストを行っておこう。例えばコマンド「unison -doc tutorial」を実行すると、チュートリアルを取得できる。同様に、各トピックの一覧を確認するには「unison -doc topics」、すべてのマニュアルを取得するには「unison -doc all」というコマンドを実行すればいい。
Unisonのプログラム本体はコマンドラインから実行できるが(スクリプトやコンソールウィンドウからの実行に便利)、簡易的なグラフィカルインタフェースを介した操作にも対応している。プログラム起動時にパラメータを何も指定しなければ自動的にグラフィカルインタフェースが使用されるが、コマンドラインモードで起動させたければ「-ui text」というパラメータを指定すればいい。
付属ドキュメントにも書かれているとおり、最も簡単(かつ安全)な同期処理は、同一マシン上に置かれた2つのディレクトリに対して実施することである。私の場合も、最初はoriginalおよびcopyという名前で作成した同一内容のディレクトリを1組用意することから初めてみた。最初のテストとして「unison -ui text original copy」というコマンドを実行したところ、今回が初めての同期作業であること、および、Unisonがこれから実行する作業内容を示す長めのメッセージが表示されたが、その後、このテストで使ったフォルダ間についてはファイル同期をする必要のない旨が報告された。なお同様の処理において、textオプションを付けずに「unison original copy」というコマンドを実行すると「Everything is up to date」というメッセージだけが表示される。
次に行ったテストでは、双方のディレクトリに対してファイルの追加、削除、内容の変更などを行ってから同期をさせてみた。この場合は、両ディレクトリの相違点を示す一覧が表示される。そのうち新規作成したファイルに関しては「new file」とマーキングされた上で、他方のディレクトリへのコピーが行われるようになっている。同じく削除したファイルに関しては、他方のディレクトリでも該当するファイルが削除される。また双方のディレクトリに存在する同名ファイルで内容の異なるものについては、ユーザが「<」および「>」キーを押して、どちらのファイルが正規バージョンであるかをUnisonに指定する必要があるが、両方のファイルをそのまま残したければ「/」キーを押せばいい。またプロンプトに「?」と入力すると、後述する出力例のように、ユーザが選択可能な処理が一覧される。
Unisonにおける同一ファイルのバージョン比較アルゴリズムでは、新旧ファイルの内容を実際に比較しているのではなく、ファイルのiノード番号と最終変更時刻を照合しているだけであり、これらの情報に食い違いがなければ変更は加えられていないと判断するようになっている。この方式は“アップデートの誤検出”がされる可能性もあるが、変更されたファイルを見落とすこともないので比較的安全な方式だと言えるだろう。ただし、touchコマンドでファイルのタイムスタンプを変更すれば、この比較アルゴリズムの裏をかくこともできてしまう。なおファイル群に関する情報の記録先は.unisonディレクトリである。
Contacting server...
Contacting server...
Looking for changes
Reconciling changes
original copy
changed ====> changed listing [] >
deleted ----> mounts [f] f
<---- new file new_one [f] f
Proceed with propagating updates? [] ?
Commands:
y or g Yes: proceed with updates as selected above
n No: go through selections again
q exit unison without propagating any changes
Proceed with propagating updates? [] y
Propagating updates
UNISON started propagating changes at 13:46:02 on 25 Aug 2007
[BGN] Updating file listing
from /home/fkereki/Documents/articles/prueba/original
to /home/fkereki/Documents/articles/prueba/copy
[END] Updating file listing
[BGN] Copying new_one
from /home/fkereki/Documents/articles/prueba/copy
to /home/fkereki/Documents/articles/prueba/original
[END] Copying new_one
[BGN] Deleting mounts
from /home/fkereki/Documents/articles/prueba/copy
[END] Deleting mounts
UNISON finished propagating changes at 13:46:02 on 25 Aug 2007
Saving synchronizer state
Synchronization complete (3 items transferred, 0 skipped, 0 failures)
