2004年02月21日

Unisonを使ってみる(2)

インストールから実際の使用までをまとめてみました。

ファイル同期ができると便利なシチュエーション
同じ目的に使えるツール
Windowsの「ブリーフケース」
CVS
SSHが必要
母艦にUnisonをインストール
ザウルスにUnisonをインストール
同期するディレクトリを母艦で設定する
最初の同期
2回目以降
その他

ファイル同期ができると便利なシチュエーション

ザウルスと母艦の両方で、同じファイルを頻繁に更新するとき。一方のファイルを他方のコンピュータに何度もコピーしていると、どっちが新しいファイルだったか、混乱してきます。

たとえば、母艦のエディタでRubyスクリプトを作成し、それをザウルスにコピーして使っているような場合。あるとき、出先でスクリプトのバグを見つけたが、すぐには母艦につなげないので、ザウルス上で修正。とりあえず動くようになったが、もう一度コード全体を見直したいので、修正したスクリプトを再び母艦にコピーして編集。編集したスクリプトをまたザウルスにコピー……。

こういうときに、ファイルをどちらからどちらへコピーするか、気をつけないと、古いファイルで新しいファイルを上書きしてしまいます。Unisonを使っていれば、いつでも同じコマンドラインを実行するだけで、ファイルを新しいほうに置き換えてくれます。

同じ目的に使えるツール

Windowsの「ブリーフケース」

Windowsのヘルプの説明が足りないために、今ひとつとっつきにくいのですが、実はドラッグアンドドロップだけで設定できるし、日本語のファイル名も問題なく扱えます。

正直なところ、母艦がWindowsで、つねに母艦の側で同期を実行するなら、あえてUnisonを使う理由はないかもしれません。

CVS

プログラム開発で、ソースコードの変更を記録管理するためのバージョン管理ツールですが、上のようなシチュエーションでも活用できます。そのうえ過去のバージョンにさかのぼったり、そこから分岐することもできます。

さらに、二つのワーキングコピーで同じファイルを更新してしまったときに、それがファイル内の別の箇所ならば自動的に「マージ」してくれます。近い箇所なら、両方の変更が書き込まれたファイルを吐き出し、ユーザーに解決を促します。

Unisonは、ファイルの内容の比較はしないので、更新の衝突を検出するだけで、マージについては別のプログラム (具体的にはEmacsのEdiff) にパラメータを渡して起動するインターフェイスを提供しているだけです。

ただ、CVSの場合、ファイルやフォルダをリネームしたり、移動・削除したいときの手順がわずらわしいのが難点です。

SSHが必要

それから、CVSでもUnisonでも、安全に使うためには、ザウルスと母艦にSSH (OpenSSH) を導入する必要があります。

以下の説明でも、ザウルスに OpenSSH を導入ずみで、SSHのサーバになることができ、母艦もssh-agentにより、毎回パスフレーズを入力しなくていい環境ができていることを前提にしています。

母艦にUnisonをインストール

Unisonのサイトでは、Windows用に、MSVCでコンパイルされたGUI版とテキスト版、CygwinのGUI版とテキスト版、Mingwのテキスト版、の5種類のバイナリが公開されています。

私はCygwinを使っているので、パス名の扱いの親和性を考えて、Cygwinのテキスト版を選びました。

ファイルをダウンロードしたら、適当にパスが通ったディレクトリにおいて、おしまい。

ザウルスにUnisonをインストール

Unisonをソースからコンパイルしようとすると、OCamlが必要になります。そこまで準備するのは面倒なので、どこかにARM用バイナリが転がっていないか探してみたら、ありました :-)

http://www.tuxmobil.org/software/unison/

これを、「ソフトウェアの追加/削除」でインストールしてはダメ。/home/rootのパーミッションが安全でないものに書き換えられてしまいます。

これだけでも怪しいので、やっぱり自分でコンパイルしたほうがベターですが……。

いちおう、OCamlのソースをSL-C760に持ってきて、セルフコンパイルしようとしたんですが、ocamldoc のコンパイルのところで I/O Error: no space left on device と出てしまい、挫折しました。

とにかく、次のようにして先のipkからunisonだけを取り出してインストール。

tar xzOf unison_2.9.1-1_arm.ipk ./data.tar.gz | tar xzvf - ./usr/bin/unison
mv ./usr/bin/unison /usr/bin/
chmod 755 /usr/bin/unison

