Unisonマニュアル私的日本語訳

last-updated at Jun 14, 2005 00:00, in /translations

クールなファイルシンクロナイザ, Unison のマニュアル のクールでない私的な日本語訳です.対象のバージョンはだいぶ古めです.

内容は一切保証しません.誤訳や解釈間違いなどありましたら教えてください.

概要

Unison は Unix 及び Windows に対応したファイルシンクロナイザです.異なるホスト (もしくは同 じホスト上の異なるディスク) に別々に保存され変更されたレプリカ(訳 注: ここでは同期の対象となるファイルやディレクトリ,もしくはそれら全体 を指します)の間で,それらの内容を同期させることができます.

Unisonは,CVSPRCS 等のリビジョン管理 システム,Coda 等の分散ファイルシステム, rsync 等のミラーリングツール,そして IntellisyncReconcile 等の他のシンクロナイザと多くの共 通した特徴を備えていますが,同時に以下のような違いもあります.

  • Unison は Windows (95/98/NT/2K) と Unix (Solaris/Linux etc.) の両方の プラットホーム上で動作します.それだけでなく,プラットホームを越え て動作することも出来ます.つまり,Windows の動いているラップトップ と Unix で稼働しているサーバの間でファイルを同期させることができるわ けです.
  • 組み込みのファイルシステムと異なり,Unison はユーザレベルで動作します. カーネルをハックする必要はありませんし,どちらのホストにおいても管理 者権限は必要ありません.
  • 他の一方向性のミラーリングツールやバックアップユーティリティと異なり, Unison は両方のホストそれぞれについて (双方向に) ファイルの更新を行な うことが出来ます.一方のホストでのみレプリカが変更された (つまり衝突 しない更新である) 場合には自動的にもう一方のホスト上のファイルも更新 し,もし変更が双方のレプリカに対して行なわれている場合にはそれを検知 し,ユーザに通知します.
  • Unison はネットワークに接続された任意のホスト間で実行できます.ソケッ トによるダイレクトな TCP/IP 通信でも可能ですし,rsh や ssh で通信をト ンネルすることもできます.PPP 接続のように細い回線でも十分に動作しま す.巨大なファイルの一部分のみを更新するような場合には,rsync のもの に似た圧縮プロトコルによって最適化を行ないます.
  • Unison には明確で詳細な仕様があります.
  • Unison はエラーに強く作られています.プログラムの異常終了や突然の回線 断の場合にも,常に双方のレプリカの状態を保ちます.
  • Unison はフリーです.全てのソースコードは GPL の下で公開されています.

序文

人々
  • Benjamin Pierce が Unison プロ ジェクトのリーダーを務めています.Zhe Yang はプロジェクトのフルタイム の研究者です.
  • 現バージョンの Unison は Tervor Jim,Benjamin Pierce, Jerome Vouillon, Sylvain Gommier,Matthieu Goulay により設計・実装さ れました.
  • Norman Ramsey と Sylvain Gommier により,rsync プロトコルの実装がなさ れました.これは Andrew Tridgell の論文が元となり,rsync からインスパ イアされました.
  • ミラーリング及びマージ機能は Sylvain Roy により実装されました.
  • Jacques Garrigue がオリジナルの GTK バージョンの UI に寄与しました.
  • Java によるシンクロナイザのプロトタイプの実装に Sundar Balasubramaniam が寄与しました.Insik Shin と Insup Lee はこの実装へのデザイン案 に寄与しました.Cedric Fournet は更に以前のプロトタイプに寄与しました.
ライセンス

Unison はフリーソフトウェアです.GNU GPL の下に変更や再配布をして構いま せん.詳しくは Unison のソースに含まれる COPYING を参照してください.

バグレポート

Unison が思ったように動かない場合,いくつかの踏むべき手順があります.

  • まず,Unison に -debug all オプションをつけて実行してみてください. Unison が内部でどういった動作をしているかが表示されます.どこで問題が 発生しているか見極めるのに有効でしょう.
  • 次に unison-help@cis.upenn.edu にバグレポートを送ってください.その内 容がバグフィックスの役に立ちます.その際,Unison のバージョン (unison -version で表示されます),どのようなマシンで Unison を実行し ているか,-debug all オプションをつけて実行した際の出力,そして発生し た問題に関するできる限り詳細な情報を含めることを忘れないでください.
  • もし他のユーザにも同様の問題が発生しているのではないかと思う場合 (例 えばバグではなく設定の問題に思える場合),ユーザのメーリングリスト (unison-users@groups.yahoo.com) で役立つアドバイスがもらえるかもしれ ません.
支援

Unison は開発者にとって片手間のプロジェクトです.私たちは,自分たち自身 やコミュニティにとって役に立つ何かを作ることが楽しくて開発を続けていま す.が,私たちには他にもやらねばならない仕事があります.もしあなたが Unison を気に入り,開発に手を貸したいと思ったならば,私たちはいつでも歓 迎します.コードの体系などより詳しいことは,ソースに含まれる CONTRIB というファイルを参照してください.

もしハックする気がなくても,単にあなたがどのように Unison を好きなのか を教えてくれるだけでも私たちへの支援になります.例えば「Unison を使って います.しっかり動作してくれます」とか「使ってみましたが,欲しかったも のとは少し違います.なぜなら‥‥」といった ような短い文章でも,私たちに とっては有用な情報です.

インストール

Unison のインストールは非常に簡単です.以下の手順に従うだけで,ものの数 分で Unison が利用可能になるでしょう.

Unison は

  • 端末やスクリプトから用いるのに適した,シンプルなコマンドラインユーザ インタフェース (CUI)
  • GTK を用いた洗練されたグラフィカルユーザインタフェース (GUI)

の2つのユーザインタフェース (UI) を備えています.

ファイルを同期させたい全てのマシンに Unison をインストールする必要があ ります.ただ,GUI を使いたい場合には実際に UI を表示するマシン (つまり クライアントとして使うマシン) にのみ GUI バージョンの Unison をインストー ルするだけで構いません.その場合も,サーバマシンにインストールされてい るのが CUI バージョンであるか GUI バージョンであるかに関係無く,きちん と動作します.

ダウンロード

もしマシンのアーキテクチャに合ったビルド済みのバイナリが手に入るなら, それをダウンロードして (コマンドラインから使うのであれば) パスの通った ディレクトリに放り込むか,(直接クリックして使いたいなら) デスクトップに 置くだけでOKです.

GUI バージョンのバイナリ(これはファイル名に gtkui を含みます)は,実際 には2種類の UI を提供します.デフォルトでは GUI で,コマンドラインで

 unison -ui text

を指定すると CUI で動作します. CUI バージョンのバイナリ(同様にファイ ル名に textui を含みます)は CUI のみを提供します.

アーキテクチャに合ったビルド済みバイナリが見つからないときは,自分でソー スからビルドする必要があります.数は少ないですが,有志による移植版も存 在します.

本当に実行可能なファイルをインストール出来たか確認しましょう.ファイル をクリックして実行してみるか,コマンドラインから

 unison -version

と打ってみましょう.

Unison はいろいろな場面で使うことが出来ます.

  • 同一マシン上のディレクトリ間で
  • 異なるマシン間をダイレクトな TCP/IP 通信で
  • 異なるマシン間を rsh や ssh 越しで

もし rsh や ssh 越しで利用することを考えているなら,rsh や ssh を別途イ ンストールする必要があります.

実行

Unison のインストールが終わったら,マニュアルのチュートリアルを読むか,

 unison -doc tutorial

と打ってみましょう.

アップグレード

アップグレードも簡単です.古いバイナリを新しいバージョンのバイナリに置 き換えるだけです.

アップグレードの前に一度古いバイナリで完全にファイルを同期させてお いた方が良いでしょう.Unison は各レプリカの状態を記憶するためにアーカイ ブファイルを生成しますが,新しいバージョンではそのファイルのフォーマッ トが変わっていることがあります.この場合,古いアーカイブファイルは単純 に無視されます(が,古いアーカイブファイルは削除はされません.つまり Unison を古いバージョンに戻せば,古いアーカイブファイルがそのまま利用可 能なわけです).つまり,古いバージョンで同期させずに新しいバージョンを 動作させた場合,全ての更新が衝突したと判断され,手作業で同期させねばな らなくなるわけです.

移植版

何人かの人が特定のアーキテクチャ向けのビルド済みのバイナリや,インストー ルを容易にするスクリプトを提供してくれています.私たちが管理しているわ けではなく,その内容に保証はありませんし,必ずしも最新版に追随してはい ませんが,きっと役に立つことでしょう.現時点で手に入るものを挙げておき ます.

  • Dan Pelleg が Unison を FreeBSD に移植しました.つまり ports から Unison をインストールできます. cd /usr/ports/net/unison; make && make install しましょう(実行する前に ports が最新であることを確認し ましょう.FreeBSD 向けにコンパイルされた最新の Unison が利用できま す).FreeBSD 向けのバイナリは http://www.freebsd.org/cgi/ports.cgi?query=unison&stype=all からも手 に入ります.
  • Andrew Pitts が Linux-PPC プラットホーム向けのバイナリを作りました. ftp://ftp.cl.cam.ac.uk/papers/amp12/unison/ から手に入ります.
  • Robert McQueen が Debian 向けのパッケージを管理しています.詳しくは http://packages.debian.org/testing/non-us/unison.html を参照してくだ さい.
  • Chris Cocosco が SGI IRIX (6.5) 向けのバイナリを提供しています. http://www.bic.mni.mcgill.ca/users/crisco/unison.irix/ から手に入りま す.
ビルド

ビルド済みのバイナリが手に入らない場合は,ソースからコンパイルする必要 があります.ソースはバイナリと同じ場所から手に入ります.

基本的に,OCaml が移植され,Unix モジュールが完全に整った環境であれば Unison は動くはずです.特に様々なバージョンの Windows (98, NT, 2000) 及び Unix (Solaris, Linux, FreeBSD, MacOS X),更に 32bit 及び 64bit 環境でテストされています.

