ハチハチイチナナイチ  Index  Search  Changes  RSS  Login

Unisonマニュアル - チュートリアル

下準備

Unison は CUI と GUI の2種類の UI を提供します.CUI は端末や,スクリプトから呼び出して使うのに適します.GUI はよりインタラクティブな操作を可能にします.このチュートリアルを読み進む上で,どちらのバージョンを使っても構いません.

コマンドラインオプションはそれぞれのバージョンで異なります.GUI バージョンの Unison は直接クリックするだけで使えますが,それにはちょっとした設定が必要です.このチュートリアルでは,CUI バージョンを使うという前提で話を進めます.

Unison は一つのマシン上の異なるディレクトリのファイルの同期を取ることも出来ますし,ネットワーク上の異なるマシンの間で同期を取ることも出来ます*1.一つのマシン上で同期を取る場合には,そのマシンをクライアントと呼びます.2台のマシンの間で同期を取る場合には,それぞれクライアントサーバと呼ぶことにします.

ローカルで使う

まずクライアントで,2つのディレクトリのファイルの同期を取る設定をしましょう.

インストールは済んでいますか?済んでいないならインストールのセクションを参照してください.

テスト用に a.tmp というディレクトリを作りましょう.中には適当なファイルやディレクトリを作っておきます.例えば

mkdir a.tmp
touch a.tmp/a a.tmp/b
mkdir a.tmp/d
touch a.tmp/d/f

こんな感じです.次に a.tmp を b.tmp にコピーしましょう.

cp -r a.tmp b.tmp

では,a.tmp と b.tmp の同期を取ってみましょう.ただし,今回はそれぞれ同じなので,Unison は特に変更を行ないません.しかし Unison は現在の状態を記憶し,次回どのファイルやディレクトリが更新されたかを検知します.

unison a.tmp b.tmp

と打ってみましょう.

CUIモードの場合:

  • 双方のレプリカが同じである旨が表示され,プロンプトが返ってきます.

GUIモードの場合:

  • 双方のレプリカが同じである旨が表示された大きなウィンドウが開くでしょう.File メニューから Exit を選択して,コマンドラインに戻りましょう.

次に,a.tmp と b.tmp にそれぞれ違う変更を加えましょう.例えば

rm a.tmp/a
echo "Hello" > a.tmp/b
echo "Hello" > b.tmp/b
date > b.tmp/c
echo "Hi there" > a.tmp/d/h
echo "Hello there" > b.tmp/d/h

もう一度 Unison を実行しましょう.

unison a.tmp b.tmp

今度は更新されたファイルが表示されるはずです.どちらか一方のレプリカのみで変更されたファイルには,そのファイルがどちらに更新されるかを示す (新しい方から古い方への) 矢印が表示されます.例えば

                <---  new file   c  [f]

この場合2番目のレプリカでのみ c という新しいファイルが作られ,デフォルトでは1番目のレプリカにファイルがコピーされることを示しています.Unison のデフォルトに従う (follow) には,プロンプトで f と打ちます.

もし両方のレプリカが更新され,その内容が異なる場合,その更新は衝突したと表現します.更新が衝突した場合,Unison は以下のようなプロンプトを表示して,どちらのレプリカで更新すべきか問い合わせます.

    new file  <-?->  new file   d/h  []

デフォルトでは,双方のレプリカは更新されず,そのまま保存されます.

(この例におけるbというファイルのように) 双方のレプリカが更新されているが内容が同じである場合,更新は必要ないため Unison は何も表示しません.単に Unison 内部で,双方のファイルが最新であると記憶されるだけです.

この更新状況の表示方法は CUI と GUI どちらのバージョンでも同様に用いられます.唯一の違いは,ユーザが Unison のデフォルトの動作に従うか否かを決定する操作方法のみです.

CUI の場合:

  • 変更されたそれぞれのファイルの状態が順番に表示されます.2つのレプリカに含まれるあるファイルの内容が同一でなかった場合,UI はその変更をどのように更新するかを問い合わせます.デフォルトの動作が (矢印で) 示されている場合,エンターを叩くだけで次に進むことができます.違う操作をしたい場合,< (もしくは >) を叩くことで,右から左 (もしくは左から右) の方向への更新を強制することができます.もしくは / を叩いて更新をスキップし,双方のレプリカをそのままにしておくこともできます.変更されたファイルのリストの最後に達すると,Unison は選択された更新を本当に行なうかもう一度問い合わせます.
  • Unison のプロンプトが表示されている際,? を叩くことでヘルプを表示させることができます.