(2004/02/20追記) なんとかOCamlのセルフコンパイラを作って、Unisonも自分でコンパイルしなおしました。(2004/11/22追記) 再コンパイルしました。→詳細

http://noir.s7.xrea.com/pub/zaurus/unison_2.9.1-2_arm.ipk

こちらはふつうに「ソフトウェアの追加/削除」でインストールしても大丈夫(だと思います)。ただ、/opt/QtPalmtop/bin にインストールされるので、ザウルスの ~/.ssh/environment で PATH を通しておく必要があります。

同期するディレクトリを母艦で設定する

Windows版のUnisonはデフォルトではUSERPROFILE環境変数を見て、その下に .unison ディレクトリを作り、そこに設定ファイルや「アーカイブ」(今までに同期したディレクトリの状態を記録しているファイル) を置くようになっています。

このディレクトリを変えたい場合は、環境変数UNISONで指定します。

そこまで準備できたら、unisonを起動。ディレクトリが作られて、default.prf というデフォルトの設定ファイルができます。

同期するディレクトリはコマンドラインでも指定できますが、いちど設定ファイルを作ってしまえば、あとはその設定をコマンドラインで指定するだけですむので、ここで設定ファイルを作り、設定ファイル用ディレクトリに置いておきます。

例: zaurus-ruby.prf

root = /home/hkuro/zauruswork/ruby_scripts
root = ssh://root@sla300//mnt/card/Documents/ruby_scripts
backup = Regex .*

母艦の /home/hkuro/zauruswork/ruby_scripts と、ザウルスの /mnt/card/Documents/ruby_scripts を同期する設定です。リモート側の指定は URL 風ですが、フルパスで指定するときはスラッシュが2つになることに注意。

念のため、同期のときにバックアップを保存するように指定しておきます。デフォルトでは $UNISON/backup がバックアップを保存するディレクトリになっています。そこに、今同期したばかりのファイルと、同期によって置き換えられた古いファイル (拡張子 .1.unibck が自動的につく) が保存されます。

バックアップをとると、それだけ余分にディスクスペースを食うので、大量のファイルがあるディレクトリを最初に同期するときなどには外しておいたほうがよいかもしれません。

同期の対象にするサブディレクトリや、除外するファイル名のパターンなども指定できるらしいですが、とりあえず省略。

最初の同期

この段階では、ザウルスと母艦のどちらかに、設定ファイルで指定したディレクトリが存在していればいいです。ただし、その親ディレクトリが存在していないとエラーになります。

つぎのようにコマンドを実行。

$ unison zaurus-ruby
Contacting server...
p = /home/hkuro/zauruswork/ruby_scripts; bn = ruby_scripts
Looking for changes
Warning: No archive files were found for these roots.  This can happen either
because this is the first time you have synchronized these roots,
or because you have upgraded Unison to a new version with a different
archive format.
 
Update detection may take a while on this run if the replicas are
large.
 
Unison will assume that the 'last synchronized state' of both replicas
was completely empty.  This means that any files that are different
will be reported as conflicts, and any files that exist only on one
replica will be judged as new and propagated to the other replica.
If the two replicas are identical, then no changes will be reported.
Press return to continue.[<spc>]
  Waiting for changes from server
Reconciling changes
 
local          sla300
         <---- dir        /  [f] f
 
Proceed with propagating updates? [] y
Propagating updates
 
 
UNISON started propagating changes at 18:22:44 on 19 Feb 2004
[BGN] Copying
  from //sla300//usr/mnt.rom/card/Documents/ruby_scripts
  to /home/hkuro/zauruswork/ruby_scripts
  hello.rb
[END] Copying
UNISON finished propagating changes at 18:22:45 on 19 Feb 2004
 
 
Saving synchronizer state
Synchronization complete

f (follow = 推定に従う)、< (左←右で更新)、> (左→右で更新)、/ (スキップ)、? (ヘルプ) をとりあえず覚えておけばいいでしょう。推定どおりなら、ただEnterキーを押すだけです。

最後に確認を求められるので、よければ y を押してEnter。

同期が終わると、母艦だけでなく、ザウルスのほうでも $HOME/.unison にアーカイブが作られます。

2回目以降

最初と同じく、

unison zaurus-ruby
Contacting server...
Looking for changes
  Waiting for changes from server
Reconciling changes
 
local          sla300
new file ---->            foo.rb  [f]
new file ---->            foo.rb~  [f]
changed  ---->            hello.rb  [f]
new file ---->            hello.rb~  [f]
 