Unison は MacOS 8 及び 9 では (恐らく今後も) 動きません.

Unix

Objective Caml compiler (バージョン 3.04 以降) が必要です. オフィシャルサイト から入手可能です.Unix シス テムに OCaml をインストールするのは非常に簡単です(クイックスタート‥‥ 多くのシステムでは以下のコマンドでコンパイラをインストールできます.ま ず make world opt,次に su で root になり,make install).ソース に含まれる手引きを参照してください.バイトコードコンパイラに加えてネイ ティブコードコンパイラもビルドしたいと思うかも知れませんが,これは絶対 必要な条件ではありません.

また,GNU make が必要です.make --version で GNU バージョンの make が インストールされていることを確認しましょう.

OCaml のインストールが終わったら,Unison のソースを入手して展開しましょ う.展開してできたディレクトリに移動し

 make UISTYLE=text

と打てば unison という名前で実行可能ファイルが作成されるはずです.

./unison と打って実行できるか確認しましょう.上手くいっていれば usageが表示されるはずです.

GUI バージョンをコンパイルしたい場合は,以下の2つも用意しておく必要があ ります.

  • GTK ライブラリ
    • GTK の 1.2 以降が必要です. http://www.gtk.org/ から入手できます し,多くの Unix でそのシステムに応じた方法でインストールすること もできます.
  • LablGtk
    • Lablgtk2 (1.3.3 で動作が確認されています) が必要です. http://wwwfun.kurims.kyoto-u.ac.jp/soft/olabl/lablgtk.html から開 発版の tarball を入手し,展開しましょう(クイックスタート‥‥ make configure,次に makemake opt,そして su して make install).次に Unison をビルドしましょう.パスの設定が正しければ make UISTYLE=gtk と打つと unison という名前で実行可能ファイルが生 成されます.

もしこの方法がうまくいかない場合でも心配は無用です.Unison は CUI でも 十分に動作しますから.

Unison の実行可能ファイルをパスが通ったディレクトリに入れるか,ファイル のあるディレクトリにパスを通すかしましょう.

Windows

どのバージョンの Windows でも配布されているバイナリファイルは動作します が,ソースからビルドしたいという人もいるでしょう.

バイトコードバージョン

Unison をビルドするのに,シンプルですが遅い方法はバイトコードバージョン をビルドする方法です.Windows バージョンの OCaml コンパイラの 3.04 以上 をインストールしましょう.次に Unison のソースを入手して

 make UISTYLE=text NATIVE=false

とタイプすることで,バイトコードをコンパイルできます.unison.exe という ファイルができているはずです.

ネイティブコードバージョン

より効率的なネイティブバージョンの Unison をコンパイルするには,2つの方 法があります.両方とも OCamml の 3.04 以降と Cygwin が必要です.これら の方法の違いは C コンパイラです.MS Visual C++ を用いるか Cygwin の GNU C を用いるかです.

違いは何でしょうか.

  • MSVC を用いる方法でのみ,スタティックリンクされた Unison の実行可能ファ イルを生成できます.
  • Cygwin の GNU C を用いる方法はフリーなソフトウェアのみで実現できます.

INSTALL.win32-msvc と INSTALL.win32-cygwin-gnuc というファイルに,それ ぞれの方法でビルドする手順が書かれています.

インストールオプション

ソースアーカイブの中の Makefile に Unison がどのようにビルドされるかを コントロールできるスイッチが含まれています.有用ないくつかを紹介します.

  • NATIVE=true で,OCaml コンパイラでバイトコードバージョンより若干速く 動作するネイティブバージョンの Unison をビルドできます.配布版のバイ ナリではこのオプションを使っています.
  • make DEBUGGING=true でデバッグシンボルを生成します.
  • make STATIC=true で (ほとんど) スタティックにリンクされたバイナリを生 成できます.ポータビリティのため,配布版のバイナリではこのオプション を使っています.

チュートリアル

下準備

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

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

Unison は一つのマシン上の異なるディレクトリのファイルの同期を取ることも 出来ますし,ネットワーク上の異なるマシンの間で同期を取ることも出来ます (この場合,両方のマシンでそれぞれ同じプログラムが走ります.それらの違 いは,どちらが UI を表示するかだけです).一つのマシン上で同期を取る場 合には,そのマシンをクライアントと呼びます.2台のマシンの間で同期を 取る場合には,それぞれクライアントサーバと呼ぶことにします.

ローカルで使う

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

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

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

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

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

cp -r a.tmp b.tmp

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

unison a.tmp b.tmp

と打ってみましょう.

CUIモードの場合:

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

GUIモードの場合:

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

次に,a.tmpb.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 をインストールしま しょう(サーバには CUI と GUI のどちらのバージョンをインストールしても 構いません.サーバ側の Unison は UI を表示する必要が無いからです).実 行可能ファイルにパスが通っていることを確認してください.

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

unison -addversionno

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

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

  • リモートシェルを使う方法
    • この方法を使う場合,クライアントのコマンドラインから rsh や ssh 等でサーバ上のコマンドを実行出来ることが必要です.この方法はより 簡単(手動で Unison サーバプロセスを走らせる必要が無いため)で, 通信路が暗号化される 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 がサーバにコピーされるはずです(この 場合,a.tmp はサーバ上の,デーモンを起動したディレクトリの中に作られま す).最初の同期が終わったら,ファイルに変更を加えて再度実行してみましょ う.ローカルで実行した場合と同様の結果が得られるはずです.

ホームディレクトリのファイルを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 の実行速度が遅過ぎると感じるかもしれません(何故なら Unison は Windows 上では,実行する度に全てのファイルとディレクトリをスキャンする からです.というのもこれが Windows 上で更新をチェックするのに最も安全な 方法だからです).このような場合,fastcheck の設定を行なうのも一つの手 です.

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

もっと知る

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

unison -doc topics

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

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

リファレンス

ここでは Unison の詳細な特徴について触れます.

Unison を実行する

Unison を実行するにはいくつかの方法があります.

  • コマンドラインで unison profile と打って実行する.Unison は .unison ディレクトリから profile.prf というファイルを探します.このファイルの 中で root が2つ指定されていない場合は,Unison はプロンプトを表示して そのプロファイルに情報を追加します.
  • コマンドラインから unison prifile root1 root2 と打って実行する.この 場合 Unison は profile を使いますが,これには root ディレクティブが設 定されていてはいけません.
  • コマンドラインから unison root1 root2 と打って実行する.これは unison default root1 root2 と同じです.
  • 単に unison と打つ (もしくはアイコンをクリックして実行しても一緒です). この場合,Unison は使用するプロファイルを問い合わせます (もしくは必要 があれば新たに作成します).
.unison ディレクトリ

Unison はそれぞれのホストのディレクトリに,様々な情報を保存します.環境 変数 UNISON が設定されている場合,その値がそのディレクトリ名として使用 されます.設定されていない場合,使用している OS によってディレクトリ名 は異なります.Unix では $HOME/.unison,Windows では,環境変数 USERPROFILE が設定されていれば $USERPROFILE\.unison,HOME が設定されて いれば $HOME\.unison,どちらも設定されていなければ C:\.unison が使われ ます.

アーカイブファイルはそのレプリカのあるホストの .unison ディレクトリに作 られます.プロファイル (後述) は常にクライアントの .unison ディレクトリ から探し出されます.

Unison はそれぞれの root について全く異なるアーカイブファイルを保持する ことに注意してください.

.unison ディレクトリを丸ごと同期させることはお薦めできません.巨大なアー カイブファイルを更新に含めることになるからです.しかし,あなたがそれを 望むならそうしても安全です (.unison ディレクトリ内のプロファイルを同期 させること自体は何ら問題ありません).

アーカイブファイル

各レプリカに対するアーカイブファイルは以下の情報から計算されます.

  • 全てのホストについての正確な名前.saul のような短い名前は saul.cis.upenn.edu のようにフルアドレスに変換されます.
  • 全てのホストにおけるレプリカへの path.繰り返すと,相対パス,シンボリッ クリンク等は絶対フルパスに変換されます.
  • Unison がファイルのフォーマットを変更する際に常に更新される内部的なバー ジョン番号

この方法はほとんどのユーザに対して有効に機能します.しかし,アーカイブ ファイルの名前を生成する方法を変更することが役に立つ場合もあります. Unison は2つの方法を用意しています.

ローカルホストの正確なホスト名 (これは例えばどのファイルが同期されたか という情報を保存するアーカイブファイルの名前を生成するのに使われます) を調べるために,Unison は通常 gethostname() というシステムコールを使い ます.しかし UNISONLOCALHOSTNAME という環境変数が設定されている場合,代 わりにその変数の値が使用されます.これにより,ホスト名が頻繁に変わる場 合 (例えばラップトップをあちこち持ち歩くような場合) でもより簡単に Unison を利用することができます.

よりパワフルな方法として,rootalias 設定を用いることができます.その設 定ファイルには以下の書式の複数の行を含みます.

rootalias = //hostnameA//path-to-replicaA -> //hostnameB//path-to-replicaB

ある一組の root に対してアーカイブファイル名を計算する際,Unison は rootalias 設定の左側の root 設定を右側の root 設定に置き換えます.

あるホスト上の root を置き換えたい場合,以下のように追加します.

rootalias = //new-hostname//new-path -> //old-hostname//old-path

注意: rootalias 設定は危険ですので,自己責任で使ってください.特に, 1)元の root と新しいエイリアスが同じファイル群を指していること,2)元の ファイル名がもう使えなくなったためにファイル名を変え,これからもそのファ イル名を絶対に使わないこと,のいずれかを満たす場合のみ使用してください (元の root とエイリアスが違うファイル群を指している場合,Unison は混乱 してしまいますから).新しい rootalias 設定を加えたら,Unison を何度か (batch フラグを外す等して) 実行してみることをお薦めします.そして,特に 変更の検知がうまく働いているかをチェックしてください.

オプション

Unisonの細かい動作はオプションで設定可能です.