GUI の場合:

  • メインウィンドウにどちらか (もしくは両方) のレプリカで変更されたファイルが全てリストアップされます.デフォルトの動作から変更する場合 (もしくはデフォルトの動作が指定されていない場合),まずファイル名をクリックするか上下のカーソルキーを使ってファイルを選択します.次に左カーソルか < (もしくは右カーソルか >) を叩くことで,右から左 (もしくは左から右) へファイルを更新させることができます.
  • 全てのキーボードコマンドは UI の上部にあるメニューから選択して実行することもできます.(逆に,それぞれのメニューアイテムには,あればキーボードショートカットが併記してあります.)
  • メインウィンドウに表示されている更新動作の内容に納得したら,Go ボタンをクリックして実際に更新を実行してください.更新が完了したものから順に,それぞれのファイル名の隣にチェックサインが表示されます.

リモートで使う

次に,Unison でネットワーク越しにレプリカの同期を同期させる方法を見てみましょう.

インストールのセクションを参考に,サーバにも Unison をインストールしましょう*2.実行可能ファイルにパスが通っていることを確認してください.

サーバにインストールされた Unison とクライアントの Unison のバージョンが揃っていることが重要です.しかしクライアントと同じバージョンの Unison を

unison -addversionno

で呼び出すことも可能です.

Unison をネットワーク越しに使うには2通りの方法がありますので,どちらの方法を使うか決めましょう.

リモートシェルを使う方法
この方法を使う場合,クライアントのコマンドラインから rsh や ssh 等でサーバ上のコマンドを実行出来ることが必要です.この方法はより簡単*3で,通信路が暗号化される ssh を使えば,よりセキュアに使うことが出来ます.
ソケットを使う方法
この方法はクライアントとサーバの間で TCP のコネクションが張れさえすれば使えるという利点があります.厳格なファイアーウォールが間にある場合は厳しいですが,そうでなければどこでも使うことが出来ます.

リモートシェル越しに使う

Unix で使われる標準的なリモートシェルは rsh です.ssh は rsh と似ていますが,通信路を暗号化するという点で,より安全です.rsh や ssh でサーバとクライアントの間のコネクションを確保するには設定が必要です.rsh や ssh のドキュメントを参照してください.ここでは例として ssh を使用しますが,必要があれば適宜 ssh を rsh に読み替えてください.

まず,サーバ側のコマンドをクライアントから実行出来るか確認しましょう.

ssh remotehost unison -version

と打って表示された内容が,クライアントで

unison -version

と打った場合の内容と同じであることを確認してください.もし実行出来ないのであれば,(permission denied 等と表示される場合は) ssh の設定を見直すか, (command not found 等と表示される場合には) サーバで Unison の実行可能ファイルにパスが通っているか確認してください.

クライアントのホームディレクトリにテスト用の a.tmp というディレクトリを作りましょう.

クライアントの Unison がサーバに接続出来るか試してみましょう.

unison -testserver a.tmp ssh://remotehost/a.tmp

ではホームディレクトリに移動して

unison a.tmp ssh://remotehost/a.tmp

と打ってみましょう.クライアントの a.tmp がサーバに転送されるはずです.

最初の同期が終わったら,a.tmp の中にファイルを作ったりファイルを更新したりして,もう一度実行してみましょう.ローカルで実行した場合と同じような表示が出るはずです.

クライアント上とサーバ上でユーザ名が異なる場合には,コマンドラインで指定する必要があります.

unison a.tmp ssh://user@remotehost/a.tmp

注意:

  • a.tmp をサーバのホームではないディレクトリに置きたい場合,コマンドラインで絶対パスを指定出来ます.
unison a.tmp ssh://remotehost//absolute/path/to/a.tmp
  • サーバの Unison のパスを明示することが出来ます.コマンドラインオプションでは -servercmd /full/path/name/of/unison,もしくは設定ファイルに servercmd=/full/path/name/of/unison と追加してください.同様に,rsh や ssh のパスも -rshcmd や -sshcmd で指定出来ます.

ソケット越しに使う

Unison をソケット越しに使うには,サーバで Unison サーバプロセスを走らせておく必要があります.このプロセスはバックグラウンドでクライアントの Unison からの接続を待ち受けています.

