The InterMezzo High Availability File System HOWTO by the project members v1.0.5, August 2001 野本 浩一 (hng@ps.ksky.or.jp) v1.0.5j, February 08, 2002 この文書は、Linux 上の InterMezzo ファイルシステムの設定および動作を説 明します。 ______________________________________________________________________ 目次 1. 謝辞 2. 免責およびライセンス 3. はじめに 3.1 InterMezzo は何ですか? 3.2 バージョン1.0.4での制限 4. InterMezzo のインストール 4.1 概要 4.2 パッケージの入手 4.3 ブートするための 2.4 のカーネルの構築 4.4 カスタムカーネル向け InterMezzo ファイルシステムの構築 5. InterMezzo の設定 5.1 コンフィグファイル 5.2 InterMezzo ファイルシステムのフォーマット 5.3 ext2/3 ファイルシステムの InterMezzo への変換 5.4 三つの一般的な構成 5.4.1 一つのクライアントと一つのサーバ (一般的な使用 - ラップトップとデスクトップ、バックアップ、二つのウェブサーバなどの同期) 5.4.2 二つのクライアントと一つのサーバ (一般的な使用 - 二つのリモートオフィス) 5.4.3 IPSec および ssh トンネルの利用 5.4.4 同じホスト上での一つのクライアントと一つのサーバ (一般的な使用 - InterMezzo のテスト) 5.5 構成チェック 6. 競合からのリカバリ 7. デバッグ 8. テストおよびデバッグのためにテストフレームワークを使用する 9. InterMezzo はどのように動作しますか? 9.1 一貫性と粒度 9.2 intermezzo.o、カーネルモジュール 9.3 Lento 9.4 KML ファイル 9.5 Last_rcvd ファイル 9.6 KML および Expect ファイルの正当な変換 10. 連絡先の情報 11. 日本語訳について ______________________________________________________________________ 1. 謝辞 多くの方々がこの HOWTO に寄与しました。著者はPeter J. Braam , Rob Simmonds, Gordon Matzigkeit , Christopher Li , Shirish Phatak です。 2. 免責およびライセンス InterMezzo is an experimental file system. It contains kernel code and daemons running with root permissions and is known to have bugs. Please back up all data when using or experimenting with InterMezzo. InterMezzo is covered by the GPL. The GPL describes the warranties made to you, and can be found in the file COPYING. Copyright on InterMezzo is held by Peter J. Braam, Stelias Computing, Carnegie Mellon University, Phil Schwan, Los Alamos National Laboratory and Red Hat, Inc, TurboLinux, Inc., Tacitus Systems, Inc. and Mountain View Data, Inc. 参考訳 InterMezzo は実験的なファイルシステムです。それはカーネルコード およびルート権限で実行するデーモン、そして既知のバグを含んでいま す。InterMezzo の使用もしくは実験を行う場合、データをすべてバッ クアップしてください。 InterMezzo は GPL によって保護されます。GPL はあなたになされる保 証について述べ、ファイル COPYING の中にあります。 InterMezzo の著作権は Peter J. Braam, Stelias Computing, Carnegie Mellon University, Phil Schwan, Los Alamos National Laboratory, Red Hat, Inc., TurboLinux, Inc., Tacitus Systems, Inc., Mountain View Data, Inc. が保有しています。 InterMezzo is a trademark of Stelias Computing. It may be used freely to refer to the software on the InterMezzo Web Site 参考訳 InterMezzo は Stelias Computing の商標です。InterMezzo ウェブサ イト 上のソフトウェアを言及するため に、自由に使用することができます。 3. はじめに 3.1. InterMezzo は何ですか? InterMezzo は多数のコンピュータ上に存在する folder collection, 別名 fileset の複製を維持するファイルシステムです。修正のログを構築し他の ノードへそのログを広めることにより、同期してこれらの複製を保持します。 複製への関与を示すコンピュータは fileset の レピリケータと呼ばれま す。InterMezzo は、レプリケータでの更新を交換する際に組織だった役割を 果たす、fileset のためのサーバが一つあります。 InterMezzo にはdisconnected operation (切断時の動作) があり、つまり、 不通となっていたチャネルが復旧した時に forwarded が必要なすべての更新 を覚えておくために、ログ を管理します。コンフィグレーションパラメータ で conflicting updates (競合する更新) の回避を設定しない場 合、disconnected operation の間に conflicting updates が起きる可能性が あるので、これはベストエフォート型同期です。 InterMezzo は全データの記憶域として既存のディスクファイルシステムを使 用します。現時点で ext3 をサポートしますが、間もなく ReiserFS および XFS をサポートするでしょう。ext3 にフォーマットされたディスクボリュー ムが ext3 の代わりにファイルシステムタイプ InterMezzo でマウントされた なら、InterMezzo ソフトウェアはファイルシステムへのアクセスをすべて管 理し始めます。それは、修正のログを記録し、ディスクファイルシステムを修 正するための 許可 を確認し、connected operation 中の競合する更新を回避 します。 InterMezzo は基礎的な内部のファイル転送の仕組みか、もしくは rsync プロ トコル (Rsync ウェブサイト を参照してください) を使うことができます。 3.2. バージョン1.0.4での制限 セキュリティ 今のところ、信頼されたネットワーク上でのみ InterMezzo を実行する べきです - 複製に関わるシステム上のルートユーザは等しく信頼され る必要があります。システムに組込まれた rudumentary security がま だありますが、これは (root squash のない) NFS セキュリティと似た ようなものです。信頼されたネットワークを得る良い方法は IPSEC (FreeSwan http://www.freeswan.org を参照してください)、CIPE (http://sites.inka.de/sites/bigred/devel/cipe.html を参照してく ださい)、SSH トンネルを使うことです。SSL ユーティリティ stunnel はデーモンを再接続試行でたくさん生成するので、多少難しいかもしれ ません。POSIX ACL の複製は 2.2 カーネルで利用でき、2.4 向けはま もなく出ます。時がたつにつれ、セキュリティの向上がなされるでしょ う。 リカバリ 今のところ、システムは Ext3 と組合わされたジャーナルリカバリがあ ります。システムがクラッシュした後、分散された状態を含む KML, LML last_rcvd ファイルを持ったローカルディスクシステムは自動的に 復旧するでしょう。相手をともなったリカバリも普通にシームレスに行 われるようになるでしょう。 競合の扱い 現状システムは悲観主義ではなく厳格主義的な競合検出を行う競合ハン ドラを持っていません。もっと広範な競合解決ツールは開発が続けら れ、次のメジャーリリースで利用できるはずです。disconnected operation の期間の後に再接続する場合だけ競合が起き、競合はクライ アントだけで起きる可能性があるシステムの設計になっています。 Fetch on demand 当面、InterMezzo は全ファイルシステムを複製します。しかしなが ら、Fetch on demand システムは将来のバージョンで登場し、ファイル システムの部分的な複製ができるようになるでしょう。この最初のバー ジョンはメタデータ (ディレクトリおよび inode すべて) の複製では なく、 fetch file data on demand になるでしょう。部分的なメタ データの変更は将来のバージョンで実装されるかもしれません。 4. InterMezzo のインストール 4.1. 概要 InterMezzo は InterMezzo ファイルシステムを持ったカーネルに依存しま す。現在 Perl で書かれたユーザレベルのファイルサーバおよびキャッシュマ ネージャがあります。そして InterMezzo ファイルシステムを作成するユー ティリィティがあります。 4.2. パッケージの入手 バージョン 1.0.4 のパッケージは から入手で きます。これらのパッケージはきれいな RedHat 7.1 システム上にインストー ルすべきです。2.2 カーネルパッケージか 2.4 カーネルパッケージのどちら かをインストールします。 4.3. ブートするための 2.4 のカーネルの構築 2.4 カーネルをブートするために、次のように initrd で初期 ramdisk を生 成する必要があります - mkinitrd /boot/initrd-2.4.7-ext3_0.9.5-presto_1.0.4 2.4.7-ac9 Lilo でこのカーネルをブートするために、次のような lilo エントリを /etc/lilo.conf ファイルに追加します - image=/boot/vmlinuz-2.4.7_ext3_0.9.5_presto_1.0.4 label=InterMezzo read-only root=/dev/hda1 initrd=/boot/initrd-2.4.7-ext3_0.9.5-presto_1.0.4 4.4. カスタムカーネル向け InterMezzo ファイルシステムの構築 あなたのカーネル向けカーネルモジュールを生成するために、あなたのカーネ ル向けの .config ファイルおよびカーネルソースが必要です。最初にカーネ ルソースの準備、次にモジュールの構築へと進みます - cd /your/source/linux make distclean cp your.config .config make oldconfig dep cd /usr/src/presto24-1.0.04 ./configure --enable-linuxdir=/your/source/linux make install [訳注;上記の /your/source/linux (二箇所) は「カーネルソースのディレク トリ」に読みかえて実行してください。] Linux 2.2 カーネルでも同じ手順で行います。 5. InterMezzo の設定 5.1. コンフィグファイル デフォルトのコンフィグディレクトリは /etc/InterMezzoです。以下に示す設 定ファイルを生成するために、対話型 inconfig コマンドを利用するか、もし くは手動でそれらを作成してもかまいません。 バージョン 1.0 およびそれ以降で使うコンフィグファイルは、より古いバー ジョンで用いていた Perl フォーマットの代わりに、XML フォーマットを用い ます。 /etc/intermezzo/sysid システム名、presto デバイス名、IP バインドアドレスを保持します。 仮に、サーバ名が muskox、IP アドレスが 192.168.0.3 で、クライア ントは clientA および clientB とします。各ホストの sysid ファイ ルはホスト名、presto デバイス名、IP バインドアドレスを含みます。 つまり muskox のファイルは次のようになるでしょう - InterMezzo の初期バージョンはこのファイルに presto デバイス名を含ん でいなかったことに注意してください - 今ではこのフィールドを必要とし ます。 /etc/intermezzo/serverdb サーバのデータベースを保持します。 server 構造体は次に示す XML の server エレメントです - 上記は IP アドレス 192.168.0.3 なサーバ muskox 用の単一のサーバの記 述です。port および bindaddr の記述は任意です - デフォルトのポート は 2222 です。bindaddr の記述のないサーバは要求をすべてのインター フェースで待ち (listen) ます。記述のあるサーバは bindaddr のアドレ ス上だけで待ちます。クライアントとサーバの両方を同じシステムで実行 している場合、異なる bindaddr をサーバとクライアントに指定すること が必要です。 /etc/intermezzo/fsetdb fileset のデータベースを保持します。 fsetdb 構造体は次に示す XML の fileset エレメントです - clientA clientB 上記は muskox が維持する yourfsetname と呼ぶ fileset 向けの単一な fileset の記述です。fileset はホスト clientA と clientB で複製され ます。 fetchtype はサポートされたバルクムーバのクラス名であることがありま す。デフォルトは "Rsync" で、より単純な InterMezzo に管理されるバル クムーバは "Desc" と呼ばれます。 /etc/fstab InterMezzo fileset のマウントを簡単にするには、下記に示すうちの 一つを /etc/fstab に追加します。試験および開発には、ループデバイ スをキャッシュとして利用することがもっとも簡単です - /tmp/cache /izo0 intermezzo loop,fileset=fsetname,mtpt=/mnt/izo0, data=journal,prestodev=/dev/intermezzo0,cache_type=ext3,noauto 0 0 ここで、/tmp/cache はループデバイスに使われるファイルで、 /izo0 は マウントポイント (ディレクトリ) で、fsetname は fileset 名 で、/dev/intermezzo0 は presto デバイス名です。キャッシュファイルお よび presto デバイスの作成はこのセクションの終わりの例題で説明され ます。これをするには、カーネルは loopback device support を有効にし て構築されなければなりません。 注記 - マウントオプション data=journal は、2.4 カーネル向け ext3 の バグが修正されるまで重要です。 純粋なブロックデバイスを利用することは、ループデバイスの設定をする 必要がないので、もう少し簡単です。ブロックデバイス /dev/hda9 を利用 するには、/etc/fstab ファイルは次のものを含みます - /dev/hda9 /izo0 intermezzo fileset=fsetname,mtpt=/izo0, prestodev=/dev/intermezzo0,cache_type=ext3,data=journal,noauto 0 0 注記 - o この文書では行が折り返されているかもしれませんが、/etc/fstab のエントリは一行でなければなりません。以下に示す例でも同じこ とが言えます。 o マウントポイントはオプションの中で明示的に渡す必要があります (マウントの将来のバージョンはこれが必要なくなるでしょう)。 他のファイル ファイル /izo0/.intermezzo/fsetname/kml は InterMezzo ファイルシ ステム内で行なわれた変更をすべての把握する kernel modification log (別名 KML) を含みます。ファイル /izo0/.intermezzo/fsetname/last_rcvd は分散された同期化ファイル を把握する last_rcvd ファイルです。InterMezzo の現行のリリースで は、 InterMezzo ファイルシステムを初めてマウントする前に、KML お よび last_rcvd ファイルを作成 (通常 mkizofs を実行します) する必 要があります。 5.2. InterMezzo ファイルシステムのフォーマット このためには、mkizofs ツールを利用します - mkizofs -r fsetname -j /tmp/cache mkizofs -r fsetname -j /dev/hdaX -r オプションの引き数はInterMezzo の複製ログが作成されるルートの fileset 名です。-j オプションで Ext3 ジャーナルが作成されます。さらに ファイルシステム種別を指定するようなオプションもありますので、 mkizofs -h を参照してください。 5.3. ext2/3 ファイルシステムの InterMezzo への変換 既にキャッシュファイルシステムが初期化されている場合、InterMezzo が必 要とするメタデータファイルを手動で作成しなければなりません - mount -t ext2 -o loop /tmp/cache /izo0 mkdir -p /izo0/.intermezzo/fsetname/db chgrp -R InterMezzo /izo0/.intermezzo chmod 700 /izo0/.intermezzo touch /izo0/.intermezzo/fsetname/{kml,lml,last_rcvd} tune2fs -j /tmp/cache # if file system was ext2 umount /izo0 これらの例は、/tmp/cache ファイルシステムにループバックデバイスを利用 し、 fileset は fsetname と呼ばれていると仮定します。 InterMezzo としてこれらをマウントする可能性が発生する前に、手動で複製 対象にそれらを複製するべきなので、結果的にファイルシステムは同一になり ます。 5.4. 三つの一般的な構成 一般的な構成を三つ例にとり、サーバ/キャッシュマネージャを起動するため のコンフィグファイルおよび正しい手順を考えましょう。 5.4.1. 一つのクライアントと一つのサーバ (一般的な使用 - ラップトップ とデスクトップ、バックアップ、二つのウェブサーバなどの同期) この場合、仮にホスト muskox が fileset shared を維持し、ホスト clientA が fileset を複製されるとします。次のファイルは muskox と clientA の両 方に置かれます。 /etc/intermezzo/serverdb /etc/intermezzo/fsetdb clientA /etc/intermezzo/sysid muskox 上のこの内容は - clientA 上のこの内容は - /etc/fstab 次の行は muskox と clientA の両方のファイルに追加されます - /tmp/fs0 /izo0 intermezzo loop,file- set=shared,prestodev=/dev/intermezzo0, mtpt=/izo0,cache_type=ext3,noauto 0 0 /tmp/fs0 このファイルおよびファイルシステムは下記のコマンドを使用して作成 されます - dd if=/dev/zero of=/tmp/fs0 bs=1024 count=10k mkizofs -F /tmp/fs0 /izo0/.intermezzo/shared/kml 上記の mkizofs を実行しなかった場合、最初にファイルシステムを ext3 としてマウントし、次のコマンドで KML および last_rcvd ファ イルを作成します - mkdir /izo0 mount -o loop /tmp/fs0 /izo0 mkdir -p /izo0/.intermezzo/shared touch /izo0/.intermezzo/shared/{kml,last_rcvd} umount /izo0 /dev/intermezzo0 これは下記のコマンドを使用して作成されます - mknod /dev/intermezzo0 c 185 0 chmod 700 /dev/intermezzo0 /etc/conf.modules モジュールの構成ファイルは /etc/modules.conf と呼ばれているかも しれません。次の行を追加してください - alias char-major-185 intermezzo lento を起動する前に、キャッシュをマウントしてください - mkdir /izo0; mount /izo0 これで lento を起動できます。muskox と clientA の両方で、次を入力しま す。 lento 5.4.2. 二つのクライアントと一つのサーバ (一般的な使用 - 二つのリモー トオフィス) /etc/intermezzo/serverdb 上記の「一つのクライアントと一つのサーバ」の場合向けと同様です。 /etc/intermezzo/fsetdb clientA clientB これは最初の例と同様ですが、clientB が replicator のリストに追加さ れています。 /etc/intermezzo/sysid muskox および clientA 向けのこれは 最初の例と同様で、 clientB 上 のものは次を含みます - /etc/fstab これは、上記の「一つのクライアントと一つのサーバ」の場合で使用さ れるものと同様です。 5.4.3. IPSec および ssh トンネルの利用 誰かここに何か書いていただけませんか? 暗号化されたトンネルの起動 ssh -f -x -L 3333:localhost:2222 -R 3333:localhost:2222 5.4.4. 同じホスト上での一つのクライアントと一つのサーバ (一般的な使用 - InterMezzo のテスト) ホスト muskox 上で実行していると仮定します。一つのホスト上で複数の lento を実行するには ip-alias の使用が必要です - ip-alias オプションが カーネルに組込まれていなければなりません (CONFIG_IP_ALIAS)。これは一つ のインターフェースに複数の IP アドレスを関連付けることができます。名前 muskoxA1 および IP アドレス 192.168.0.100 が利用できるとします。ファイ ル - /etc/hosts の中に次の行を追加します - 192.168.0.100 muskoxA1 そして次の入力により ip-alias を追加します - ifconfig eth0:1 muskoxA1 up 次に下記の内容の設定ファイルを二つ作成します - /etc/intermezzo/sysid /etc/intermezzo/sysid.muskoxA1 後者のファイルは alias された IP アドレス上で実行する lento 用の sysid ファイルとして作用します。同じホスト上でクライアントとサーバ の両方を実行しているので、それぞれのために /dev/intermezzo0 および /dev/intermezzo1 という異なるデバイスを指定しなければならないことに 注意してください。 /etc/intermezzo/fsetdb muskoxA1 二番目の lento を実行するには、二つ目の presto デバイスおよびループ バックキャッシュが必要です。次のように作成します - mknod /dev/intermezzo1 c 185 1 dd if=/dev/zero of=/tmp/fs1 bs=1024 count=10k mkizofs -F /tmp/fs1 chmod 700 /dev/intermezzo1 /etc/fstab 二つのエントリがここに必要なことに注意してください - /tmp/fs0 /izo0 intermezzo loop,fileset=shared,prestodev=/dev/intermezzo0, mtpt=/izo0,cache_type=ext3,noauto 0 0 /tmp/fs1 /izo1 intermezzo loop,fileset=shared,prestodev=/dev/intermezzo1, mtpt=/izo1,cache_type=ext3,noauto 0 0 二つの InterMezzo ファイルシステムをマウントしてください - mount /izo0 mount /izo1 サーバとして動作する lento を前と同様に実行できます - lento レプリケータとして動作する lento は、どの sysid ファイルを読むかを 伝えなければなりません (これはどの presto デバイスを使用するかを伝 えることです)。次のように二つ目の lento を起動します - lento.pl --idfile=sysid.muskoxA1 5.5. 構成チェック 今のところ、checkconfig ツールは動作していません。コンフィグチェックの XML バージョンはまだ着手していません。 設定ファイルの簡単なチェックを行うスクリプトは提供されます。 config_check と呼ばれるスクリプトで .../intermezzo/tools ディレクトリ 内にあります。 lento が標準的なシステム id ファイル /etc/intermezzo/sysid を使用して いるなら、スクリプトは引き数なしで実行できます。異なるシステム id ファ イルを使用しているのなら、これを示すために --idfile=my_idfile フラグを 使用します。 さらに --configdir=my_confdir フラグを使用することで、 /etc/intermezzo 以外のコンフィグディレクトリを使用できます。 6. 競合からのリカバリ InterMezzo の現行版はシステムクラッシュのほとんどの状況に対処するため に、リカバリの仕組みが組込まれています。設定を選ぶことで、競合すなわち クライアントおよびサーバキャッシュへの一貫しない更新を回避できます。 しかしながら disconnected operation の間、ファイルシステムを読出し専用 とすることによりそれらを回避する設定を明示的にしなかった場合、競合は生 成される可能性があります。クライアントおよびサーバが一貫しないキャッ シュを持ってしまった場合、システムをリカバリできるのは、手動リカバリだ けです。 システムは手動で次のようにリカバリできます - 1. 競合が起きる場合、変更を再統合している lento は終了します。この lento はこのレプリケータの相手からの更新を受信していて、大抵相手は 最新になっています。したがって動作を続けている lento から終了した lento へ同期させましょう。 2. サーバおよびクライアント (群) を終了し、キャッシュをアンマウント し、カーネルから presto モジュールを削除します - umountizo ; rmmod presto 3. ext3 ファイルシステムとして各キャッシュをマウントします - mount -o loop /tmp/fs0 /izo0 4. クライアントおよびサーバ上のキャッシュを同期させるために rsync か tar あるいは別のツールを使用します。サーバ上にないファイルをクライ アントから必ず削除し、キャッシュを同一にします。 5. クライアントの synced フラグをセットしてください - これは起動時にシ ステムが再度同期しようとすることを防ぎます。これは SYSID をクライア ントの sysid で、FSETNAME を fileset 名で、置きかえた以下のコマンド で行えます - touch /var/intermezzo/SYSID/FSETNAME-synced 例えば、fileset shared を備えたクライアント iclientA 上で使うには - touch /var/intermezzo/iclientA/shared-synced 6. 永続的なデータベースはこの時点で、同期がはずれるので、クライアント とサーバの両方で KML および last_rcvd のレコードを消去しなければな りません - cp /dev/null /izo0/.intermezzo/shared/kml ; cp /dev/null /izo0/.intermezzo/shared/last_rcvd 7. キャッシュをアンマウントし、再び InterMezzo ファイルシステムとして マウントします。サーバおよびクライアント上の lento を再起動します。 これは厄介ですが、journaled recovery は開発中なのです。 7. デバッグ バグの発見を助長するには、情報をログすることが必要です。ログは二箇所で 発生し、カーネルからのログは /var/log/messages へ、lento からのログは stdout および stderr へ出力されます。 カーネルのデバッグログ機能はシステムをとても遅くします。次で開始されま す - echo 4095 > /proc/sys/intermezzo/debug echo 1 > /proc/sys/intermezzo/trace lento のログは端末から捕捉でき、--debuglevel=N の使用で開始されま す。N=1 で多くのことを、N=100 ですべてのことを、ログします。 何が起こったのか調べるために、ログはもちろんのこと、バグを再現する正確 な情報もメールしてください。 8. テストおよびデバッグのためにテストフレームワークを使用する ../intermezzo/tests ディレクトリ内の README ファイルを読んでください。 これはあなた向けのすべての情報を簡単に取っておくことができ、一台のシス テム上でクライアントおよびサーバを実行します。 9. InterMezzo はどのように動作しますか? InterMezzo はかなり Coda から着想を得ており、現在のキャッシュ同期プロ トコルは Coda がサポートする多くのプロトコルの一つです。すべての状況で 最良であるとは言えませんが、それを簡単に行うことができるものです。 InterMezzo ファイルシステムは同期させられた複数のホスト上のファイルの 集合を保持します。各ホストのネイティブファイルシステムの上に位置し、複 数のホスト間の変更を同期させることができるような方法で、更新を把握しま す。この文書で、同期されたファイルを保持するために InterMezzo が用いる アーキテクチャおよびプロトコルを記述します。 9.1. 一貫性と粒度 InterMezzo はファイルシステム間の非常に緩い一貫性だけを保証します。 ファイルは完全なユニットとしてのみ扱われ、ファイルが書込みでクローズさ れるまで変更は広められず、あるシステム上の変更は別のシステムに直ちに反 映する必要もありません。InterMezzo 1.0 ではファイルシステム全体が複製 され、どの時点においてもあるホストだけがそのファイルシステム向けの書込 みロックを持つことが可能です。 9.2. intermezzo.o、カーネルモジュール Presto は InterMezzo 用のカーネルモジュールです。VFS 下の InterMezzo ファイルシステムに関連した様々な動作を実行し、Lento とのやり取りのため の仮想デバイスを作成します。 9.3. Lento Lento はユーザ空間のデーモンで、ファイル転送および presto に代わって他 のキャッシュ関連を扱います。マウントされた InterMezzo ファイルシステム につき Lento が一つあります。 9.4. KML ファイル マウントされた InterMezzo ファイルシステムにつき一つの KML ファイルが あります。KML ファイルはファイルシステムの変更のレコードを含み、 KML ファイルを全体的に見ると、ファイルシステム全体の複製を構築するためのス クリプトと規定できます。 KML ファイルは一連のバイナリレコードで、その各々はファイルシステムに対 する一つの修正を表わします。各レコードは他のレコードと関係がない点で自 給自足で、レコードを容易に動かせるのが特徴です。レコードは可変長で、 ファイルの中で前後に動かし安くするために、レコードの長さは各レコードの 最初と最後に格納されます。許される KML レコードフォーマットの完全な記 述はまだ存在しません。 9.5. Last_rcvd ファイル マウントされた InterMezzo ファイルシステムにつき一つの Expect ファイル があります。Expect ファイルは、このホストおよび他のホストの KML ファイ ルへのポインタを保持することにより、このホストが他のホストと同期する方 法についての情報を含みます。この情報はファイルシステム内に格納されるの で、リブートされてもこれは永続性があります。 Expect ファイルはリモートホスト用にそれぞれ四つの情報を持ちます。 1. next_to_expect 私たちに送られることを期待するリモートホストの KML ファイル内の次のレコードへのポインタ。この値で始まらないレコードの 組みを得た場合、メッセージがどこかで落とされ、そのホストとの再交渉 が必要です。これはヒントではありません。 2. next_to_send リモートホストへ送る予定の私たちの KML ファイル内の次 のレコードへのポインタ。データが受信され処理されたことの確認が得ら れた時ではなく、別のホストへデータを送ったらすぐに next_to_send を 進めるので、これは単にヒントです。KML レコードをリモートホストに送 る場合、レコードが私たちの KML のどこにあるかリモートホストに伝える ために、next_to_send の値を送ります (以下の gap を加算します)。 3. confirmed リモートホストが受信および処理したことをまだ確認 (confirmed) していない私たちの KML ファイル内の次のレコードの始まり へのポインタ。これはヒントではありません。 4. gap リモートホストへレコードを送る前に next_to_send に加える調整。 これは、外部的に見えるファイル位置を保持しながら、私たちのローカル KML ファイル内でレコードを前後させます。これはヒントではありませ ん。 9.6. KML および Expect ファイルの正当な変換 一貫性を維持するために、KML および Expect ファイルに対するある特定の変 換だけが許可され、一般にシステムを一貫した状態に確実にしておくため、一 緒にトランザクションを利用して行わなければなりません。 1. KML ファイルにレコードを追加する。これは通常の VFS ファイル操作の最 後に利用される操作です。レコードは KML ファイルに追加され、Expect ファイルに対する修正は行われません。 2. リモートの KML レコードを組込む。ローカル KML ファイルに対する操作 の実行およびレコードの追加に加え、そのホスト向けの next_to_expect を増加します。KML および Expect ファイルを修正します。 3. リモートホストへ KML レコードを送る。KML レコードのブロックは next_to_send から始まる KML ファイルから読まれ、リモートマシンへ送 信されます。next_to_send は読まれたバイト数の分増加されます。KML ファイルのこのセクションの読出しロックを効果的に得ます。 KML は読ま れますが修正されず、Expect ファイルは修正されます。 4. KML 処理の確認を受取る。受信および処理されたレコードのポインタと特 定のバイト数の組みからなる確認をリモートホストから受取ります。これ らのオフセットはリモートホストからなので、そのホスト向けの gap を引 き、次に confirmed ポインタと考えているものと比較し、その後 confirmed ポインタを動かさなければなりません。KML の修正はありませ ん。 5. KML ファイルのセクションを最適化する。最適化するためにセクションの 書込みロックを取得し、セクションの中を読出し、私たちが望む最適化を 実行し、それを再び書込みます。新しく書かれたセクションは前と比べ大 きくなってはならず、より小さい場合、NOP ブロックが新しいセクション の前後の領域を満たすため挿入されます。このセクションが KML ファイル の終わりにある場合、KML ファイルは終わりにある NOP ブロックを削除す ることで切り詰めることができます。その後書込みロックは解放されま す。KML ファイルは修正され、Expect ファイルは修正されません。 6. KML ファイルのセクションを打抜く。削除されるセクションは顕著な読出 しもしくは書込みロックを持ってはならず、その中に NOP レコードを持つ ことだけができます。その後、ファイルシステムのマジックは希薄なファ イルを形成する適切なファイルブロックを解放します。 Expect ファイル は変更されません。 7. KML ファイルの前面を切り詰める。希薄なファイルを形成する代わり に、KML ファイルの始めを削除できます。前記の打抜く操作と同様に、削 除されるセクションは顕著な読出しもしくは書込みロックを持ってはなら ず、NOP 操作だけ持つことができます。その後、ファイルは切詰められ、 すべてのリモートホスト用の gap の値は一つのトランザクション内で調節 されます。 8. KML ファイル内の NOP ブロックをスキップする。 next_to_send と confirm の両ポインタは NOP ブロックの開始を指しているはずです。その 後 next_to_send, confirm, gap のすべてを NOP ブロックの大きさ分増加 できます。変更は KML ファイル内で行なわれません。 10. 連絡先の情報 InterMezzo ウェブサイトは http://www.inter-mezzo.org です。 InterMezzo の一般的な質問は intermezzo-discuss@lists.sourceforge.net に送ることができます。これは、InterMezzo に関連する他のメールリストと 同様に InterMezzo ウェブサイト上でアーカイブされていますので、あなたの 質問が既に答えられたものかどうか確かめるためにここをチェックする価値が あるかもしれません。 バグ報告は sourceforge に提出してください。使用している InterMezzo の バージョン、システム構成の詳細、観察された不具合も添えてください。 さらに、適切なログもすべて添えてください - サーバおよびクライアントの /var/log/messages、(デバッグで実行した) Lento の出力。 11. 日本語訳について 日本語訳は Linux Japanese FAQ Project が行いました。翻訳に関するご意見 は JF プロジェクト 宛に連絡してください。 v1.0.5 翻訳: 野本浩一 校正: 早川 仁さん