いくつかのオプションは boolean 値 (しばしばフラグと呼ばれます) をとりま す.その他のオプションは数値か文字列を値にとります.リスト中では数値は n,文字列は xxx と表現します.文字列をとるオプションのほとんどは複数回 設定できます.設定値はその度に累積されます.

オプションを設定するには2通りの方法があります.一時的にはコマンドライン オプションとして実行時に指定します.恒久的には,クライアントの .unison ディレクトリのプロファイルに追記します.オプション・プロファイルに 関わらず,オプションの順番は重要ではありません.

p というオプションをコマンドラインから設定するには, (boolean 値の場 合) -p,もしくは (数値か文字列の場合) -p n もしくは -p xxx と追加してく ださい.コマンドラインから boolean 値を false にする方法は今のところあ りません.しかし,全ての boolean 値をとるオプションはデフォルトで false ですので,あなたがプロファイルであるオプションを true にセットし ていて,それを一時的に false にしたいという時にだけ,この制限がかかりま す.

unison -help でオプションの一覧が取得できます.

では,それぞれのオプションについて詳しく見ていきましょう.多くはマニュ アルの別のセクションにより深く解説されています.

addprefsto xxx デフォルトでは, (ignore オプション等) Unison によって 加えられる新たなオプションは,Unison が実行時に読み込む よう指定された設定ファイルに追記されます. addprefsto filename を設定することにより,filename で 設定されたファイルに新たなオプションを追記するようになります.
addversionno true にセットされた場合,リモートサーバで単に unison を実行する代 わりに unison-currentversionnumber を実行します.これにより一つの サーバマシンにおいてバージョンの異なる Unison が共存できるように なり,クライアントがどのバージョンのUnison を使用していても,サー バ側の Unison のバージョンを選択できることになります.
auto true にセットされた場合,UI は変更が衝突しない限り,動作について 確認を求めなくなります.
backup xxx -backup pathspec を含む場合,Unison は pathspec にマッチする path についてバックアップを作成します.より詳しく説明すると, pathspec にマッチする path それぞれについて,更新される際に古い複 数のバージョンをバックアップとして残します.バックアップされたファ イルは UNISONBACKUPDIR (デフォルトでは .unison/backup/) で指定さ れたディレクトリに保存されます.最新のバックアップは元のファイル と同名で保存され,古いバージョンのファイルは .n.unibck という拡張 子をつけて保存されます.どれだけのバージョンをバックアップするか は,maxbackups オプションで設定します.
backups true にセットされた場合,更新の際に古いバージョンをバックアップと して残すようになります.バックアップファイルは元のファイルと同じ ディレクトリに,拡張子 .bak を付けた形で保存されます.ほとんどの ユーザにとって backup フラグよりも有用性は低いでしょう.
batch true にセットされた場合,UI はユーザに対して問い合わせを全く行な わなくなります.更新は衝突しない限り自動的に行なわれ,衝突する更 新はスキップします.
contactquietly フラグが立てられると,起動時に Contacting server というウィンドウ (邪魔に感じるユーザもいるでしょう) を表示しなくなります.
debug xxx 標準エラー出力に内部の動作内容を出力するようになります.モジュー ルの名前と共にデバッグ情報が出力されます.ソースアーカイブの Util.debug の中の関数を (grep 等を用いて調べて) 引数として指定す ることで,出力される内容をカスタマイズ出来ます.-debug all を指定 することで,各モジュールが出力する**全ての**デバッグ情報を出力さ せることができます.(Unison がうまく動かず,内部で何が起こってい るのか知りたいときには,これを最初にやってみるべきです.) -debug verbose はいくつかのモジュールからより詳細な情報を得ることができ ます (ネットワーク越しにどんなバイト列が送信されているかまで見る ことができます).
diff xxx ファイルの相違点を調べるシステムコマンドの名前と引数を指定するこ とができます.デフォルトでは diff です.指定したプログラムには2つ のファイル名を指定して実行されます.
doc xxx -doc secname というコマンドラインオプションをつけると,Unison は マニュアルから secname という名前のセクションを探し出して標準出力 に表示し,そのまま終了します.HTML のマニュアルと同じ内容を含んだ マニュアル全体を出力するには -doc all を指定します.-doc topics を指定すると,指定可能なセクション名を含んだリストが出力されます.
dumbtty true にセットすると,テキストモードの UI はターミナルのセッティン グを変えようとしなくなります (通常 Unison はターミナルを raw mode で使用します.このモードだと,現在表示している行を書き換える といったようなことができます).これは例えば Emacs の中で起動した シェルで Unison を使うような場合に便利です.dumbtty がセットされ ると,CUI でコマンドを打ち込んだ後,エンターキーを押す必要があり ます (通常はユーザがコマンドのキーを打った瞬間に Unison はコマン ドを理解します).GUI で起動された場合には,このオプションは影響を 与えません.
editor xxx マージするためのプログラムが0以外を返した時,その出力を表示するプ ログラムを指定します.ユーザがそのファイルを好きなように編集し保 存すると, Unison はそのバージョンを同期させます.デフォルトでは emacs です.
fastcheck xxx true にセットすると,Unison はファイルの変更をチェックする際,全 てのファイルの内容をチェックする代わりにファイルの作成日時を**似 非 inode 番号**として使います.Windows では,作成日時・変更日時・ ファイルサイズが更新で変更されなかった場合,更新に失敗する可能性 があります (そうそう起こることではありませんが,起こる可能性はあ ります).しかし Unison は常に更新を行なう前に安全に変更のチェック を行なっていますので,そのような変更を他のレプリカから**上書き** してしまうことはありません.ですので,Windows ではこのオプション を使うに値するでしょう.但しそういった変更が見逃されている心配が あるのであれば,時々 fattcheck を false にして実行しましょう.デ フォルトでは auto です.これは Unix 上のレプリカに対しては高速な チェックを (Windows 上と違い,この場合は安全です),Windows 上のレ プリカに対しては遅いチェックを行ないます.後方互換性の維持のため, yes,no,default を true,false,auto の代わりに使うことができま す.
follow xxx -follow pathspec を設定することで,pathspec にマッチするシンボリッ クリンクを**透過的に**扱い,リンクがある位置にリンクの指し示すオ ブジェクトがあるかのように振る舞います.
force xxx -force root を指定すると,全ての変更を (衝突しない変更に関しても) root を基準として解釈します.これにより,Unison をミラーリングツー ルのように動作させることができます.また -force newer (もしくは -force older) を指定することで新しい (もしくは古い) 更新日時のファ イルを選択させることができます.この場合 -time も同時に指定する必 要があります.このオプションは自分が何をしているか **わかっている**場合に使用すべきです.
group true にセットすると,ファイルのグループ設定も同期されます.グルー プの名前や ID は numericids オプションに依存します.
height n GUI でメインウィンドウの高さを (行単位で) 指定できます.
ignore xxx -ignore pathspec と指定すると,Unison は pathspec にマッチする path を (再帰的に) 無視します.一時ファイルやオブジェクトファイ ル等を同期させたくない時に便利です.
ignorecase true にセットすると,Windows のファイル命名規則を使うようになりま す.つまり2つのレプリカの間で (大文字・小文字の) 綴りの異なるファ イルを無視するようになります.このフラグは Windows システムを一つ でも含む際には自動的にセットされます.稀にですが,手動でセットす ることも時には有効です (例えば FAT パーティションをマウントした Unix システムで Unison を実行するときなど).
ignorenot xxx ignore オプションを上書きします.絶対に無視すべき**でない** path を,ignore と同じ書式のパターンで渡します.ignore に指定したパター ンと重複していてもいなくても構いません.ignore と ignorenot のセ マンティックは直感的に少し解り辛いものがあります.変更をチェック する際,Unison はレプリカの root の浅いところから順に深いところを チェックします.それぞれの path をチェックする前に,その path が ignore にマッチして ignorenot にマッチしないかを確認します.そう であればその path の**全ての子も**スキップします.つまり親が ignore のパターンにマッチした場合,その path が ignorenot にマッ チしていたとしてもスキップされるわけです.特に ignore = Path * と プロファイルに書いて,それから ignorenot で同期させたいパターンを 指定してもうまく動きません.代わりに同期させる特定の path を指定 するには path オプションを使用すべきです.
key xxx プロファイルの中で,GUI で素早くプロファイルを切り替えるために (0から9の) 数値を指定します.
killserver true にセットすると,Unison はファイルの更新が終了した際にリモー トのサーバプロセスを終了させます.この動作は ssh 接続の場合にはデ フォルトですので,ssh 接続の際にはこのオプションを設定する必要は ありません.これはソケットモードで起動しているサーバを,一回の更 新の後に終了させるために存在します (ずっとサーバを起動しっぱなし ではなく,一回の更新ごとにサーバを起動するのを好むユーザもいます).
label xxx プロファイルの中で,そのプロファイルを説明する文章を指定します (特に GUI で,複数のプロファイルを切り替えるユーザに有用です).
log フラグが立てられると,Unison はファイルシステムの全ての変更をログ に記録します.
logfile xxx デフォルトではホームディレクトリの unison.log というファイルにロ グが追記されていきます.別のファイルを指定したい場合に設定します.
maxbackups n backup での指定にマッチする path それぞれについて,いくつのバージョ ンまでバックアップをとるかを指定します.デフォルトでは2です.
merge xxx 最後のバックアップと両方のレプリカから新しいバージョンのファイル を作成するためのプログラムを指定します.新しいバージョンのファイ ルが同期されます.
merge2 xxx merge に同じ.
numericids true にセットされると,グループやユーザは名前ではなく番号で同期さ れます.このオプションがセットされていない場合でも,特別な uid 0 や gid 0 はマップされません.
owner true にセットされると,ファイルのオーナー情報も同期されます.オー ナー名やオーナー ID は numericids に依存します.
path xxx 設定されない場合,Unison は与えられた root から単純に全てのレプリ カを同期させます.一つ以上の path が設定された場合,Unison はこの path と子のみを同期させます (例えば一つのディレクトリを素早く同期 させたい場合などに有用です).path の設定はリテラルに解釈されます. 正規表現ではありません.
perms n どのパーミッションのビットが同期されるべきかを整数で指定します. デフォルトでは 1777 が設定されています.set-uid ビットや set-gid ビットの同期はセキュリティ的に問題があるためです.全てのビットを 同期させたい場合は,-1をセットしてください.
prefer xxx force に同じ.
root xxx レプリカの root を指定します.二つ設定が必要なため,普通はプロファ イルに二つ指定するか,プロファイルでは指定せずにコマンドラインで 指定することになります.二つの root の指定の順序は関係ありません. Unison は動作を起こす前にそれらをソートします.また同時にホスト名 と path を正確な表記に書き替えます.それにより,後で異なる名前で root を指定されても,的確にアーカイブファイルを選択することができ るのです.
rootalias xxx 与えられた root に対してアーカイブファイルのファイル名を計算する 際に,左側に書かれた root を右側の表記に置き換えます.
rshargs xxx リモートホストへの接続に使用される rsh や ssh に対して,指定され た文字列を (ホスト名とリモートホスト上の Unison の実行可能ファイ ル名以外を) 引数として渡します (このオプションは rsh と ssh の両 方に引数を渡すことができます.それがこのオプションが sshargs では なく rshargs である理由です).
rshcmd xxx 必要であれば,rsh の実行可能ファイル名を (例えばフルパスで) 指定 できます.
servercmd xxx 必要であれば,リモートホスト上の Unison の実行可能ファイル名を (例えばフルパスで) 指定できます.
silent true にセットされると,CUI はエラー以外の出力をしなくなります. batch オプションが有効な時には,自動的に silent もセットされます.
sortbysize フラグが立てられると,UI は名前ではなくファイルサイズを基準に (小 さいものから) ソートしてリスティングします.例えば回線が遅いため に,小さいファイルの転送を大きなファイルで邪魔したくない場合など に便利です.このオプション (同様に,パターンを引数として取らない 他のソートオプション) は,GUI の Sort メニューから一時的に選択す ることもできます.
sortfirst xxx pathspec を指定します.これにマッチするファイルは優先的にリスティ ングされます.
sortlast xxx sortfirst と似ていますが,マッチするファイルはリストの後ろに持っ ていかれます.
sortnewfirst フラグが立てられると,新たに作成されたファイルを優先的にリスティ ングします.例えば新しいファイルが**ゴミ**ではないか,つまり同期 させずに無視したり,削除したりすべきものでないか確認するのに便利 です.
sshcmd xxx 必要であれば,ssh の実行可能ファイル名を (例えばフルパスで) 指定 できます.
sshversion xxx サーバとの接続に用いる ssh のプロトコルを指定します.1もしくは2を 指定することで,ssh1 もしくは ssh2 を用いてサーバへ接続を試みます. デフォルトは空です.Unison は ssh としてインストールされているコ マンドを用います.
statusdepth n 指定された数より深いローカルのディレクトリについて,変更を調べる 際の出力を抑制します.(ローカルの状況をあまりたくさん表示すると, 変更の検知をいくらか遅くします.)
terse trueにセットされると,UI はステータスを表示しなくなります.
testserver リモートサーバに接続を試み,成功すればメッセージを表示してすぐに 終了します.インストール時のトラブルシューティングに有効です.プ ロファイルに書くべきではありません.
times ファイルの更新日時 (ディレクトリは対象外です) も同期させます.
ui xxx GUI か CUI を選ぶために,graphic もしくは text を指定します.CUI のみに対応したバイナリでは,このオプションは影響を与えません.
version バージョン番号を出力して終了します.コマンドラインでのみ意味を持 ちます.
xferbycopying 対象のレプリカに同じ内容のファイルがあるかを検知して,ファイルが あった場合,その内容をネットワークに流さないよう試みます.移動さ れたファイルの更新が素早く済むようになります.デフォルトでは true です.
プロファイル

