サーバー設定 · 3 min read · Feb 09, 2026

Debian 8 (Jessie) の 2 台のサーバー間での Unison ファイル同期の設定

このチュートリアルでは、Unison を使用して 2 台の Debian 8 サーバー間でファイル同期を設定する方法を示します。Unison は rsync に似たファイル同期ツールで、主な違いは、両方向での変更を追跡/同期することです。つまり、server1 で変更されたファイルは server2 に複製され、逆も同様です。

1 予備ノート

このチュートリアルでは、以下の 2 台の Debian サーバーを使用します:

  • server1.example.com、IP アドレス 192.168.1.101
  • server2.example.com、IP アドレス 192.168.1.102

/var/www ディレクトリを 2 台のサーバー間で同期させたいと思います。このチュートリアルでは、Unison を root ユーザーとして実行するため、ユーザーおよびグループの権限を同期するのに十分な権限があります。

このチュートリアルのすべてのコマンドは root ユーザーとして実行されます。両方のサーバーに root としてシェルでログインし、ステップ 2 “Unison のインストール“ から始めてください。

2 Unison のインストール

server1/server2:

Unison は server1 と server2 にインストールする必要があります。server1 から server2 に SSH を使用して接続するため、SSH パッケージも必要です。また、シェルでファイル編集用に nano エディタをインストールします。これは次のように実行できます:

apt-get -y install unison openssh-server ssh nano

3 server1 でのプライベート/パブリックキーのペアの作成

server1:

server1.example.com でプライベート/パブリックキーのペアを作成します:

ssh-keygen -t dsa

root@server1:~# ssh-keygen -t dsa
公開/秘密の dsa キーペアを生成しています。
キーを保存するファイルを入力してください (/root/.ssh/id_dsa): <– ENTER
‘/root/.ssh’ ディレクトリを作成しました。
パスフレーズを入力してください (パスフレーズなしの場合は空のままにしてください): <– ENTER
同じパスフレーズを再度入力してください: <– ENTER
あなたの識別情報は /root/.ssh/id_dsa に保存されました。
あなたの公開鍵は /root/.ssh/id_dsa.pub に保存されました。
キーのフィンガープリントは:
ba:82:e1:a1:42:9b:d4:c8:99:c8:bd:8b:7d:4d:d4:66 root@server1
キーのランダムアート画像は:
+—[DSA 1024]—-+
| |
| |
| . |
| . E |
|+ * . S |
|.Ooo o |
|ooo+. + |
|oo=… o |
|.. oo.. |
+—————–+
root@server1:~#

重要なのは、パスフレーズを入力しないことです。そうしないと、ミラーリングは人間の操作なしには機能しませんので、単に ENTER を押してください!

次に、公開鍵を server2.example.com にコピーします:

ssh-copy-id -i $HOME/.ssh/id_dsa.pub [email protected]
# ssh-copy-id -i $HOME/.ssh/id_dsa.pub [email protected]
ホスト '192.168.1.102 (192.168.1.102)' の信頼性を確認できません。  
ECDSA キーフィンガープリントは 51:7f:b4:ed:bd:e3:fc:16:2f:55:5c:e1:2c:d7:3d:a9 です。  
接続を続けますか (yes/no)? <-- yes (これは初めて server2 に接続する場合のみ表示されます)  
/usr/bin/ssh-copy-id: INFO: 新しいキーでログインを試みています。すでにインストールされているキーをフィルタリングします  
/usr/bin/ssh-copy-id: INFO: 1 個のキーがインストールされる必要があります -- 今、プロンプトが表示された場合は、新しいキーをインストールするためです  
[email protected]'s password: <-- server2 root パスワード
追加されたキーの数: 1
マシンにログインしてみてください: "ssh '[email protected]'"  
そして、追加されたのがあなたの望んでいたキーだけであることを確認してください。

次に、server2 で server1 の公開鍵が正しく転送されたか確認します:

server2:

cat $HOME/.ssh/authorized_keys
root@server2:/home/administrator# cat $HOME/.ssh/authorized_keys  
ssh-dss AAAAB3NzaC1kc3MAAACBAKHLdAztIr8muZIlQYuE/4f75kmgTwWqJRZJ1dTqHDnHWsy48emDU8v85hxAPg43k9aF7/zAwpA0MNNNk5T9Tx/DyUkK/KcyVP2f4p8tvovrkUvoxsZACkTUmFqKdq2x6/AGfjsCRmkpLhZuad7r5rKEXHRh8KYGHqD1Id8wcpy5AAAAFQCww3OekKcKMshMAwBK3XQmmYEGUwAAAIEAgjztlwh8OFYxwQve/RrhI2sceCXwS/yjQyH7q0zdWB9Fr4s/16T2PLBT+7M3vb+JlPDO3JRqgaYbel1kS2F2iKrY0EX0FI3/9fVDfWoz3mhCscPLriqy5AcsHitxQNfiZgA5wDiSjWpk1v+FbIC+VuqbKdQuE4MBKj19N9YALIUAAACABQ4NDsa2UBc8jsxvghjoLhUWF7HChaCksXQcL6i98VNRcemtPC6wpIri75iR4Uhv1666bDOBAdmIBX9Qf7A/+czPKPaj4CGI1hVy1pgYMa3btnEvoSnH/ONtjpOz9q+3up1OOOn+5fud7xjJn+Fq8WoGROgarBpCbQU3w2GUUnM= root@server1

