概要
今日、多くの人々が複数のコンピュータを使用しています。自宅に1台、職場に1台またはそれ以上、外出時にラップトップやPDAを携帯することも珍しくありません。これらすべてのコンピュータには、多くのファイルが必要です。すべてのコンピュータで最新バージョンのデータを使用できるように、どのコンピュータでも作業ができて、ファイルの変更ができればと考えるでしょう。
データの同期は、高速ネットワークで固定接続されているコンピュータ間ではまったく問題なく実現できます。この場合、NFSなどのネットワークファイルシステムを使用し、ファイルをサーバに保存して、すべてのホストがネットワーク経由で同じデータにアクセスすればよいわけです。ところがこの方法は、ネットワーク接続が低速な場合、または固定でない場合には不可能です。ラップトップをもって外出しているとき、必要なファイルをローカルハードディスクにコピーする必要があります。しかし、そうすると今度は、変更したファイルを同期させる必要があります。1台のコンピュータでファイルを変更したときは、必ず他のすべてのコンピュータでファイルを更新しなければなりません。たまにコピーする程度なら、手動でscpまたはrsyncを使用してコピーすればよいでしょう。しかし、ファイルが多い場合、手順が複雑になるだけでなく、新しいファイルを古いファイルで上書きしてしまうといった間違いを防ぐために細心の注意が必要になります。
![]() | データ損失の危険 |
|---|---|
データを同期システムで管理する前に、使用するプログラムをよく理解し、機能をテストしておく必要があります。重要なファイルのバックアップは不可欠です。 | |
このように手動によるデータの同期は、時間がかかる上に間違いが起こりやすい作業ですが、この作業を自動化するためのさまざまな方法を採用したプログラムを使用することで手動による作業は行わずにすみます。ここでの説明は、このようなプログラムの仕組みと使用法について、一般的な理解を図ることを目的としています。実際に使用する場合は、プログラムのマニュアルを参照してください。
CVSは、多くの場合プログラムソースのバージョン管理に使用されるプログラムで、複数のコンピュータでファイルのコピーを保存する機能を持っています。したがって、データ同期にも適しています。CVSはサーバ上に一元的なリポジトリを設定し、ファイルおよびファイルの変更内容を保存します。ローカルに実行された変更はリポジトリにコミットされ、更新によって他のコンピュータに取得されます。両方の処理はユーザによって実行される必要があります。
CVSは、複数のコンピュータで変更が行われた場合、非常に優れたエラー回復力を発揮します。変更内容がマージされ、同じ行が変更された場合は、競合がレポートされます。競合が生じても、データベースは一貫した状態のままです。競合はクライアントホストで解決するためにのみ表示されます。
バージョン管理は不要であっても、低速ネットワーク接続を使用して大きなディレクトリ構造を同期させる必要がある場合は、ツールrsyncの適切に開発されたメカニズムを使用して、ファイル内の変更箇所のみを送信できます。この処理では、テキストファイルのみでなくバイナリファイルも対象となります。ファイル間の差分を検出するために、rsyncはファイルをブロック単位で分割してチェックサムを計算します。
変更内容の検出処理は高コストを伴います。rsyncの使用量に合わせて、同期対象となるシステムの規模を調整する必要があります。特に、RAMが重要です。
使用するプログラムを決定する際に重要な要因がいくつかあります。
一般に、データの配信には2種類のモデルが使用されます。1つは、すべてのクライアントが、そのファイルを一元的なサーバによって同期させるモデルです。サーバはすべてのクライアントから、少なくともいずれかの時点でアクセスできる必要があります。このモデルは、CVSが使用します。
もう1つは、すべてのネットワークホストがそれぞれのデータをピアとして相互に同期させるモデルです。rsyncは、実際にクライアントモードで動作しますが、任意のクライアントがサーバとして動作できます。
CVS、およびrsyncは、各種のUNIXおよびWindowsシステムなど、他の多くのオペレーティングシステムでも使用できます。
CVSでは、ユーザが手動によってデータの同期を開始します。これにより、データの同期を詳細に制御でき、競合の処理も容易です。ただし、同期の間隔が長すぎると、競合が起こりやすくなります。
複数のユーザが大きなプログラミングプロジェクトにかかわっている場合も、CVSでは、競合はまれにしか発生しません。これはドキュメントが個別の行単位でマージされるためです。競合が起こると、影響を受けるのは1台のクライアントだけです。CVSでは、通常、競合が容易に解決できます。
rsyncには、競合処理の機能はありません。ユーザは、意図せずにファイルを上書きしないように注意し、考えられる競合はすべて手動で解決する必要があります。安全のために、RCSなどのバージョン管理システムを追加採用できます。
CVSでは、新しいディレクトリやファイルは、コマンドcvs addを使って明示的に追加する必要があります。これにより、同期の対象となるファイルについて、ユーザがより詳細に制御できます。しかし他方で、新しいファイルが見過ごされることが多く、特にcvs updateの出力に表示される疑問符は、ファイルの数が多いためにたびたび無視されます。
CVSは追加機能として、古いバージョンのファイルが再構成できます。変更を行うたびに簡単な編集コメントを挿入しておくと、内容とコメントからファイルの作成状況を後で簡単に追跡できます。これは論文やプログラムテキストを作成する際、貴重な支援となります。
同期の対象となるすべてのホストには、分散されたデータを処理できるだけの十分なハードディスクの空き容量が必要です。CVSでは、サーバ上のリポジトリデータベースに余分な容量が必要となります。ファイルの履歴もサーバに保存されるため、このための容量も別に必要です。テキスト形式のファイルが変更されたときには、変更された行だけを保存すれば足ります。バイナリファイルは、ファイルが変更されるたびに、ファイルのサイズと同じだけの容量が必要なため、テキストより必要な容量が多くなります。
CVSを使い慣れたユーザは、通常、コマンドラインでプログラムを制御します。しかし、cervisiaのようなLinux用のグラフィカルユーザインタフェースがあり、また他のオペレーティングシステム用にwincvsなども用意されています。kdevelopなどの開発ツールやEmacsなどのテキストエディタの多くが、CVSをサポートしています。競合の解決は、これらのフロントエンドの方が、はるかに容易です。
rsyncは、より使いやすく初心者向けです。CVSは、より操作が難しくなっています。ユーザはレポジトリとローカルデータの間のインタラクションを理解する必要があります。データを変更すると、最初にローカルでリポジトリとマージする必要があります。これはコマンドcvsまたはupdateで実行します。次にコマンドcvsまたはcommitでデータをリポジトリに送信する必要があります。この手順をいったん理解すれば、初心者の方でもCVSを簡単に利用できるようになります。
伝送中、データは妨害や改ざんから保護される必要があります。CVSやrsyncはいずれもssh(セキュアシェル)経由で容易に使用できるため、この種の攻撃からセキュリティ保護されます。CVSをrsh(リモートシェル)経由で実行するのは避けるべきです。また、安全でないネットワークでpserverメカニズムを使用してCVSにアクセスすることもお勧めできません。
CVSは、プログラミングプロジェクト管理のため長期間にわたって開発者に使用されてきたため、きわめて安定しています。CVSでは開発履歴が保存されるため、誤ってファイルを削除するといったユーザの誤操作にも対応できます。
表26.1 ファイル同期化ツールの機能: -- = とても悪い、- = 悪い、または利用不可、o = 普通、+ = 良好、++ = とても良好、x = 利用可能¶
|
CVS |
rsync | |
|---|---|---|
|
クライアント/サーバ |
C-S |
C-S |
|
移植性 |
Lin、Un*x、Win |
Lin、Un*x、Win |
|
対話処理 |
x |
x |
|
Speed |
o |
+ |
|
競合 |
++ |
o |
|
ファイル選択 |
Sel./file, dir. |
ディレクトリ |
|
履歴 |
x |
- |
|
ハードディスクスペース |
-- |
o |
|
GUI |
o |
- |
|
難度 |
o |
+ |
|
攻撃 |
+ (ssh) |
+(ssh) |
|
データ損失 |
++ |
+ |
CVSは、個々のファイルが頻繁に編集され、ASCIIeキストやプログラムソーステキストのようなファイル形式で保存される場合の同期に適しています。CVSを使用して他の形式、たとえばJPEGファイルのデータを同期させることは可能ですが、生成される数多くのファイルをCVSサーバに恒久的に保存するため、結果としてデータ量が膨大になります。このような場合、CVSの機能のほとんどが利用できません。CVSを使用したファイルの同期は、すべてのワークステーションが同じサーバにアクセスできる場合のみ可能です。
サーバとは、すべてのファイルの最新バージョンを含め、有効なファイルが配置されるホストです。固定のワークステーションであれば、どれでもサーバとして使用できます。可能であれば、CVSレポジトリのデータを定期バックアップに含めます。
CVSサーバを設定するとき、できればユーザアクセスをSSH経由で許可します。ユーザがサーバにtuxとして認識され、CVSソフトウェアがサーバとクライアントにインストールされている場合、次の環境変数をクライアント側に設定する必要があります。
CVS_RSH=ssh CVSROOT=tux@server:/serverdir
コマンドcvsinitを使用して、クライアント側からCVSサーバを初期化します。これは一度だけ実行すれば、後は必要ありません。
最後に、同期に名前を付ける必要があります。クライアント上で、CVSで管理するファイルのディレクトリ(空のディレクトリ)を選択するか作成します。ディレクトリには、同期用の名前を付けます。この例で、ディレクトリ名はsynchomeです。このディレクトリに移動し、次のコマンドを入力して、同期名をsynchomeと設定します。
cvs import synchome tux wilber
CVSの多くはコメントが必要です。このため、CVSはエディタを起動します(環境変数$EDITORで定義されたエディタか、エディタが定義されていない場合はvi)。事前に次の例のようなコマンドラインにコメントを入力しておけば、エディタ呼び出しが避けられます。
cvs import -m 'this is a test' synchome tux wilber
これで、すべてのホストがcvsco synchomeを使用して同期リポジトリからチェックアウトできます。これにより、クライアントに新しいサブディレクトリsynchomeが作成されます。変更内容をサーバにコミットするには、ディレクトリsynchome(またはそのサブディレクトリ)に移動し、「cvs commit」と入力します。
デフォルトでは、すべてのファイル(サブディレクトリを含め)がサーバにコミットされます。個別のファイルまたはディレクトリだけをコミットするには、cvscommit file1 directory1のように指定します。新しいファイルとディレクトリは、サーバにコミットする前に、cvsadd file1 directory1のようなコマンドを使用してレポジトリに追加する必要があります。この後、cvscommit file1 directory1を実行して、新しく追加したファイルとディレクトリをコミットします。
他のワークステーションに移動する場合、同じワークステーションの以前のセッションで同期リポジトリからチェックアウトしていない場合は、ここでチェックアウトします。
サーバとの同期は、cvs updateを使用して起動します。cvs update file1 directory1を使用すると、ファイルやディレクトリを個別に更新できます。現行のファイルとサーバに格納されているバージョンとの違いを確認するには、コマンドcvs diffまたはcvs diff file1 directory1を使用します。更新によって変更されたファイルを確認する場合は、cvs -nq updateを使用します。
更新時に表示されるステータス記号の例を次に示します。
ローカルバージョンが更新されました。この更新はサーバが提供しているすべてのファイル、およびローカルにシステムに存在しないすべてのファイルに影響します。
ローカルバージョンが変更されました。サーバ上で変更があれば、その差分がローカルコピーに取り込まれていることがあります。
ローカルバージョンに対し、サーバ上のバージョンからパッチが適用されました。
ローカルファイルが、レポジトリの現在のバージョンと競合しています。
このファイルがCVSに存在しません。
ステータスMは、ローカルで変更されたファイルを示します。ローカルコピーをサーバにコミットするか、ローカルファイルを削除して更新を再実行します。この場合、不足しているファイルは、サーバから取得されます。ローカルに変更したファイルをコミットしたが、そのファイルで同じ行に変更があり以前にコミットされている場合は、競合がCで示されて表示されることがあります。
この場合、ファイル内の競合マーク(「>>」および「<<」)を確認し、2つのバージョンのどちらを採用するか決定します。これは厄介な作業のため、変更を破棄し、ローカルファイルを削除して「cvs up」と入力し、現在のバージョンをサーバから取得することもできます。
rsyncは、大量のデータを定期的に送信する必要があるが、変更量はあまり多くない場合に便利です。たとえば、バックアップの作成時などが該当します。もう1つのアプリケーションはステージングサーバに関係します。この種のサーバには、DMZでWebサーバに定期的にミラー化されるWebサーバの完全なディレクトリツリーが格納されます。
rsyncには2つの操作モードがあります。このプログラムを使用してデータをアーカイブまたはコピーできます。そのためには、ターゲットシステム上にsshなどのリモートシェルがあれば十分です。ただし、rsyncをdaemonとして使用し、ネットワークにディレクトリを提供することもできます。
rsync の基本操作モードの場合、特別な設定は不要です。rsync では、ディレクトリ全体を別のシステムに直接ミラー化できます。たとえば、次のコマンドでは、tuxのホームディレクトリのバックアップがバックアップサーバsun上に作成されます。
rsync -baz -e ssh /home/tux/ tux@sun:backup
次のコマンドは、ディレクトリを復元する場合に使用します。
rsync -az -e ssh tux@sun:backup /home/tux/
ここまでの操作は、scpのような通常のコピーツールの場合とほぼ同じです。
rsyncのすべての機能を完全に使用可能にするには、「rsync」モードで操作する必要があります。そのためには、いずれかのシステムでrsyncdデーモンを起動します。設定はファイル/etc/rsyncd.conf内で行います。たとえば、rsyncでディレクトリ/srv/ftpを使用可能にするには、次の設定を使用します。
gid = nobody
uid = nobody
read only = true
use chroot = no
transfer logging = true
log format = %h %o %f %l %b
log file = /var/log/rsyncd.log
[FTP]
path = /srv/ftp
comment = An Example
次に、rcrsyncdstartを使用してrsyncdを起動します。また、ブート処理中にrsyncdを自動的に起動する方法もあります。このようにセットアップするには、このサービスをYaSTのランラベルエディタで有効にするか、またはコマンド「insservrsyncd」を入力します。かわりに、xinetdからrsyncdを起動することもできます。ただし、この方法はrsyncdの使用頻度が低いサーバの場合にのみ使用してください。
この例では、すべての接続を示すログファイルも作成されます。このファイルは/var/log/rsyncd.logに格納されます。
これで、クライアントシステムからの転送をテストできます。そのためには次のコマンドを使用します。
rsync -avz sun::FTP
このコマンドを入力すると、サーバのディレクトリ/srv/ftpにあるファイルがすべてリストされます。このリクエストはログファイル/var/log/rsyncd.logにも記録されます。実際の転送を開始するには、ターゲットディレクトリを指定します。現在のディレクトリには..を使用してください。たとえば、次のようにします。
rsync -avz sun::FTP .
デフォルトでは、rsyncでの同期中にファイルは削除されません。ファイルを削除する必要がある場合は、オプション「--delete」を追加してください。新しい方のファイルが削除されないように、代わりにオプション--updateを使用することもできます。競合が発生した場合は、手動で解決する必要があります。
CVSの重要情報については、ホームページhttp://www.cvshome.orgを参照してください。
rsyncに関する重要な情報は、マニュアルページmanrsyncおよびmanrsyncd.confを参照してください。rsyncの基本原則に関する技術情報については、/usr/share/doc/packages/rsync/tech_report.psを参照してください。rsyncの最新ニュースについては、このプロジェクトのWebサイトhttp://rsync.samba.org/を参照してください。