プロファイルとは root や path,ignore 等の設定を記述したテキストファ イルです.これを用意することで,実行する際にいちいちコマンドラインでオ プションを打つ必要がなくなります.プロファイルはクライアントマシンの .unison ディレクトリに置いておく必要があります.Unison が name という一 つの引数だけで実行された場合,.unison ディレクトリの name.prf というファ イルをプロファイルを読み込みます.引数無しで実行された場合, (GUI で は) .unison ディレクトリの .prf というファイルを全て探し出し,選択可能 なメニューを表示します.default.prf というファイルがある場合には,その 設定がデフォルトで選択されます.

p というオプションを設定する場合,boolean 値を取るオプションはプロファ イルに

p = true

のように記述します.他のタイプの値を取るオプションは

p = <value>

というように記述します.

p と xxx の周りの空白は無視されます.空行を含んでいても構いません. また # で始まる行も空行と共に無視されます.

Unison を実行すると,まずプロファイルを読んでからコマンドラインオプショ ンを読みますので,プロファイルでの設定をコマンドラインオプションで上書 きすることができます.

プロファイルには include name という行を含めることができます.これによ り name というファイル (もしくは .unison ディレクトリに name というファ イルがなければ name.prf というファイル) の内容が include 行の位置に記述 されていると見なされます.include 行により,複数のプロファイルに共通の 設定を一つのファイルにまとめておくことができます.

プロファイルには label = desc という行を含めることができます.desc には そのプロファイルの説明を書いておきます.GUI で実行する際,プロファイル 選択ダイアログでプロファイルと共に desc の内容が表示され,実行中のメイ ンウィンドウの右上にも同様に desc の内容が表示されます.

GUI ではまた,よく使うプロファイルにショートカットを登録しておくことも できます.プロファイルに key = n (n は一桁の整数) という行が含まれる場 合,その数字のキーを叩くことで即座にプロファイルを切り替え,同期を開始 することができます.この場合,現在表示され選択されている内容は破棄され ます.

プロファイルのサンプル
最小限のプロファイル

最小限のプロファイルのサンプルです.

root = /home/bcpierce
root = ssh://saul//home/bcpierce

path = current
path = common
path = .netscape/bookmarks.html
基本的なプロファイル

有用なオプションを含んだ,もう少し洗練されたサンプルです.

root = /home/bcpierce
root = ssh://saul//home/bcpierce

path = current
path = common
path = .netscape/bookmarks.html

ignore = Name temp.*
ignore = Name *~
ignore = Name .*~
ignore = Path */pilot/backup/Archive_*
ignore = Name *.o
ignore = Name *.tmp

height = 37

backup = Name *

diff = diff -y -W 79 --suppress-common-lines

log = true
パワーユーザ向けプロファイル

Unison が巨大なレプリカに対して実行される時,しばしばレプリカの一部分の みを同期の対象として指定する方が (他の箇所の変更を調べる時間を節約でき る分) 便利です.これはプロファイルをいくつかのパートに分けることで実現 できます.具体的には,基本的な設定を含んだパートと,同期させたいそれぞ れの path についてのトップレベルのパートです (include 機能も同様に異な る root に対して共通の設定を提供する目的で利用できます).

この構想を実現するプロファイルは以下のようになります.default.prf とい うファイルには include 行のみを含めます.

include common

共通のファイルの名前は common.prf ではなく common にしてください.これ により,Unison が GUI でプロファイルの選択肢に common を含むことを防ぎ ます.

common には実際の設定を書きます.

addprefsto = common

ignore = Name temp.*
ignore = Name *~
ignore = Name .*~
ignore = Path */pilot/backup/Archive_*
ignore = Name *.o
ignore = Name *.tmp

common には path の設定を書きません.つまり,デフォルトのプロファイルで Unison を実行した場合 (つまり unison default もしくは単に unison のみで 実行した場合) ,レプリカ全体が同期されるということです (レプリカ全体を 絶対に同期させたくない場合には,default.prf に同期させる path を設定す べきです).

レプリカの一部の path のみを同期させるために,(例えば unison papers の ように) 別のプロファイルを指定して実行します.papers.prf には以下のよう に記述します.

path = current/papers
path = older/papers
include common

これにより,Unison は current/papers と older/papers のみを同期するよう になります.

GUI で異なる path の設定に素早く切り替えるために,key オプションが指定 できます.例えば,mail.prf には以下のように記述します.

path = Mail
batch = true
key = 2
include common

これにより,2 を叩くだけで Mail というサブディレクトリのみを見るように なり, (batch フラグが立っているために) すぐに更新が実行されます.

バックアップをとる

更新を行なう際に,古いバージョンのファイルのバックアップを取ることがで きます.この機能により,一般的なバックアップを行なうと同時に,外部のマー ジするためのプログラムを実行する際に一般的なバージョンを提供するこ ともできます.

バックアップされたファイルは双方のホストの ~/.unison/backup ディレクト リに保存されます.このディレクトリは UNISONBACKUPDIR という環境変数に値 を設定することで変更することもできます.Unison がアーカイブを更新する際 にファイルはバックアップディレクトリへと保存されます.つまり

  • Unison がアーカイブをスクラッチから再構築する際 (例えばアップグレード や,アーカイブファイルが手動で削除された時等) に,全てのファイルがバッ クアップされます.
  • もしくは,Unison があるファイルについて更新作業を行なった際,そのファ イルはバックアップされます.

バックアップファイルを手動で削除 (もしくはバックアップディレクトリごと 削除) しても安全です.Unison はこれらのファイルを重要なことに使う前に, 期待するファイルとフィンガープリントが一致することを確認します.

backup オプションはどのファイルが実際にバックアップされるかを設定します. 例えば,backup = Path * という指定をすると,全てのファイルがバックアッ プされます.backupversions オプションは,いくつのバージョンまでがバック アップされるかを設定します.デフォルトでは 2 です (つまり最後に同期され たバージョンともう一つ古いバージョンがバックアップされます).後方互換性 のため backups オプションはいまだサポートされていますが,現在では backup を使うようにしてください.

更新をマージする