4 Unison の実行

server1:

これで、両方のサーバーの /var/www ディレクトリを同期するために Unison を初めて実行できます。server1 で次のコマンドを実行します:

unison /var/www ssh://192.168.1.102//var/www

出力は次のようになります - これは Unison が初めて実行されるため、いくつかの質問に答える必要があるかもしれません:

root@server1:/var/www# unison /var/www ssh://192.168.1.102//var/www  
サーバーに接続中...  
接続されました [//server1//var/www -> //server2//var/www]  
変更を探しています  
警告: これらのルートに対してアーカイブファイルが見つかりませんでした。  
 /var/www  
 //server2//var/www  
これは、これが初めてこれらのルートを同期したため、または Unison を新しいバージョンにアップグレードしたために異なるアーカイブ形式になったために発生する可能性があります。
更新検出には、レプリカが大きい場合、時間がかかることがあります。
Unison は、両方のレプリカの「最後に同期された状態」が完全に空であると仮定します。これは、異なるファイルはすべて競合として報告され、片方のレプリカにのみ存在するファイルは新しいと見なされ、もう一方のレプリカに伝播されることを意味します。両方のレプリカが同一であれば、変更は報告されません。
このメッセージが繰り返し表示される場合、あなたのマシンの一方が DHCP からアドレスを取得しているため、同期の間にホスト名が変更されている可能性があります。これを修正する方法については、UNISONLOCALHOSTNAME 環境変数のドキュメントを参照してください。
Unison プロジェクトへの寄付は大変感謝されます:  
http://www.cis.upenn.edu/~bcpierce/unison
続行するにはリターンを押してください。[] <-- Enter を押してください
サーバーからの変更を待っています  
変更を調整しています
local server2  
dir ----> example.com [f] <-- Enter を押してください  
dir ----> example.de [f] <-- Enter を押してください
更新を伝播しますか? [] <-- "y" と入力してください  
更新を伝播しています

UNISON 2.40.102 は 2015 年 9 月 25 日 10:17:17.94 に変更の伝播を開始しました  
[BGN] example.com を /var/www から //server2//var/www にコピーしています  
[BGN] example.de を /var/www から //server2//var/www にコピーしています  
ショートカット: /var/www/example.de/web/index.html をローカルファイル /var/www/.unison.example.com.d3783bddaaf59b9ba4d2ed0433f9db63.unison.tmp/web/index.html からコピーしました  
[END] example.de のコピーが完了しました  
[END] example.com のコピーが完了しました  
UNISON 2.40.102 は 2015 年 9 月 25 日 10:17:17.94 に変更の伝播を完了しました

同期状態を保存しています  
10:17:17 に同期が完了しました (2 アイテムが転送され、0 がスキップされ、0 が失敗しました)

server1 と server2 の /var/www ディレクトリを確認すると、同期されていることがわかります。

もちろん、Unison を対話的に実行することは望ましくないため、コマンドラインで指定する必要があるすべての設定を含む設定ファイル (/root/.unison/default.prf) を作成できます:

nano /root/.unison/default.prf
# 同期のルート  
root = /var/www  
root = ssh://192.168.1.102//var/www

# 同期するパス  
#path = current  
#path = common  
#path = .netscape/bookmarks.html

# 無視する名前とパスを指定するいくつかの正規表現  
#ignore = Path stats    ## /var/www/stats を無視します  
#ignore = Path stats/*  ## /var/www/stats/* を無視します  
#ignore = Path */stats  ## /var/www/somedir/stats を無視しますが、/var/www/a/b/c/stats は無視しません  
#ignore = Name *stats   ## "stats" で終わるすべてのファイル/ディレクトリを無視します  
#ignore = Name stats*   ## "stats" で始まるすべてのファイル/ディレクトリを無視します  
#ignore = Name *.tmp    ## 拡張子 .tmp のすべてのファイルを無視します

#          true に設定すると、このフラグはユーザーインターフェースが競合しない変更に対して確認をスキップするようにします。 (より正確には、ユーザーインターフェースが 1 つのエントリの伝播方向を設定し終え、次のエントリに移動しようとしているとき、競合しないすべてのエントリをスキップし、次の競合に直接移動します。)  
auto=true

#          true に設定すると、ユーザーインターフェースは一切質問をしません。競合しない変更は伝播され、競合はスキップされます。  
batch=true

#          !true に設定すると、Unison は、変更を伝播する前に、全体のレプリカが削除されたように見える場合に追加の確認を要求します。バッチフラグも設定されている場合、同期は中止されます。パスの優先設定が使用される場合、同じ確認がトップレベルのパスに対して要求されます。 (現時点では、このフラグはテキストユーザーインターフェースにのみ影響します。) マウントポイントの優先設定も参照してください。
confirmbigdel=true

#          この優先設定が true に設定されている場合、Unison は、更新のためにレプリカをスキャンする際に、ファイルの変更時間と長さを `擬似 inode 番号` として使用します。Windows では、更新によって変更時間と長さの両方が変更されていない場合、Unison が更新を伝播し損なう可能性があります。  
#          ただし、Unison は、変更を伝播する直前に常に安全な更新チェックを行うため、他のレプリカからの変更でそのような更新を上書きすることはありません。したがって、Unison が更新を見逃す可能性がある場合は、ほとんどの時間このスイッチを使用することが合理的であり、時折 fastcheck を false に設定して Unison を 1 回実行することができます。  
#          この優先設定のデフォルト値は auto で、Unison は Unix レプリカ (安全な場合) で高速チェックを使用し、Windows レプリカで遅いチェックを使用します。後方互換性のために、yes、no、および default を true、false、および auto の代わりに使用できます。詳細については、「高速チェック」セクションを参照してください。
fastcheck=true

#          このフラグが true に設定されている場合、ファイルのグループ属性が同期されます。グループ名またはグループ識別子が同期されるかどうかは、優先設定 numerids に依存します。
group=true

#          このフラグが true に設定されている場合、ファイルの所有者属性が同期されます。所有者名または所有者識別子が同期されるかどうかは、優先設定 extttnumerids に依存します。
owner=true

#          -prefer root の優先設定を含めると、Unison は常に競合を root に有利に解決します。ユーザーからの指示を求めるのではなく。 (root の構文は root の優先設定と同じで、特別な値 newer および older も含まれます。) この優先設定は preferpartial の優先設定によって上書きされます。  
#          この優先設定は、自分が何をしているか確信している場合にのみ使用する必要があります!
prefer=newer

#          この優先設定が true に設定されている場合、テキストユーザーインターフェースはエラーの場合を除いて何も表示しません。  
silent=true

#          このフラグが true に設定されている場合、ファイルの変更時間 (ディレクトリの変更時間ではない) が伝播されます。
times=true

コメントはファイルを自己説明的にするはずですが、パスの指示を除いて。パスの指示を指定しない場合、ルート指示にあるディレクトリが同期されます。パスの指示を指定すると、パスはルートパスに対して相対的であり (例: root = /var/www および path = current は /var/www/current に変換され)、これらのサブディレクトリのみが同期され、ルート指示で指定された全体のディレクトリは同期されません。

利用可能なオプションの詳細については、Unison の man ページを参照してください:

man unison

すべての設定を設定ファイルに入れたので (特にルート (およびオプションでパス) 指示)、引数なしで Unison を実行できます:

unison

5 Unison のための Cron ジョブの作成

server1:

同期を自動化したいので、server1.example.com に cron ジョブを作成します:

crontab -e
*/5 * * * * /usr/bin/unison &> /dev/null

これにより、5 分ごとに Unison が実行されます。必要に応じて調整してください (参照:

man 5 crontab

)。ここでは Unison のフルパス (/usr/bin/unison) を使用して、cron が Unison の場所を確実に見つけられるようにしています。あなたの Unison の場所は異なる場合があります。次のコマンドを実行して、あなたの Unison の場所を見つけてください:

which unison

6 Unison のテスト

これで、Unison の 2 方向同期が完全に機能しているかどうかをテストします。

server1 で次のコマンドを実行して、”Test 1” という内容のテストファイルを作成します:

Server1

echo "Test 1" > /var/www/test.txt

次に、少なくとも 5 分待ちます (cron ジョブを作成したため、5 分ごとに 1 回実行されます)。次に、server2 で次のコマンドを実行します:

cat /var/www/test.txt

test.txt の内容を画面に表示します。出力は次のスクリーンショットに似ているはずです。

サーバー 2 での cat コマンドの出力

次に、server2 でこのコマンドを実行して、テストファイルの内容を “Test 2” に更新します:

Server2

echo "Test 2" > /var/www/test.txt

そして、再び少なくとも 5 分待ちます。次に、server1 で cat コマンドを実行します:

Server1

cat /var/www/test.txt

出力はスクリーンショットに示されているようになります。

サーバー 1 での cat コマンドの出力

7 リンク

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。