Unisonマニュアル - リファレンス
ここでは 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 と打つ*1.この場合,Unison は使用するプロファイルを問い合わせます*2.
.unison ディレクトリ
Unison はそれぞれのホストのディレクトリに,様々な情報を保存します.環境変数 UNISON が設定されている場合,その値がそのディレクトリ名として使用されます.設定されていない場合,使用している OS によってディレクトリ名は異なります.Unix では $HOME/.unison,Windows では,環境変数 USERPROFILE が設定されていれば $USERPROFILE\.unison,HOME が設定されていれば $HOME\.unison,どちらも設定されていなければ C:\.unison が使われます.
アーカイブファイルはそのレプリカのあるホストの .unison ディレクトリに作られます.プロファイル (後述) は常にクライアントの .unison ディレクトリから探し出されます.
Unison はそれぞれの root について全く異なるアーカイブファイルを保持することに注意してください.
.unison ディレクトリを丸ごと同期させることはお薦めできません.巨大なアーカイブファイルを更新に含めることになるからです.しかし,あなたがそれを望むならそうしても安全です*3.
アーカイブファイル
各レプリカに対するアーカイブファイルは以下の情報から計算されます.
- 全てのホストについての正確な名前.saul のような短い名前は saul.cis.upenn.edu のようにフルアドレスに変換されます.
- 全てのホストにおけるレプリカへの path.繰り返すと,相対パス,シンボリックリンク等は絶対フルパスに変換されます.
- Unison がファイルのフォーマットを変更する際に常に更新される内部的なバージョン番号
この方法はほとんどのユーザに対して有効に機能します.しかし,アーカイブファイルの名前を生成する方法を変更することが役に立つ場合もあります.Unison は2つの方法を用意しています.
ローカルホストの正確なホスト名*4を調べるために,Unison は通常 gethostname() というシステムコールを使います.しかし UNISONLOCALHOSTNAME という環境変数が設定されている場合,代わりにその変数の値が使用されます.これにより,ホスト名が頻繁に変わる場合*5でもより簡単に 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)元のファイル名がもう使えなくなったためにファイル名を変え,これからもそのファイル名を絶対に使わないこと,のいずれかを満たす場合のみ使用してください*6.新しい rootalias 設定を加えたら,Unison を何度か (batch フラグを外す等して) 実行してみることをお薦めします.そして,特に変更の検知がうまく働いているかをチェックしてください.
オプション
Unisonの細かい動作はオプションで設定可能です.
いくつかのオプションは boolean 値*7をとります.その他のオプションは数値か文字列を値にとります.リスト中では数値は 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*8で指定されたディレクトリに保存されます.最新のバックアップは元のファイルと同名で保存され,古いバージョンのファイルは .n.unibck という拡張子をつけて保存されます.どれだけのバージョンをバックアップするかは,maxbackups オプションで設定します.
- backups
- true にセットされた場合,更新の際に古いバージョンをバックアップとして残すようになります.バックアップファイルは元のファイルと同じディレクトリに,拡張子 .bak を付けた形で保存されます.ほとんどのユーザにとって backup フラグよりも有用性は低いでしょう.
- batch
- true にセットされた場合,UI はユーザに対して問い合わせを全く行なわなくなります.更新は衝突しない限り自動的に行なわれ,衝突する更新はスキップします.
- contactquietly
- フラグが立てられると,起動時に Contacting server というウィンドウ *9を表示しなくなります.
- debug xxx
- 標準エラー出力に内部の動作内容を出力するようになります.モジュールの名前と共にデバッグ情報が出力されます.ソースアーカイブの Util.debug の中の関数を (grep 等を用いて調べて) 引数として指定することで,出力される内容をカスタマイズ出来ます.-debug all を指定することで,各モジュールが出力する全てのデバッグ情報を出力させることができます.(Unison がうまく動かず,内部で何が起こっているのか知りたいときには,これを最初にやってみるべきです.) -debug verbose はいくつかのモジュールからより詳細な情報を得ることができます*10.
- diff xxx
- ファイルの相違点を調べるシステムコマンドの名前と引数を指定することができます.デフォルトでは diff です.指定したプログラムには2つのファイル名を指定して実行されます.
- doc xxx
- -doc secname というコマンドラインオプションをつけると,Unison はマニュアルから secname という名前のセクションを探し出して標準出力に表示し,そのまま終了します.HTML のマニュアルと同じ内容を含んだマニュアル全体を出力するには -doc all を指定します.-doc topics を指定すると,指定可能なセクション名を含んだリストが出力されます.
- dumbtty
- true にセットすると,テキストモードの UI はターミナルのセッティングを変えようとしなくなります.*11.これは例えば Emacs の中で起動したシェルで Unison を使うような場合に便利です.dumbtty がセットされると,CUI でコマンドを打ち込んだ後,エンターキーを押す必要があります*12.GUI で起動された場合には,このオプションは影響を与えません.
- editor xxx
- マージするためのプログラムが0以外を返した時,その出力を表示するプログラムを指定します.ユーザがそのファイルを好きなように編集し保存すると, Unison はそのバージョンを同期させます.デフォルトでは emacs です.
- fastcheck xxx
- true にセットすると,Unison はファイルの変更をチェックする際,全てのファイルの内容をチェックする代わりにファイルの作成日時を似非 inode 番号として使います.Windows では,作成日時・変更日時・ファイルサイズが更新で変更されなかった場合,更新に失敗する可能性があります*13.しかし Unison は常に更新を行なう前に安全に変更のチェックを行なっていますので,そのような変更を他のレプリカから上書きしてしまうことはありません.ですので,Windows ではこのオプションを使うに値するでしょう.但しそういった変更が見逃されている心配があるのであれば,時々 fattcheck を false にして実行しましょう.デフォルトでは auto です.これは Unix 上のレプリカに対しては高速なチェックを*14,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 システムを一つでも含む際には自動的にセットされます.稀にですが,手動でセットすることも時には有効です*15.
- 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 接続の際にはこのオプションを設定する必要はありません.これはソケットモードで起動しているサーバを,一回の更新の後に終了させるために存在します*16.
- label xxx
- プロファイルの中で,そのプロファイルを説明する文章を指定します*17.
- 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 と子のみを同期させます*18.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 の実行可能ファイル名以外を) 引数として渡します*19.
- 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 は一桁の整数) という行が含まれる場合,その数字のキーを叩くことで即座にプロファイルを切り替え,同期を開始することができます.この場合,現在表示され選択されている内容は破棄されます.
プロファイルのサンプル
最小限のプロファイル
最小限のプロファイルのサンプルです.
# Roots of the synchronization root = /home/bcpierce root = ssh://saul//home/bcpierce # Paths to synchronize path = current path = common path = .netscape/bookmarks.html
基本的なプロファイル
有用なオプションを含んだ,もう少し洗練されたサンプルです.
# Roots of the synchronization root = /home/bcpierce root = ssh://saul//home/bcpierce # Paths to synchronize path = current path = common path = .netscape/bookmarks.html # Some regexps specifying names and paths to ignore ignore = Name temp.* ignore = Name *~ ignore = Name .*~ ignore = Path */pilot/backup/Archive_* ignore = Name *.o ignore = Name *.tmp # Window height height = 37 # Keep a backup copy of the entire replica backup = Name * # Use this command for displaying diffs diff = diff -y -W 79 --suppress-common-lines # Log actions to the terminal log = true
パワーユーザ向けプロファイル
Unison が巨大なレプリカに対して実行される時,しばしばレプリカの一部分のみを同期の対象として指定する方が (他の箇所の変更を調べる時間を節約できる分) 便利です.これはプロファイルをいくつかのパートに分けることで実現できます.具体的には,基本的な設定を含んだパートと,同期させたいそれぞれの path についてのトップレベルのパートです*20.
この構想を実現するプロファイルは以下のようになります.default.prf というファイルには include 行のみを含めます.
# Include the contents of the file common include common
共通のファイルの名前は common.prf ではなく common にしてください.これにより,Unison が GUI でプロファイルの選択肢に common を含むことを防ぎます.
common には実際の設定を書きます.
# (... other preferences ...) # If any new preferences are added by Unison (e.g. 'ignore' # preferences added via the graphical UI), then store them in the # file 'common' rathen than in the top-level preference file addprefsto = common # regexps specifying names and paths to ignore ignore = Name temp.* ignore = Name *~ ignore = Name .*~ ignore = Path */pilot/backup/Archive_* ignore = Name *.o ignore = Name *.tmp
common には path の設定を書きません.つまり,デフォルトのプロファイルで Unison を実行した場合 (つまり unison default もしくは単に unison のみで実行した場合) ,レプリカ全体が同期されるということです*21.
レプリカの一部の 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 です*22.後方互換性のため 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 はコマンドを解釈できるのです*23.しかしこの機能うまく働かないこともあります.例えば 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) です*24.利便性のため,もう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 のサーバの間) でパーミッションのビットを同期させるのは些かトリッキーです.以下に,その仕組みがどのようにして動作しているかを示します.
- 存在するファイルやディレクトリのパーミッションが変更された場合,パーミッションが両方のシステムに理解される場合には,パーミッションも同期されます.そうでなければパーミッションはそのまま保存されます.
- 新規に作成されたファイルがリモートのレプリカに転送される際,両方のシステムに理解されるパーミッションはそのまま同期されます.それ以外のパーミッションのビットはデフォルトの値にセットされます*25.
- セキュリティの観点から,Unix の setuid と setgid ビットは同期されません.
- Unix のオーナーとグループの ID は同期されません*26.全てのファイルはサーバプロセスのオーナーとグループによって作成されます.
クロスプラットホームでの同期
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 のパスワードを入力するためだけのコンソールウィンドウです*27.パスワードの入力が促されたら,入力する前にコンソールウィンドウに (クリックするなどして) フォーカスを当てる必要があります.DOS プロンプトから Unison を起動した場合は,パスワードは DOS プロンプトに入力してください.
このモードで Unison を利用するには,前もってプロファイルを作っておく必要があります.好きなエディタを使って作成してください.
*1 もしくはアイコンをクリックして実行しても一緒です.
*2 もしくは必要があれば新たに作成します.
*3 .unison ディレクトリ内のプロファイルを同期させること自体は何ら問題ありません.
*4 これは例えばどのファイルが同期されたかという情報を保存するアーカイブファイルの名前を生成するのに使われます.
*5 例えばラップトップをあちこち持ち歩くような場合.
*6 元の root とエイリアスが違うファイル群を指している場合,Unison は混乱してしまいますから.
*7 しばしばフラグと呼ばれます.
*8 デフォルトでは .unison/backup/.
*9 邪魔に感じるユーザもいるでしょう.
*10 ネットワーク越しにどんなバイト列が送信されているかまで見ることができます.
*11 通常 Unison はターミナルを raw mode で使用します.このモードだと,現在表示している行を書き換えるといったようなことができます.
*12 通常はユーザがコマンドのキーを打った瞬間に Unison はコマンドを理解します.
*13 そうそう起こることではありませんが,起こる可能性はあります.
*14 Windows 上と違い,この場合は安全です.
*15 例えば FAT パーティションをマウントした Unix システムで Unison を実行するときなど.
*16 ずっとサーバを起動しっぱなしではなく,一回の更新ごとにサーバを起動するのを好むユーザもいます.
*17 特に GUI で,複数のプロファイルを切り替えるユーザに有用です.
*18 例えば一つのディレクトリを素早く同期させたい場合などに有用です.
*19 このオプションは rsh と ssh の両方に引数を渡すことができます.それがこのオプションが sshargs ではなく rshargs である理由です.
*20 include 機能も同様に異なる root に対して共通の設定を提供する目的で利用できます.
*21 レプリカ全体を絶対に同期させたくない場合には,default.prf に同期させる path を設定すべきです.
*22 つまり最後に同期されたバージョンともう一つ古いバージョンがバックアップされます.
*23 つまり Unison に左から右に更新するという指示を出す際に,> Enter ではなく > を叩くだけで済むということです.
*24 照合順序や文字クラス等の POSIX の全ての正規表現は今のところサポートされていません.
*25 Unix システムでは現在の umask の値が用いられます.
*26 これは一般に何を意味しますか?
*27 ssh を使わないのであれば無視して構いません.