CUI・GUI の両方の UI は,インタラクティブに衝突をマージする merge コマ ンドを提供します.これは衝突しているファイルを選択して m を叩くことで実 行できます.

実際のマージ作業は,外部プログラムにより行なわれます.merge オプション と merge2 オプションが,どのように外部プログラムが起動されるかを指定し ています.このファイルのバックアップファイルが存在する場合,merge オプ ションが使用されます.そうでなければ merge2 オプションが使用されます. いずれの場合も,オプションには外部プログラムを実行するためにシェルに渡 されるコマンド名を指定します.この文字列には CURRENT1,CURRENT2,NEW, そして OLD という特別な文字列を含めます.Unison はこれらの文字列を,コ マンドの実行前に以下のように置き換えます.

  • CURRENT1 はファイルのローカルコピーの名前に置き換えられます.
  • CURRENT2 は前もってリモートからコピーされたファイルの内容を含む一時ファ イルの名前に置き換えられます.
  • NEW はマージ作業後に保存されるべきファイル名と置き換えられます.
  • OLD はそのファイルの元のバージョンのバックアップ (例えば最後の更新が 成功した際の状態) があれば,そのファイル名と置き換えられます.OLD の 置き換えは merge のみによってなされます.merge2 では行なわれません.

例えば,Unix システムで merge オプションを

merge = diff3 -m CURRENT1 OLD CURRENT2 > NEW

のように指定すると,Unison はマージに diff3 というコマンドを使います. 外部のマージプログラムを複数指定することもできます.例えば,Emacs ユー ザは以下のような設定が気に入るでしょう.

merge2 = emacs -q --eval '(ediff-merge-files "CURRENT1" "CURRENT2" nil "NEW")'
merge = emacs -q --eval '(ediff-merge-files-with-ancestor "CURRENT1" "CURRENT2" "OLD" nil "NEW")'

外部プログラムが NEW に対応するファイルを保存せずに終了した場合, Unison はマージが失敗したと判断します.マージプログラムが NEW というファ イルを保存したが,終了コードが0以外の値を返した場合,マージは成功したが, 同時に衝突も発生したと判断します.この場合,外部のエディタを起動してユー ザが衝突を解決できるようにします.editor オプションは Unison によって起 動されるエディタを指定します.デフォルトでは Emacs です.

merge2 や merge の便利な設定を是非教えてください.マニュアルにもう少 し例を載せたいのです.

ユーザインタフェース

CUI も GUI も,それ自身が一目瞭然に作られています.少しだけトリックを紹 介しておきます.

  • デフォルトでは,Unison を Unix 上で実行するとターミナルを raw mode に変更しようとします.これにより,キーを叩いた瞬間に (エンター を押さなくても) Unison はコマンドを解釈できるのです (つまり Unison に 左から右に更新するという指示を出す際に,> Enter ではなく > を叩くだけ で済むということです).しかしこの機能うまく働かないこともあります.例 えば Emacs の中でシェルを立ち上げて Unison を使うような場合です. dumbtty オプションを設定すると Unison はターミナルの状態を変更せず, 入力を一行ごとに解釈するようになります.
終了コード

テキストモードで実行する際,Unison は終了コードを返します.終了コードは 同期が成功したかしなかったか,もしくはどこまで成功したのかを示します. スクリプトから Unison を利用する際に便利です.Unison が返し得る終了コー ドは4種類あります.

  • 0: 同期成功.全てのファイルは最新である.
  • 1: いくつかのファイルをスキップしたが,全ての転送は成功した.
  • 2: 転送の最中に致命的でないエラーが発生した.
  • 3: 致命的なエラーが発生し,実行が停止した.

GUI では有用な終了コードを返しません.

path の仕様

いくつかの Unison のオプション (ignore/ignorenot,follow, sortfirst/sortlast,backup) にはある一つ path や path のセットを指定す る必要があります.これらのオプションは正規表現をベースとしたシンタック スを共有しています.それぞれのオプションの path パターンのリストと関係 しています.特定の path は path パターンの一つにマッチします.

  • パターンオプションはコマンドラインやプロファイルの中で,他のオプショ ンと同様の書式で指定できます.例えばプロファイルに ignore = pattern と記述すると,無視されるべき path のリストに pattern を加えることがで きます.
  • pattern はそれぞれ三つのうち一つの形式で記述することができます.最も 一般的なのは,POSIX の拡張正規表現の形式である Regex (Regex regexp) です (照合順序や文字クラス等の POSIX の全ての正規表現は今のところサポー トされていません).利便性のため,もう2つの形式も理解できます.Name name は最後の要素が name である path にマッチします.Path path は正確 に path にマッチする path を指します.後者の name と path という引数 は正規表現ではありません.代わりに,標準的なグロビングが使用でき ます.
    • ? は / 以外の任意の1文字にマッチします.
      • は / 以外の任意の文字列にマッチします.
    • [xyz] は {x,y,z} のいずれかの文字にマッチします.
    • {a,bb,ccc} は a か bb,もしくは ccc にマッチします.
  • path の区切り文字は常に / です.クライアントやサーバが Windows (デフォ ルトの区切りが ) で動作していても同様です.これにより Windows でも Unix でも同じ path のパターンが利用可能なのです.
path を無視する

Unison のユーザは,一時ファイルや巨大なファイル,古いファイル,アーキテ クチャに依存したバイナリファイル等,同期させたくないファイルがレプリカ に多く含まれていることに気付くでしょう.これらのファイルを同期させない よう,ignore オプションで無視すべき path を指定することが出来ます.

例えば,以下のように指定することで CVS や .cmo というファイルを同期させ ないよう設定することができます.

ignore = Name {CVS,*.cmo}

次のパターンは a/b という path を無視させることができます.

ignore = Path a/b

このパターンは a/b で始まり .ml で終わる path を無視させることができま す.

ignore = Regex a/b/.*\.ml

正規表現による path の指定は固定されることに注意してください.つま り path の一部だけではなく,path の全体がマッチする必要があります.

ignore オプションには他にもいくつかのポイントがあります.

  • あるディレクトリが無視されると,そのサブディレクトリも無視されます.
  • ignore パターンを追加するのに便利なコマンドをUIは提供します.特定のファ イルを無視したい場合は,そのファイルを選択して i を叩いてください.同 じ拡張子の全てのファイルを無視したい場合は E を叩いてください.ディレ クトリに関係なく同じ名前の全てのファイルを無視したい場合は N を叩いて ください.新しいパターンはすぐにディスク上の現在のプロファイルに追加 されます.
  • プロファイルで include 設定を使っている場合は,addprefsto 設定も使う べきでしょう.この設定を行なうと,UI から新たに追加した ignore 設定を, トップレベルの設定ではなく,どのファイルに追記すべきかを指定できます.
  • あまり便利とは言えませんが,ignore パターンはコマンドラインでも指定で きます.-ignore "Name temp.txt" 等のように指定してください.
シンボリックリンク

通常 Unison は Unix のレプリカの中のシンボリックリンクを非透過的に 扱います.つまりシンボリックリンクを,そのリンクが指し示す先を表わす文 字列として扱い,その文字列を他のレプリカに更新します.

シンボリックリンクを,リンクがある場所に実際にファイルがあるかのように, つまり透過的に扱うことはしばしば有用です.Unison にシンボリックリン クをこのように扱うように指示するには,プロファイルに

follow = pathspec

というように追記します.pathspec は path パターンを表わします.

Windows のファイルシステムはシンボリックリンクをサポートしていません. Unison は Unix 上のシンボリックリンクを Windows 上に非透過的に転送する ことができません.その path はエラーがあるとしてフラグが立てられます. Unix 上のレプリカが Windows 上のレプリカと同期される場合,全てのシンボ リックリンクは ignore パターンか follow パターンのいずれかにマッチする 必要があります.

パーミッション

二つの異なるファイルシステムの間 (例えば Windows のクライアントと Unix のサーバの間) でパーミッションのビットを同期させるのは些かトリッキーで す.以下に,その仕組みがどのようにして動作しているかを示します.

  • 存在するファイルやディレクトリのパーミッションが変更された場合,パー ミッションが両方のシステムに理解される場合には,パーミッションも 同期されます.そうでなければパーミッションはそのまま保存されます.
  • 新規に作成されたファイルがリモートのレプリカに転送される際,両方のシ ステムに理解されるパーミッションはそのまま同期されます.それ以外のパー ミッションのビットはデフォルトの値にセットされます (Unix システムでは 現在の umask の値が用いられます).
  • セキュリティの観点から,Unix の setuid と setgid ビットは同期されませ ん.
  • Unix のオーナーとグループの ID は同期されません (これは一般に何を意味 しますか?).全てのファイルはサーバプロセスのオーナーとグループによっ て作成されます.
クロスプラットホームでの同期

Windows と Unix の間で Unison でファイルを同期させる場合,知っているべ き問題がいくつかあります.

大文字・小文字の問題: Unix ではファイル名の大文字と小文字は区別され ます.foo と FOO は異なるファイルを指します.一方 Windows では大文字と 小文字の違いは無視されます.foo と FOO は同じファイルを指します.つまり これは Unix 上の foo と FOO というファイルは,Windows に転送できないと いうことを意味します.Windows は同じ名前で異なるファイルの存在を許 さないからです.Unison はこの問題を探知し,ファイルを同期できない旨を報 告します.

ファイル名の大文字・小文字の問題を解決する方法はあります.Windows に両 方のファイルを転送する必要がある場合,唯一の方法は Unix 上で一つのファ イル名を変更し,再度同期させることです.Windows にファイルを転送する必 要がない場合は,単純に Unison の警告を無視し,同期させる作業を続けてく ださい.Unison はそれらのファイルには触れません.同期させる度に警告を表 示させるのが嫌ならば,ignore オプションを設定して無視させてください.

無効なファイル名: Unix では有効なファイル名が Windows では無効なこ とがあります.例えばコロン (:) は Windows ではファイル名として使えませ んが, Unix では使うことができます.これは Unix 上の foo:bar というファ イルが Windows に転送できないことを意味します.大文字・小文字の場合と同 様,Unison はその状況を探知し,報告します.回避するのも同様に,Unix で ファイル名を変えて再度同期させるか,単純に無視しましょう.

