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 の使用もしくは実験を行う場合には、デー タはすべてバックアップしてください。 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)) のレプリカを管理するファイルシステムです。フォルダ集合は複 数のコンピュータに置くことができます。 InterMezzo はこれらのレプリカに 対してなされた変更を記録してログを構築し、それを他のノードに伝播させる ことにより、各レプリカを同期された状態に保ちます。レプリカに対して興味 を示したコンピュータはファイルセットのレプリケータと呼ばれま す。InterMezzo にはファイルセットのサーバがひとつ置かれ、これはレプリ ケータによる更新のやり取りを管理する役割を果たします。 InterMezzo には 切断時動作 (disconnected operation) があります。すなわ ち、InterMezzo はログを管理してすべての更新を覚えておきます。このログ は不通となっていたチャネルが復旧した時にフォワードしなければなりませ ん。これはベストエフォート型の同期です。なぜなら切断時動作の間には、設 定パラメータでこれを避けるようにしない限り、更新競合 (conflicting updates) が起こりうるからです。 InterMezzo は全データの記憶領域として、既存のディスクファイルシステム を使用します。現時点では ext3 をサポートしていますが、間もなく ReiserFS と XFS もサポートする予定です。 ext3 フォーマットされたディス クボリュームが、ファイルシステムタイプ InterMezzo でマウントされると、 InterMezzo ソフトウェアはそのファイルシステムへのすべてのアクセスを管 理しはじめます。 InterMewzzo は変更記録のログを管理し、また接続時動作 中の更新競合を回避するためにディスクファイルシステムを変更するための許 可 (permits) をネゴシエーションします。 InterMezzo は、組み込みの簡単なファイル転送機構か、または rsync プロト コル (Rsync ウェブサイト を参照してください) を使うことができます。 3.2. バージョン1.0.4での制限 セキュリティ 今のところ、InterMezzo を実行するのは信頼されたネットワーク上に 限るべきです - レプリカを使うシステム上のルートユーザは等しく信 頼される必要があります。システムに組込まれた基本的なセキュリティ 機構もありますが、これは (root squash のない) NFS のセキュリティ と似たようなものです。信頼されたネットワークを得る良い方法は IPSEC (FreeSwan を参照)、 CIPE 、 SSH トンネ ルなどを使うことです。SSL ユーティリティの stunnel は再接続を試 みる際にデーモンをたくさん生成するので、多少難しいかもしれませ ん。 POSIX ACL レプリケーションのサポートは 2.2 カーネルには既に あり、2.4 向けもまもなく出ます。時がたつにつれ、セキュリティは向 上するでしょう。 リカバリ 現在このシステムには (Ext3 と組合わせたことによって) ジャーナル リカバリが備わっています。システムがクラッシュした後、配布状態の 情報を含む KML, LML last_rcvd といったファイルがあるローカルディ スクシステムは、自動的に復旧します。通信先がある場合のリカバリ も、普通はシームレスに行われます。 競合の扱い 現状システムには競合処理機能はなく、代わりに悲観的かつ厳格な競合 検出のみがあります。より拡張された競合解決ツールの開発も続けられ ており、次のメジャーリリースでは使えるようになると思います。この システムの設計では、競合が起きるのは一定の期間切断時動作が行われ たあとに再接続された場合だけで、かつ競合はクライアントでのみ起こ るようになっています。 オンデマンド取得 今のところ、 InterMezzo は全ファイルシステムを複製します。しか し、オンデマンド取得の機構が将来登場する予定で、これを使えばファ イルシステムの部分的な複製ができるようになるでしょう。この最初の 版は、ファイルデータはオンデマンドで取得しますが、メタデータ ( ディレクトリや inode の全部) は複製することになるでしょう。メタ データの一部をキャッシュする機構も将来のバージョンで実装されるか もしれません。 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 およびそれ以降で使う設定ファイルは、 XML フォーマットを 用います (古いバージョンでは Perl フォーマットを用いていました)。 /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 ファイルセットのデータベースを保持します。 fsetdb 構造体は XML の fileset 要素で、次のようになります。 clientA clientB 上記には、muskox が提供する yourfsetname という名前のファイルセット の記述がひとつ書かれています。このファイルセットはホスト clientA と clientB とで複製されます。 fetchtype にはサポートされているバルク転送プログラムのクラス名を与 えることができます。デフォルトは "Rsync" で、 InterMezzo が管理す る、より簡単なバルク転送プログラムは "Desc" という名前が付いていま す。 /etc/fstab InterMezzo ファイルセットのマウントを簡単にするには、下記に示す うちのどれかひとつを /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 はファイルセット の名前、/dev/intermezzo0 は presto デバイス名です。キャッシュファイ ルと presto デバイスの作成方法は、このセクションの終わりに例示して 説明します。このようにするには、loopback device support を有効にし てカーネルをビルドしなければなりません。 注記: マウントオプション data=journal は、 ext3 のバグが修正されて いない 2.4 カーネルでは重要です。 純粋なブロックデバイスを利用すれば、ループデバイスの設定が不要なの で、作業はもう少し簡単です。ブロックデバイス /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 マウントポイントはオプションの中で明示的に渡す必要があります (mount の将来のバージョンでは、これは必要なくなるでしょう)。 他のファイル ファイル /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 の複製ログの対象となるルートのファ イルセット名です。-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 ファイルシステムにループバックデバイスを利 用し、ファイルセットの名前は fsetname と仮定しています。 これらを InterMezzo としてマウントする前には、これらをレプリケータに手 動で複製し、各ファイルシステムを同一にしなければなりません。 5.4. 三つの一般的な設定 一般的なシステム設定を三つ例にとり、それぞれでの設定ファイルと、サーバ /キャッシュマネージャの正しい起動手順とを示します。 5.4.1. 一つのクライアントと一つのサーバ (典型的な利用法: ラップトッ プ-デスクトップ、 バックアップ、二つのウェブサーバの同期) この場合、ホスト muskox がファイルセット shared を提供し、ホスト clientA がファイルセットを複製するものとします。次のファイルは 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 かもしれません。 [ 訳注: conf.modules は obsolete です] 次の行を追加してください。 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 がレプリケータのリストに追加さ れています。 /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- 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 の現行版にはリカバリ機構が組み込まれており、ほとんどのシス テムクラッシュに対応できます。設定を選ぶことで、競合 (つまりクライアン トキャッシュの更新とサーバキャッシュの更新との間の不整合) を回避できま す。 しかし、切断時動作の間には、ファイルシステムをリードオンリーにして明示 的に避けるような設定にしていない限り、競合が起こる可能性はあります。ク ライアントとサーバのキャッシュに不整合が生じてしまった場合、システムを 回復するには手動でリカバリを行うしかありません。 手動でのシステムの回復は次のように行えます。 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 はファイルセットの名前で 置き換えてください。 touch /var/intermezzo/SYSID/FSETNAME-synced 例えば、クライアント iclientA とファイルセット shared に対しては次 のようになります。 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 を再起動します。 以上の手続きは面倒ですが、ジャーナルによるリカバリも開発中です。 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 用のカーネルモジュールです。 Presto は 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 リモートホストから受信・処理の確認が返ってきていない、自 分の 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 レコードのブロックが KML ファイルの next_to_send から始まる位置から読み込まれ、リモートマシ ンへ送信されます。 next_to_send を読み込んだバイト数だけ増加しま す。実効的に KML ファイルのこのセクションをリードロックします。 KML ファイルは読まれますが修正されず、Expect ファイルは修正されます。 4. KML 処理の確認を受取る。与えた位置から始まり、特定オンバイ都庁をも つレコードのセットを受信・処理した旨の確認をリモートホストから受け とります。これらのオフセットはリモートホストからのものなので、その ホストの gap を引き、次に confirmed ポインタとみなされているものと 比較し、その後 confirmed ポインタを動かします。KML ファイルの修正は ありません。 5. KML ファイルのセクションを最適化する。最適化するためにセクションの 書込みロックを取得し、セクションを読出し、必要な最適化を実行し、そ れを再び書込みます。新しく書かれたセクションは前と比べ大きくなって はならず、小さくなった場合は、新しいセクションの前後の領域を満たす ために NOP ブロックが挿入されます。このセクションが KML ファイルの 終わりにある場合は、KML ファイルを切り詰めて末尾の NOP ブロックを削 除できます。その後書込みロックを解放します。 KML ファイルは修正さ れ、Expect ファイルは修正されません。 6. KML ファイルのセクションを打抜く。削除されるセクションには読出し・ 書込みのロックがあってはならず、その内部には NOP レコード以外があっ てはなりません。続いてファイルシステムの魔法が発動し、適切なファイ ルブロックを解放して、疎 (sparse) なファイルを作ります。 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 翻訳: 野本浩一 校正: 早川 仁さん このページは中野武雄が上記翻訳をベースに改訂したものです。