Proceed with propagating updates? [] y
Propagating updates
 
 
UNISON started propagating changes at 18:25:07 on 19 Feb 2004
[BGN] Copying foo.rb
  from /home/hkuro/zauruswork/ruby_scripts
[BGN] Copying foo.rb~
  from /home/hkuro/zauruswork/ruby_scripts
  to //sla300//usr/mnt.rom/card/Documents/ruby_scripts
[BGN] Updating file hello.rb
  from /home/hkuro/zauruswork/ruby_scripts
  to //sla300//usr/mnt.rom/card/Documents/ruby_scripts
[BGN] Copying hello.rb~
  from /home/hkuro/zauruswork/ruby_scripts
  to //sla300//usr/mnt.rom/card/Documents/ruby_scripts
[END] Copying hello.rb~
[END] Copying foo.rb
[END] Copying foo.rb~
[END] Updating file hello.rb
UNISON finished propagating changes at 18:25:15 on 19 Feb 2004
 
 
Saving synchronizer state
Synchronization complete

その他

バッチ処理とか衝突への対処方法などには触れませんでしたが、以上の要領だけでもとりあえず使いはじめることはできるでしょう。逆にザウルス側でUnisonを起動してリモートマシンと同期することもできるでしょうが、まだ試していません。

(初稿: 2004-02-20 00:35:30)

Posted by Hiroyuki KUROSAKI at 2004年02月21日 13:50 このエントリーを含むはてなブックマーク
この記事の TrackBack URL:
http://noir.s7.xrea.com/mt/mt-tb.cgi/69
Unison
Excerpt: Unison ↑参考URL http://www.cis.upenn.edu/~bcpierce/unison http://www.cis.upenn.edu/~bcpierce/unison/download/stable/latest/unison-manual.html#profile http://lunatear.net/archives/000273.html http://www.icefree.org/~vvp/review/unison.html http://w...
Weblog: PukiWiki/TrackBack 0.1
Tracked: 2004年04月19日 00:48 Unisonの再コンパイル
Excerpt: Kuro-san: 更新日誌: Unisonを使ってみる(2) で公開していた ...
Weblog: Kuro-san: 更新日誌
Tracked: 2004年11月22日 08:52
Comments

Unison のマニュアルの Tutorial と Preferences, Profiles だけ訳してみました。自分自身ではまだ試していないのですが(^^; モノはここにあります。

http://pctraining.s21.xrea.com/lab/?unison

お役に立てば嬉しいなと思いまして。

Posted by: わたなべ on 2004年03月11日 16:05

わたなべさん、ありがとうございます!
Unisonは使ってみると、とにかくコマンド一発のシンプルさが快適に感じられますね。
細かい設定をやりはじめると、実は merge とか backup とかでまだ仕様が未完成なところが気になったりするのですが、今のところ、そういう機能を使う必要をあまり感じていません。

Posted by: noir on 2004年03月11日 22:55

個人的には rsync が Win32 ネイティブで動かないのでその代わりになればくらいに思ってます。大量のファイルの Win ⇔ Unix の転送時に cygwin の rsync がコケるし遅いので。あと、rsync は include, exclude の書式が分かりにくいですしね。path で書ける Unison の方が嬉しい局面は多そうです。

なので merge とか凝ったことはしてくれなくても別にいいかなと。そういう目的には CVS を使えばいいんだし、バックアップを取ったり、富豪的に pdumpfs なんかで snapshot をとったりすればよいかと思います。(これが synchro の pre-proccess みたいに自動でやれれば完璧かと。)

できれば rsync 的な使い勝手だけでスパっと分かりやすいページを作っていただけるといちばん嬉しいです :-)

Posted by: わたなべ on 2004年03月12日 11:19

こちらのページで紹介されているのを発見。
http://members.jcom.home.ne.jp/tanitsu/2004-09.html#2004-09-19

times=true で使うとおかしくなる、というのは私も経験したような覚えがあります。

シンボリックリンクのほうは気がつきませんでした。

Posted by: noir123 on 2004年11月20日 13:12

シンボリックリンクに対応したもの (unison_2.9.1-2_arm.ipk) を、こちらのエントリで公開しています。
http://noir.s7.xrea.com/archives/000135.html

Posted by: noir123 on 2005年04月01日 16:39
Post a comment

サイン・インを確認しました、 さん。コメントしてください。 (サイン・アウト)

(いままで、ここでコメントしたとがないときは、コメントを表示する前にこのウェブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)


情報を登録する?