狭い帯域幅

Unison は比較的遅いダイアルアップや DSL の回線でも十分に動作するように 作られています.

Unison は Andrew Tridgell と Paul Mackerras によってデザインされた,小 さな変更を加えられた巨大なファイルの転送を最適化する *rsync プロトコル *を利用しています.rsync プロトコルについては rsync の Web サイトを参照してください.

Unison を ssh 越しに利用している場合,ssh の圧縮機能を利用して転送速度 を多少向上させることができます.これにはコマンドラインで -rshargs -C と 指定するか,プロファイルに rshargs = -C と追加します.

高速な変更検知

レプリカが巨大で且つどちらかが (もしくは両方が) Windows システムである 場合,Unison のデフォルトの変更検知プロセスが遅すぎると感じるかもしれま せん.Unison には fastcheck オプションがあります.yes にセットすると, Unison はファイルの変更をチェックする際,全てのファイルの内容をチェック する代わりにファイルの作成日時を似非 inode 番号として使うことで,変 更をより速く検知することができます.

この方法を使うと,Windows では,作成日時・変更日時・ファイルサイズが更 新で変更されなかった場合,更新に失敗する可能性があります.しかし Unison は常に更新を行なう前に安全に変更のチェックを行なっていますので, そのような変更を他のレプリカから上書きしてしまうことはありません. ですので,Windows ではこのオプションを使うに値するでしょう.但しそういっ た変更が見逃されている心配があるのであれば,時々 fattcheck を false に して実行しましょう.

クリックで起動

Windows NT や 2000 のシステムでは,GUI バージョンの Unison を直接クリッ クすることで起動することも可能です.Windows 95 や 98 では,ssh を使わ ない限りはクリックして起動することもできます.OCaml と Windows 95/98 との相性問題は解決できていないので,ssh を使いたい場合は DOS プロンプト から起動する必要があります.

Unison のアイコンをクリックすると,2つのウィンドウが表示されます. Unison の通常のウィンドウと,ssh のパスワードを入力するためだけのコンソー ルウィンドウです (ssh を使わないのであれば無視して構いません).パスワー ドの入力が促されたら,入力する前にコンソールウィンドウに (クリックする などして) フォーカスを当てる必要があります.DOS プロンプトから Unison を起動した場合は,パスワードは DOS プロンプトに入力してください.

このモードで Unison を利用するには,前もってプロファイルを作っておく必 要があります.好きなエディタを使って作成してください.

仕様

Unison はシンプルな仕様に基づいています.

root

レプリカの root とは,ローカルマシン及びリモートマシンにおいて,同 期を取るべきファイル群の場所を表わします.例えば

relative/path/of/root

はローカルマシンにおける root を,Unison が実行されたディレクトリからの 相対パスとして表わし,

/absolute/path/of/root

はどこで Unison が実行されたかは関係無く,ローカルマシンのファイルシス テムにおける絶対パスで root を示しています.リモートホストの root は, 接続に用いるプロトコルによって ssh://,もしくは rsh:// を先頭に付け加え ます.

ssh://remotehost//absolute/path/of/root
rsh://user@remotehost/relative/path/of/root

リモートホストで Unison サーバが動いているのであれば,

socket://remotehost:portnum//absolute/path/of/root
socket://remotehost:portnum/relative/path/of/root

このように書くことで,クライアントの Unison が接続すべきリモートホスト とポート番号を明示します.

root の書式は URI (RFC 2396) の書式に基づきます.

path にプロトコルを示すプレフィクスが付いていない場合,プロトコルは file: であると見なされます.Windows の場合,ファイル共有機能と file: プ ロトコルを用いてファイルの同期を取ることが出来ます.

unison foo //host/drive/bar

というように実行すると,ローカルの foo というディレクトリと,host とい うマシンの drive:\bar の同期を取ります (但しこの方法は,ホスト間が十分 に速い回線で接続されている場合に限った方が良いでしょう.更新を検知する ために,リモートマシンのレプリカがローカルマシンに転送される必要がある からです).

root の名前は実行時に Unison によって内部的に変換されます.各 root に対 応するアーカイブファイル名を特定するためです.つまり //saul//home/bcpierce/common と //saul.cis.upenn.edu/common は名前の違 う同一のレプリカであると認識されます.

path

path とは同期を取るファイル群の中の一つを指します.レプリカの root からの相対パスで表わされます.

path は単なる / で区切られた名前の羅列です.Unison が動作する環境に関係 無く,path の区切りは常に / (スラッシュ) であることに注意してください. ローカルのファイルシステムにおいて必要がある場合は,/ は \ (バックスラッ シュ) に自動的に変換されます (例えば Windows マシンの c:\pierce と Unix サーバの ssh://saul.cis.upenn.edu/home/bcpierce の同期を取る場合, current/todo.txt という path はクライアントでは c:\pierce\current\todo.txt となり,サーバでは /home/bcpierce/current/todo.txt となります).

path が空の場合,レプリカ全体を表わします.Unison は空の path を [root] と表示します.

変更

あるレプリカのpath,p の指し示す内容は,ファイルかディレクトリ,シ ンボリックリンク,もしくは (p がレプリカの中の何も指し示していない時は) 空っぽであるかもしれません.より詳しく見てみましょう.

  • p が普通のファイルを指す場合,p はこのファイルの実際の内容 (つまりバ イト列) と,パーミッションを表わすビット列です.
  • p がシンボリックリンクを指す場合,p はシンボリックリンクが指し示して いる先の内容です.
  • p がディレクトリを指す場合,p は単なる "DIRECTORY" というトークンと, パーミッションを表わすビット列です.
  • p がレプリカの中の何も指していない場合,p は "ABSENT" というトークン になります.

Unison は同期が成功した後,それぞれの path の内容を記憶します (つまり2 つのレプリカの内容が同じであったときの最後の状態を記憶しているわけです).

あるレプリカにおいて,path の中身が最後に同期させた時から見て変更されて いる場合,その path は変更されたと判断します.

衝突

以下のような場合,その path は衝突しているとされます.

  1. どちらかのレプリカで変更された.
  2. その path かその子がもう一方のレプリカで変更された.そして
  3. 2つのレプリカの同一の path の内容が異なる.
衝突の解決

Unison はいくつかの異なった段階を踏みます.

  1. それぞれのホストにおいて,どの path が変更されたか判断するために,現 在のレプリカの内容とアーカイブファイルの内容を比較します.
  2. 両方のレプリカで変更されていて,なおかつ内容が異なる path (false conflicts) を調べます.これらの path は両方のレプリカにおいて,同期 されたと内部的にマークされます.
  3. 更新された path をユーザに提示します.衝突しない更新に関しては,更新 されたレプリカ同様にもう一方を更新するという,デフォルトの動作を提案 します.衝突する更新は単に表示されます.ユーザはレプリカ全体の更新状 況を見極め,衝突しない更新の動作を変え,衝突する更新に対する動作を決 めることができます.
  4. 選択された動作を一つずつ実行します.転送されたファイルはまず受け取り 側のホストに一時ファイルとして作成され,次にそのファイルをあるべき場 所に移動します.
  5. アーカイブファイルに現在のレプリカの内容を反映します.
原則

その実行内容の重要性と繊細さから,シンクロナイザが通常の状態でどのよう な動作をしているのかだけでなく,システムのクラッシュや通信が切断した場 合等の異常事態にどのように動作するのかを知ることもまた重要です.

Unison は実行中,常に内部の状態やレプリカの状態を保護するよう設計されて います.特に,以下のような特徴を備えています.

  • 双方のレプリカの全ての path は,1)その元の状態 (つまり変更されて いない状態) か,2)その正常に更新された状態 (つまりユーザが意図し た内容に更新された状態) のいずれかを常に保持しています.
  • ディスク上に保存された Unison 内部の情報は常に,1)変更されていない状 態か,2)同期に成功した path の情報を反映した状態のいずれかです.

つまり結論として,人為的にであろうと事故であろうと,いつ Unison の実行 を停止しても安全だということが言えます.

更新を実行している最中に停止された場合,ある path の更新は完了している のにアーカイブファイルにその更新が反映されていないということが起こり得 ます.しかし問題はありません.次に Unison が実行された際に,Unison はこ れらの path が変更されていながらも内容は同じであると判断し,同期は成功 したと記憶してその path に関する処理を終了するからです.

Unison が停止された場合,レプリカの中に (.tmp という拡張子の付いた) 一 時ファイルが残っていることがあります.それらのファイルは消してしまって 構いません.同様に (deprecated な) backup フラグが設定されている場合, Unison は file.0.unison.bak というような古いバージョンのファイルを残し ます.これらのファイルも,Unison の動作には影響ありませんから,消してし まって結構です.

Unison は,動作しているマシンの間のクロック・スキュー (クロックのばらつ き) には影響されません.Unison は単に一つのホスト上で手に入れたタイムス タンプの比較を行ない,それを行なう上で必要な前提は,それぞれのシステム のクロックが常に前に進むということだけだからです.

アーカイブファイルが削除されている (もしくはファイルのフォーマットが変 更されていて読み込めない,もしくはある root に対して初めて実行したため まだファイルが作られていない) 場合,Unison は非常に保守的な動作をします. つまり双方のレプリカが最後の更新時に完全に空であったかのように動作しま す.その結果,初めての実行時には一方のレプリカに存在するファイルは他方 に転送され,両方のレプリカに存在しながら内容が異なるファイルは衝突して いるとマークされます.

あるファイルに対して変更を加えずに更新時刻だけを変更する (touch する) 操作は,Unison の動作に影響を与えません.Unix では,Unison はどのファイ ルが絶対に更新されていないかを知るために,まずファイルの更新時刻を 調べます.そして更新された可能性のあるファイルに対してフィンガープリン トを計算し,最後の更新時の状態と比較します.

