Unison――ラップトップとPC間で使えるファイル同期ユーティリティ

 私の場合ラップトップを持ち歩いてその上で仕事をするのが通常のスタイルだが、デスクトップPCを使うこともあるので、必要に応じてこれら2つのマシンの間でファイル群の同期をしなければならない。こうした同期ツールとしては、過去にscprsyncなどの単純なコマンド形式ツールから、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)

2つのマシン間での同期作業

 2つの異なるマシンを対象とする場合、Unisonによる同期には複数の方式が存在している。そのうち一番簡単なものは、SSH接続を利用する方式である。自分の環境でUnisonによるSSH接続が利用できるかどうかを確認するには、「ssh 192.168.0.198 unison -version」といった構文のコマンドを実行してみればいい(IPアドレスについては、Unisonをインストールした相手先のリモートマシンのアドレスに置き換える)。その後、接続先マシンのパスワードを入力して、Unisonのバージョンが表示されれば問題ない。異なるユーザとしてログインする場合は、「ssh someotheruser@192.168.0.198 unison -version」といった構文のコマンドを使用する必要がある。

 SSH接続が利用できる場合は、「unison original ssh://192.168.0.198//home/fkereki/original」(スラッシュ記号が2つ入る部分「//」に注意)といった構文のコマンドでファイルの同期が行える。リモートマシンには別ユーザとしてログインする場合は、先と同様に「unison original ssh://someotheruser@192.168.0.198//home/fkereki/original」などと指定すればいい。

 ソケット接続を介した同期も簡単に実行できるが、この方式はセキュリティ的には劣っているので、パブリックネットワークでの使用は控えるべきである。またこの場合は、リモートマシン側のUnisonをサーバモードで実行させるための設定が必要になる。ただしサーバモード下のUnisonは1度に1つのクライアントしか対応できないので、仮に2人のユーザが同時にファイル同期を行う場合は、他方の処理が終わるまで一方は待機しなければならない。その他にもUnisonによる処理はこのプログラムを起動させたユーザのアクセス権限を用いて実行されるので、各自の所有するアクセス権限の異なる複数のユーザが同一サーバに対して同期を行う際には、SSH接続を使用しなければならない。

 ソケット接続方式を利用する場合は、“サーバ”側のマシンで「unison -socket 12345」という構文のコマンドを実行して、Unisonを接続待機状態に置いておく。その際に“&”をコマンド末尾に追加しておくと、Unisonはバックグラウンドで実行されるようになる。なおここで「-socket」の次に指定した12345は任意指定のポート番号であり、10000から40000の間で適当なものを選択すればたいていは大丈夫なはずだ(一部の番号には使用制限があり、何を使用できるかについては資料を別途参照して頂きたい)。リモートマシン側でのUnisonの起動後にファイルの同期を行うには、「unison original socket://192.168.0.198:12345/home/fkereki/original」といった構文のコマンドを使用すればよく、この指定例の場合は先のSSH接続方式での実行時と同じ結果が得られるはずである。

より高度な使用法

 Unisonには様々な処理用のオプションが用意されている。例えば、同一設定での処理を繰り返し実行するタイプのユーザであれば、そうした設定をプロファイルに登録しておき(各種設定を指定フォーマットで記述したファイルを.unisonディレクトリに格納しておく)、「unison yourprofile 」というコマンドを実行すると、すべての設定を一括で適用させることができる。プロファイルの詳細についてはオンラインドキュメントが用意されているので、そちらを参照して頂きたい。

 基本的にUnisonで想定されているのは1組のマシン間での同期処理であるので、同期対象とするマシンが3つ以上存在している場合は、運用側の手順でカバーする必要がある。そうした場合の具体的な処理法としては、1つのマシンを“スター型トポロジ”のセンタ(あるいはハブ)として運用し、これを基準にして残りのマシン群との同期を行わせるという方法が考えられる。後者のマシン間での直接的な同期を必要としない限り、この方式でうまく行くはずだ。

まとめ

 Unisonは、簡易的なファイルの同期作業をするための有用なツールとして機能するが、ファイル同期に使用するサーバが複数存在する場合は“同一バージョン間のみ対応”という制限が足かせになるかもしれない。またこのソフトウェアについては非常に動作が安定している点も高く評価すべきであり、それを裏付けているのが、安定版のリリースが比較的高いバージョン番号で行われていることおよび、開発陣が現在も使用し続けているためアップデートが継続されていることの2点である。私の場合、操作性に優れた実用的ツールとして、今後も日常的にUnisonを使用していくことになるだろう。

Federico Kerekiはウルグアイ出身のシステムエンジニアで、20年以上に渡るシステム開発、コンサルティング、大学講師の経験を有している。

Linux.com 原文