Unison

提供: ArchWiki
2024年3月18日 (月) 13:34時点におけるKgx (トーク | 投稿記録)による版 (→‎参照: 同期)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

Unison は Unix ライクなオペレーティングシステム (Linux, macOS, Solaris) や Windows で動作する双方向性のファイル同期ツールです。ファイルやディレクトリの複製を別々のホスト (あるいは同一ホスト上の別々のディスク) に保存して、それぞれ別個に変更を加えて、後から複製の変更を相互に持ち寄って最新状態にすることができます。どんなシステムでもホストにすることが可能です。

インストール

unison パッケージをインストールしてください。CLI, GTK のインターフェイスが入っています。

設定

Unison を使用するには、プロファイルを作成する必要があります。

GUI

GUI を使用して Unison を設定するには、unison-gui を実行します。

手動

もしくは、~/.unison にプロファイルを手動で作成して、以下の行をデフォルトの設定ファイルである ~/.unison/profilename.prf に追加してください。

同期するルートディレクトリを定義:

root=/home/user/

ファイルを同期する先のリモートディレクトリを定義:

root=ssh://example.com//path/to/server/storage

任意で、SSH にわたす引数を指定:

sshargs=-p 4000

同期するディレクトリとファイルを定義:

# dirs
path=Documents
path=Photos
path=Study
# files
path=.bashrc
path=.vimrc

無視するファイルも定義できます:

ignore=Name temp.*
ignore=Name .*~
ignore=Name *.tmp
ノート: プロファイルの詳細は User Manual and Reference Guide にある サンプルプロファイル を参照してください。

使用方法

プロファイルを設定したら、次のコマンドで同期を開始できます:

$ unison profilename

もしくは GUI ツールを使用してプロファイルを選択してください:

$ unison-gtk2

Unison のインターフェイスでは進捗や変化を見ることができます。

バージョンの不適合

Unison が正しく機能しない場合、クライアントにインストールされている Unison のバージョンおよびコンパイルに使用した OCaml のバージョンが一致しているか確認してください。

Arch と他のディストリビューション間で同期を行う場合、大抵は OCaml と Unison をどちらかで手動でコンパイルする必要があります。

AUR にはバージョン 2.32 (unison-232-compatAUR) と 2.40 (unison-240-compatAUR) の非公式 PKGBUILD が存在します。

ヒントとテクニック

人間の時間と手間を省く

十分なスクロールバッファが確保できるターミナルエミュレータで unison を動作させる場合、変更箇所が衝突するたびに確認を要求するのは何の意味もありません。auto オプションを true に設定することで確認を表示しないようにできます。

diff の出力を読みやすくする

unison のデフォルトの diff コマンドは diff -u CURRENT2 CURRENT1 です。このコマンドの出力を確認するとき、左から右に変更があったり ('>')、逆に右から左に変更があると ('<')、どこが変更されるのか分かりにくいのが難点です。以下の設定を使うことでそれが分かりやすくなります: '>' が適用される行には全て '>' が付くようになります:

diff = diff -u CURRENT2 CURRENT1 | perl -pe 's/^\+/>/; s/^\-/</'

Emacs でマージ

Unison には外部のマージプログラムを使って衝突する2つのファイルのマージを手助けする機能が存在しますが、デフォルトではプログラムが設定されていません。マニュアルには以下のように設定することが提案されています:

merge = Name *.txt -> emacs -q --eval '(ediff-merge-files-with-ancestor "CURRENT1" "CURRENT2" "CURRENTARCH" nil "NEW")'

マージコマンドはターミナルから実行することができないため、上記を使うには X で Unison を実行する必要があります (Emacs: "standard input is not a tty")。また、Unison は CURRENT1 などの変数をシングルクォートで囲まれたファイル名に置き換えます。そのため、"(ediff-merge-files... \"CURRENT1\" ...)" のようにダブルクォートを使用すると上手くいきません。

CURRENTARCH 変数は共通祖先による 3-way マージを使用することを Unison に指定します。最後の同期で "backupcurrent" が設定されていた場合にのみ 3-way マージになります。通常の 2-way マージをターミナルで実行したい場合、以下の設定を使ってください。ediff.el ではなく emerge.el を使っています:

merge = Name {*,.*} -> urxvt -e emacs -nw -q --eval '(emerge-files nil "CURRENT1" "CURRENT2" "NEW")'

CURRENTARCH の代わりに CURRENTARCHOPT 変数が使われた場合、Unison は可能なときに共通祖先を使って、そうでない場合は (変数に空の文字列を設定して) 2-way マージにフォールバックします。シェルスクリプトで検知することが可能です。例:

merge = Name {*,.*} -> unison-merge-files CURRENT1 CURRENT2 NEW CURRENTARCHOPT

unison-merge-files を上記のように定義した場合:

#!/bin/sh
CURRENT1=$1
CURRENT2=$2
NEW=$3
CURRENTARCHOPT=$4
EMACS="urxvt -e emacs -nw"
if [ x$CURRENTARCHOPT = x ]; then
    $EMACS --eval "(emerge-files nil \"$CURRENT1\" \"$CURRENT2\" \"$NEW\")";
else
    $EMACS --eval "(emerge-files-with-ancestor nil \"$CURRENT1\" \"$CURRENT2\" \"$CURRENTARCHOPT\" \"$NEW\")";
fi

一般的な設定の同期

システム (サーバー、ワークステーション、ノートパソコン、スマートフォンなど) 上の設定ファイルを同期する場合、基本的な部分 (キーバインドやシェルのエイリアスなど) だけを別の設定ファイル (例: .bashrc_common) に分割して、変更がある部分 (アプリケーション特有の設定やセキュリティに関する設定など) だけを同期すると良いでしょう。

警告: 設定ファイルの双方向同期は、ピア同期システムが設定ファイル (おそらくシステムが同期する他のピア) に対する悪意のある変更を受信できるようにすることで、攻撃の手段となる可能性があります。これは、特に2つのシステムの概念的なセキュリティレベルが異なる場合 (パブリックシェルサーバーとパーソナルワークステーションなど)、セキュリティの低いシステムを侵害する方が簡単である可能性が高いため、攻撃者にとって魅力的なオプションです。2つの特定のシステム間の双方向同期が不要な場合は、常に noupdate オプションを使用してください。必要に応じて、同期時に各変更を確認します。自動双方向同期は細心の注意を払って実行する必要があります。

別のデータディレクトリの使用

デフォルトの unison データディレクトリは ~/.unison です。このディレクトリにはプロファイルだけでなく、ログや生データも含まれます。これを変更したい場合は、環境変数 (シェル設定内、または unison コマンドを使用する前に) を設定して下さい:

export UNISON="my-unison-data-folder"
ノート:
  • Unison はまだ XDG に準拠していません。詳細については、次の問題を参照してください: issue 270 および issue 552
  • 1 台のマシンで UNISON 変数を設定しても、リモートマシンの ~/.unison ディレクトリが使用されます。

参照