アーカイブファイルを両方のレプリカから削除して,Unison を洗脳し ても構いません.次に実行した時,Unison はレプリカの全てのファイルが新し く作られたものだと仮定します.

Unison の実行の最中にファイルに変更を加えても安全です.古い状態で更新し てしまった時,もしくは更新している最中にターゲットのレプリカのファイル が変更された時は,Unison はそのファイルの更新に失敗した旨を表示します. 最新の更新を行なうにはもう一度 Unison を実行してください.

UIからの (例えば i キー等による) 無視 (ignore) パターンの変更は,すぐに 現在のプロファイルに反映されます.

警告と短所

Unison を利用する際に注意すべきことがあります.バグの完全なリストは,ソー スアーカイブの中の BUGS.txt にあります.

  • 高速化のため, (実行する OS のアーキテクチャにもよりますが) 変更検知 アルゴリズムは実際には近似的な方法を用いることがあります.
    • 特に Unix における実装では,ファイルの実際の内容と前回の記録とを 比べるのではなく,ファイルの inode 番号と更新時刻のみをチェックし ています.どちらも変更されていなければ,そのファイルは変更されて いないという結論に達します.
    • 一般的な状況では,この方法は変更を見誤ることがあっても,本当の更 新を見逃さないという点で安全です.しかし,retouch 等を使ってファ イルの更新時刻を巻き戻し,Unison を騙すことは可能です.
  • 自分専用のファイルシステムと共有のサーバの間でファイルを同期させる場 合,パーミッションに気をつける必要があります.Unison はデフォルトでは パーミッションもそのまま同期させるので,グループに書き込み権限を残し たまま同期させてしまうと,他のユーザに上書きされてしまう可能性があり ます.
    • 両方のマシンで umask を 022 などに設定してこの問題を回避すること ができます.
  • GUI は今のところシングルスレッドで動いています.これは Unison が時間 の掛かる処理を行なっている時,その処理が終了するまで画面が書き換わら ないということを意味します.Unison が何らかの動作している間,GUI 画面 に触らないようにすることをお薦めします.
  • Unison は今のところハードリンクを理解しません.

アドバイス

FAQ
Unison と rsync の違いは何ですか?

端的に言ってしまえば,rsync はミラーリングツールで,Unison はシンクロナ イザです.つまり rsync には「このレプリカが最新バージョンですから,もう 一方をこれで上書きしてください」と指示する必要があるのですが,Unison は レプリカをそれぞれ見比べて,どちらでもう一方を上書きすべきか勝手に判断 してくれます.

Unison も rsync も,更新には Andrew Tridgell と Paul Mackerras による rsync アルゴリズムを用いています.これは巨大なファイルの一部分のみ が変更された場合に,転送効率を最適化するアルゴリズムです.

Unison と CVS の違いは何ですか?

(訳注: まずはファイルシンクロナイザである Unison とリビジョン管理システ ムである CVS の本質的な違いを押さえておくべきでしょう.)

両方とも,中心となるリポジトリの内容に応じて,ディレクトリ構造からなる リモートのレプリカを最新に保つことができます.また双方向にファイルの更 新を行なったり,衝突する更新を検知したりもできます.同時に,Unison も CVS もファイルの転送には rsync のものと同じプロトコルを用います.

CVS に勝る Unison の利点は,特に大量のファイルに対して,より自動的に, 簡単に更新が行なえることでしょう.CVS を使う場合は,ファイルを追加した り削除したりした場合に,手動でその手続きを行なう必要があります.ファイ ルを移動する場合は少しトリッキーです.ディレクトリを移動したい場合なん か‥‥まあ,これは実際にやってみてください.

しかしながら成熟したリビジョンコントロールシステムである CVS は,例えば 履歴や複数のブランチを保持できる等,単なるファイルシンクロナイザである Unison にはない多くの機能を備えています.

NFS でリモートのファイルシステムをマウントしてローカルで Unison を実行しても構いませんか?それともリモートでサーバを起動しておく必要がありますか?

ローカルネットワークが十分に速いのであれば,レプリカを NFS でマウントし ても構いません.Unison は (特に同期の度に全てのファイルの更新時刻をチェッ クする必要があるために) たくさんのファイルを読む必要があります.よって 帯域が細いのであれば,リモートでサーバを起動しておいた方が良いでしょう.

Windows で GUI を起動すると,メインのウィンドウと空のコンソールウィンドウが開きます.コンソールウィンドウを開かなくすることはできますか?

コンソールウィンドウは ssh のパスワードを入力する時に使います.残念なが ら現在のバージョンの Unison では,ssh を利用するか否かに関わらず,コン ソールウィンドウが表示されてしまいます.

Karl Moerder がコンソールウィンドウの見た目をもう少し良くするためのスク リプトを公開しています.彼の方法では,.cmd ファイルへのショートカットか ら Unison を起動します.するとコンソールウィンドウのサイズを小さくし, 背景を灰色にし,パスフレーズの入力欄をセンタリングさせる等,ウィンドウ の属性をコントロールすることができるようになります.彼の書いたスクリプ トは http://www.cis.upenn.edu/~bcpierce/unison/download/resources/karls-winhax.zip からダウンロードできます.

また (ソケットモードでサーバに接続しているユーザは) アイコンに細工する ことでウィンドウを消してしまうこともできます.実行可能ファイルに対して ショートカットを設定しているなら,プロパティを設定してそのウィンドウが 最小化された状態で表示することができます (最小化ですから,タスクバーか らも消してしまうことはできませんが).

推移的に用いた場合でも Unison はうまく動きますか?つまり host1/dir と host2/dir,host2/dir と host3/dir をそれぞれ違うタイミングで同期させても大丈夫ですか?接続のグラフがループになっていると何か問題になりますか?

大丈夫でしょう.それぞれのホストのペアが接続されている限り,Unison が他のホストとの間で行なった更新がファイルシステムに及ぼす影響は,ユー ザが手動で行なった場合と変わりませんから.もし一つのホスト上のみで変更 されたファイルがあり,Unison がそのファイルが変更されたことを発見した場 合には,もう一方のホストで変更されていなければそのファイルがもう一方の ホストに転送されます.もし両方のホストで変更されていると確認した場合は, そのファイルには手をつけません.よって接続のグラフがループになっている ように見えても, (接続が分かれていない限りは) 全てのホストでファイルが 最新のものに更新されます.

この場合気をつけるべきことがあるとすれば,最初のマシン (むしろ実際は他 の全てのマシンについてなのですが) に対して,全てのマシンがファイルの変 更を知る前にもう一度更新をかけてしまわないことです.この場合 Unison はファイルが衝突したと判断するため,手作業で衝突を解決しなければ なりません.

/dev や /proc のファイルのように特別なファイルを同期させようとするとどうなりますか?

Unison は単純に同期を拒否します.Unison は一般ファイル,ディレクトリ, シンボリックリンクのみを扱えます.

Unison を同時に複数実行することはできますか?

Unison はこのような状況に対応しています.が,あまりテストされてはいませ んので,実行する際には注意してください.

ローカル (もしくは NFS 等) で Unison を実行した際,もしあるファイルが両方のレプリカに含まれていた場合はどうなりますか?

同期させようとしていたファイルが他の誰かによって変更されたと判断し,そ れらのファイルについて (安全に) 同期を失敗します.

Unison が実行中に kill されたらどうなりますか?普通に kill すべきか,もしくは kill -9 すべきでしょうか.同期の最中にネットワークが切れたらどうなりますか?一方のマシンがクラッシュしてもう一方が動きつづけた場合は?

心配には及びません.

Unison と他のプログラム,もしくはユーザが同じファイルにちょうど同時に書き込もうとするような状況ではどうですか?

そういった windows of danger はできるだけ短時間に済ますように努力し ますが,その危険性は完全には消し去れません.

Unix のファイルロックは NFS 上ではうまく機能しませんが,Unison にとって問題となりますか?

いいえ.

Windows システムで,root オプションはバックスラッシュで区切られているように見えますが,path オプションや ignore オプションはスラッシュで区切られています.どういうことですか?

Unison は2種類の path を使います.ローカルファイルシステムのシンタック スを用いたネイティブのファイルシステムの path と,常にスラッシュを区切 り文字に用いるポータブルな path です.root オプションはネイティブの path,その他は root から相対的に表現されます.

一般的な問題

Unison を使っていて問題が発生した時には,以下の情報が解決の助けになるか もしれません.

まず一般的な推奨事項として,理解し難い状況に陥った時はアーカイブファイ ル (.unison ディレクトリに arNNNNNNNNNNNNNNN のような名前で保存されてい ます) を削除することで,最初の状態に戻すことができます.2つのレプリカが 同一である場合には,アーカイブファイルを削除しても問題ありません.もし 変更点がある場合には,変更されたファイルがもう一方のレプリカにコピーさ れ,両方のレプリカに同名の,しかし内容の異なるファイルがある場合には衝 突として報告されます.

もし Unison が明らかにバグであるというような動作をした場合には,アーカ イブを一旦別の場所に移動してしまうのも手です.そうすることでその動 作を再現することができ,より詳細にバグの報告ができます.

CUI で ssh2 越しに使った場合に Uncaught exception Sys_blocked_io というエラーが出ます.

これは ssh2 がその標準出力を non-blocked で開くことが原因です.しか し Unison と ssh は標準エラー出力と non-blocked な設定を共有しています (ですからサーバから送られてきたエラーが表示されるのです).これは Unison の実行時に

unison -ui text < other args > 2>/dev/tty

として標準エラー出力をリダイレクトすることで解決できます.

但しこのリダイレクトの書式はシェルによって少し異なります.例えば csh や tcsh を使っている場合には

unison -ui text < other args > >&/dev/tty

とする必要があります.

以下のようなエラーはどんな意味ですか?
Propagating updates [accounting/fedscwh3qt2000.wb3]
failed: error in renaming locally:
/DANGER.README: permission denied