Unison をソケット越しで使う方法は安全ではありません.やり取りするファイルの内容が平文のままネットワーク上を流れるだけでなく,世界中からそのサーバプロセスに接続して,あなたのファイルシステムの内容を読み取ってしまうことも可能なのですから! (もちろんこれには Unison のクライアントとサーバの間でやり取りされるプロトコルを理解していなければなりませんが,それに必要なのは Unison のソースだけです.)

デーモンを開始させるにはサーバ上で

unison -socket NNNN

と打ちます.NNNN にはポート番号を指定します.(他のアプリケーションに使われていない番号を指定します.指定したポートが既に使われていた場合には,Unison はエラーを表示して終了します.) クライアントで指定された path はデーモンが開始されたディレクトリからの相対パスに変換されることに注意してください.これはリモートシェルを用いた場合と異なります.リモートシェルの場合,path はサーバ上のユーザのホームディレクトリからの相対パスとなります.

クライアントのホームディレクトリにテスト用の a.tmp というディレクトリを作り

unison a.tmp socket://remotehost:NNNN/a.tmp

と打って実行してみましょう.a.tmp がサーバにコピーされるはずです*4.最初の同期が終わったら,ファイルに変更を加えて再度実行してみましょう.ローカルで実行した場合と同様の結果が得られるはずです.

ホームディレクトリのファイルをUnisonで同期させる

Unison の基本的な操作に慣れたら,Unison で普段使っているファイルを日常的に同期させたいと思うかもしれません.これにはいくつかの方法があります.

  1. (ignore で) 無視するファイルを設定して一時ファイルや一方のホストのみに属するファイルを除外しながら,ホームディレクトリ全ての同期を取る.
  2. 双方のマシンのホームディレクトリに shared (もしくは current でも何でも) というディレクトリを作り,同期を取りたいファイルは全てそのディレクトリに入れる.
  3. 双方のマシンのホームディレクトリに (例えば) shared というディレクトリを作り,同期を取りたいファイルへのリンクをそのディレクトリに入れる.シンボリックリンクが Unison に透過的に扱われるように, follow 設定をする.
  4. ホームディレクトリを同期を行なう基点として指定するが,Unison にはその中の一部のサブディレクトリやファイルの同期を取るよう指定する.これはコマンドラインで -path オプションによって指定することも出来ます.

ホームディレクトリ全体等,大きなレプリカに対して初めて Unison を実行する際には,Unison は全てのファイルをチェックして内部のデータ構造を記録するのに多くの時間を費します.試しに実行してみるのであれば,コマンドラインで -path some/small/subdirectory というように小さなサブディレクトリのみを指定して,実行時間を節約するのも手です.満足する結果が得られたら path オプションを外して実行し,Unison がディレクトリを一生懸命漁っている間に,あなたはランチでも食べてきてください.

もしレプリカが大きく,しかも Windows 上のレプリカが含まれている場合には,Unison の実行速度が遅過ぎると感じるかもしれません*5.このような場合,fastcheck の設定を行なうのも一つの手です.

例えばラップトップとファイルサーバの間でファイルを同期させる場合のように,いつも決まったマシンから Unison の操作をする場合,クライアント側だけの設定をするだけで済むことに気付くでしょう.これは一方向性のミラーリングツール (例えば rdist 等) を用いた場合に,常に最近レプリカに変更が加えられたマシンから操作をする必要があることと比べると,特徴的です.

もっと知る

様々な特徴について書かれた Unison のオンラインマニュアルを手に入れるには,コマンドラインから

unison -doc topics

と打ち込むか,GUI 画面の Help メニューをクリックします.オンラインマニュアルはこのマニュアルと基本的な内容は一緒です.

Unison には2種類のメーリングリストがあります.詳しくは http://www.cis.upenn.edu/~bcpierce/unison/download.html を見てください.

Name: Comment:

*1 この場合,両方のマシンでそれぞれ同じプログラムが走ります.それらの違いは,どちらが UI を表示するかだけです.

*2 サーバには CUI と GUI のどちらのバージョンをインストールしても構いません.サーバ側の Unison は UI を表示する必要が無いからです.

*3 手動で Unison サーバプロセスを走らせる必要が無いため

*4 この場合,a.tmp はサーバ上の,デーモンを起動したディレクトリの中に作られます.

*5 何故なら Unison は Windows 上では,実行する度に全てのファイルとディレクトリをスキャンするからです.というのもこれが Windows 上で更新をチェックするのに最も安全な方法だからです.