これは Unison が,中止されるとファイルシステムを良くない状態にするよう な動作を行なう時にコミットログとして用いる (accounting/fedscwh3qt2000.wb3 という実際の場所に対して accounting/fedscwh3qt2000.wb3.unison.tmp という名前で残っている一時ファ イルと同様のものです) DANGER.README というファイルを作成する際にエラー が発生したことを示します.リネームの操作は短時間に行なわれますが,しか しながら可能性はあります.もしこの状況が発生した場合コミットログはその まま残され,次回実行された際にファイルの一貫性がチェックされるべきであ ることを Unison に教えます (同時にユーザにも報告されます).

ここではホームディレクトリ (/ に設定されているのでしょう) に DANGER.README というファイルを作成しようとしたが,書き込み権限がなかっ たことを意味しています.

コマンドラインで unison work ssh://remote.dcs.ed.ac.uk/work と実行しましたが,fatal error: could not connect to server. というエラーが出て失敗します.しかし ssh remote.dcs.ed.ac.uk/work で直接接続してみると,$PATH は設定されていて,Unison の実行可能ファイルもちゃんとあります.

最初のケースは Unison が実行時に ssh を呼び出し,2番目のケースでは ssh があなたにリモートシェルを提供しています.ssh の設定次第では, この2つのシーケンスは異なるものです.

ssh remote.dcs.ed.ac.uk 'echo $PATH'

と打った時の表示と,一旦ログインしてシェルから echo $PATH と打った時と 同じ表示が同じか試してみましょう.これは ssh の設定によるものだと思われ ますが,詳しいことはわかりません.詳しい人がいたら是非教えてください (訳注: 例えばユーザのシェルの設定とシステム全体の設定で $PATH が異なる 場合に,このようなトラブルが起こるものと思われます.2つ下の項目参照).

Windows 上の OpenSSH 越しに Unison が実行できません.原因はわかりませんか?

Antony Courtney が以下のコメントを寄せてくれました.

私もこの ssh クライアントで Unison を実行させるのに苦労しました.そして 少なくとも一つの問題に行き当たりました.この経験を共有して, Windows/Unison/ssh/Cygwin の組み合わせで使おうとするユーザに known good な解決法を提供したいと思います.bash から実行すると (少なくとも 私の場合は) 失敗します.unison_win32-gtkui.exe を実行すると,Fatal error: Error in checkServer: Broken pipe [read()] というダイアログが出 ます.標準エラー出力には ssh: unison_win32-gtkui.exe: no address associated with hostname. という出力がされます.これは Ocaml Win32 ライ ブラリと Cygwin の間で,子プロセスに対する argv[] の扱いが異なるためで はないかと思います.解決法として,Unison を DOS プロンプトから起動する 方法があります.

ssh でサーバにログインすると,ちゃんと動いているように見えます (Unison のバイナリにもちゃんとパスが通っています) が,ssh unison は失敗します.何故でしょうか.

Nick Phillips が以下の説明を寄せてくれました.

簡単なことです.ssh を起動し,パスワードを入れるなどして,最後にログイ ンシェルに行き着きます.しかし ssh myhost.com unison を実行すると, Unison はログインシェルから実行されるわけではありません.これは異なるシェ ルの設定スクリプトが使われていることを意味します.同時に,多くの人が間 違った設定スクリプトを設定しています.例えば bash の場 合,.bash_profileはログインシェルとして実行した際にだけ使われます. これはシステムのコンソールか,ターミナルか,もしくはリモートからログイ ンした場合です.コマンドラインから xterm を実行した場合にはログインシェ ルは実行されません.ssh や rsh でログインした場合,ログインシェルは実行 されないでしょう(これはもちろん良いことです.例えばどんなターミナルが使 われているかを尋ねるように,そこからインタラクティブにコマンドを実行し たいでしょう.) .bash_profile で $PATH の設定をしたいと言い張る人たち は,以下のどれか一つ以上を実行する必要があるでしょう.これは他の多くの シェルに関しても言えることです.

  1. それをやめる
  2. bash のマニュアルの INVOCATION のセクションを読む
  3. $PATH を .bashrc で設定する
  4. 管理者にシステムの大本で $PATH の設定をするように頼む
  5. .bashrc から .bash_profile を source する...
非常に巨大なディレクトリに対して Unison を実行すると out of memory というエラーが出ます.

スタックの最大サイズを増やす必要があります.例えば Linux や Solaris の システムでは,ulimit コマンドを実行します (詳しくは bash のドキュメント を読んでください.)

非常に巨大なファイルをコピーできません.以下のようなエラーが出ます.
Error in querying file information:
Value too large for defined data type [lstat(...)]

これは Unix システムコールに対する OCaml インタフェースの制限です. OCaml ライブラリがファイルの位置を表現するのに 32bit を使っているのが原 因です. OCaml での正の int の最大値はおよそ 2.1E9 です.OCaml の開発チー ムがいつの日か 64bit の整数を用いるインタフェースを提供してくれるのを待 ちます.

最初に実行する時,何故 Unison はこんなに遅いのですか?

最初の同期の際,Unison はレプリカの状態に関する記憶を全く持っていま せん.よって Unison は全てのファイルをチェックし,フィンガープリントを 計算し,ネットワーク越しにフィンガープリントを転送し,他方と比較せねば なりません.一度これが完了するとその情報を蓄えておけるので,次回以降の 同期の際にはほとんどの作業をそれぞれローカルに行なうことができるように なります.

プロファイルで指定した path を,コマンドラインの -path オプションでオーバーライドできないのですが.

その通りです.path は設定を行なう度に,Unison が同期を行なうリストの中 に次々と追加されていきます.そして一度リストに追加された path を削除す る方法はありません.解決法としてはプロファイルを,異なる path を記述し た複数のトップレベルのファイルに分け,path 以外の設定に関しては共通 のファイルを include する方法があります.

プロファイルに設定した root をコマンドラインからオーバーライドしようとしても Wrong number of roots (2 expected; 4 provided) というエラーが出て失敗します.

root はプロファイルかコマンドラインのいずれかでのみ設定する必要があ ります.

OCaml 3.04 で Unison 2.7.7 をコンパイルしようとしていますが,Values do not match というエラーが出ます.

Unison の 2.7.7 は Ocaml3.02 でコンパイルできます.それ以降の (3.04 を 含む) バージョンのデフォルトでは,インタフェースの中で宣言された場合, 関数呼び出しへの引数の全てのラベルが必要となります.解決するには Makefile.OCaml というファイルに CAMLFLAGS+=-nolabels と追加して -nolabels オプションを有効にします.2.7.7 を GUI をコンパイルする際は, LablGtk 1.1.3 の代わりに 1.1.2 を使ってください.

トリックと Tips
Unison を inetd から実行することはできますか?

私たちは試してはいませんが,Toby Johnson が詳しい chroot mini-HOWTO を寄せてくれました.(Toby の HOWTO の元になった HOWTO は Yan Seiner によるものです.)

Unison に実行の度にパスワードを尋ねなくさせることはできますか? (そうすれば,例えば30分に一回,シェルスクリプトから自動的に実行させることができます.)

(訳注: この回答は公開鍵認証で ssh 接続ができるという前提で書かれていま す.)

実際にパスワードを尋ねているのは,Unison から内部的に呼び出された ssh です.Unix で Unison を実行しているのであれば,ssh-agent を試してみるべ きでしょう.

ssh-agent bash

と実行すると,サブプロセスとして bash が実行されます.このシェルから ssh-add コマンドで秘密鍵を登録します.これは実行した際に一度だけパ スワードを尋ね,そのセッションが終了するまでそのパスワードを保存します. これでパスワードを入力せずに Unison を実行でき,更にはシェルスクリプト から自動的に繰り返し Unison を実行することもできます.

ssh でパスワードを要求しない設定にすることも考えられます.認証用の公開 鍵を作る際に空のパスフレーズを与えれば良いのです.クライアントにパスフ レーズが空の秘密鍵を置いておいても問題ないと思うのであれば,この方法は Windows マシンでも使うことができます.

Windows で Unison をクリックスタートして,特定のプロファイルを使って同期させることはできますか?

Greg Sullivan が以下の有用なトリックを教えてくれました.

Windows 98 のマシンでクリックして特定のプロファイルで同期させるには,プ ロファイルで ssh を使っているのであれば,unison profile-name という内容 だけ (Unison の実行可能ファイルがパス上にあるのであれば) を含んだ .bat ファイルを作る必要があります.最初はデスクトップにショートカットを作り, unison profile-name というコマンドを実行するよう設定したのですが,実行 するとハングしてしまいます.しかし .bat を使うトリックはうまくいきます. というのも,まず command.com を立ち上げてから .bat ファイルを実行するか らです.

ssh のポートフォワーディングで Unison を実行することはできますか?

Mark Thomas は以下の方法でうまくいくと言います.

Windows でコマンドラインから ssh 越しに Unison を使おうとすると問題があっ たのですが,Unison は通信にソケットを使えることに気付きました (何て素晴 らしいソフトウェアでしょう!).そこで TTSSH ( http://www.zip.com.au/~roca/ttssh.html ) のポートフォワーディング機能を 使ってみました.Unison を使うには,ポートフォワーディングを有効にした TTSSH に,Unison サーバプロセスが走っている Linux サーバに接続します. Windows では単に Unison を実行して localhost に接続する (unison socket://localhost:XXXX/ ...) だけです.

接続するネットワークによってホスト名が変わるラップトップ上で Unison を使うことはできますか?

rootalias 機能で使えるようになります.

(Unix で) ダイアログボックスではなく,コンソールでパスフレーズを打たねばならないのが面倒です.より良い方法はありますか?

ダイアログボックスに PTY を割り当てて ssh とやり取りする等,いくつかの アイディアがあります.が,まだそれらを実装はしていません.あなたがハッ クしてみたいのなら,私たちは喜んでアイディアについての議論やパッチのマー ジに応じますよ.

一方,tmb が expectk を使ってその機能を実現するスクリプトを公開していま す. http://www.cis.upenn.edu/~bcpierce/unison/download/resources/expectk-startup から手に入ります.