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. はじめに

4. InterMezzo のインストール

5. InterMezzo の設定

6. 競合からのリカバリ

7. デバッグ

8. テストとデバッグにテストフレームワークを使用する

9. InterMezzo はどのように動作しますか?

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 のパッケージは ftp://ftp.inter-mezzo.org:/pub/intermezzo/1.0.4/rh7.1/RPMS から入手できます。 これらのパッケージは 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 のファイルは次のようになるでしょう。

<sysid name="muskox" psdev="/dev/intermezzo0" bindaddr="192.168.0.3" />

InterMezzo の初期バージョンでは、 このファイルに presto デバイス名が含まれていませんでした。 しかし今ではこのフィールドは必要です。

/etc/intermezzo/serverdb

サーバのデータベースを保持します。 server 構造体は XML の server 要素で、次のようになります。

<serverdb>
  <server name="muskox" ipaddr="192.168.0.3" port="2222" 
    bindaddr="192.168.0.3" />
</serverdb>

上記は IP アドレスが 192.168.0.3 である、サーバ muskox のサーバ記述がひとつ書かれています。 port および bindaddr の記述は省略できます (デフォルトのポートは 2222 です)。bindaddr の記述のないサーバは、 すべてのインターフェースで要求を待ち (listen) ます。 記述のあるサーバは bindaddr のアドレスだけで待ちます。 クライアントとサーバの両方を同じシステムで実行している場合は、 サーバとクライアントとで異なる bindaddr を指定しなければなりません。

/etc/intermezzo/fsetdb

ファイルセットのデータベースを保持します。 fsetdb 構造体は XML の fileset 要素で、次のようになります。

<fsetdb>
<fileset name="yourfsetname" servername="muskox" fetchtype="bulktype" >
<replicator>clientA</replicator>
<replicator>clientB</replicator>
</fileset>
</fsetdb>

上記には、muskox が提供する yourfsetname という名前の ファイルセットの記述がひとつ書かれています。 このファイルセットはホスト clientAclientB とで複製されます。

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

注記:

他のファイル

ファイル /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 三つの一般的な設定

一般的なシステム設定を三つ例にとり、 それぞれでの設定ファイルと、 サーバ/キャッシュマネージャの正しい起動手順とを示します。

一つのクライアントと一つのサーバ(典型的な利用法: ラップトップ-デスクトップ、バックアップ、二つのウェブサーバの同期)

この場合、ホスト muskox がファイルセット shared を提供し、ホスト clientA がファイルセットを複製するものとします。 次のファイルは muskoxclientA の両方に置かれます。

/etc/intermezzo/serverdb

<serverdb>
  <server name="muskox" ipaddr="192.168.0.3" />
</serverdb>

/etc/intermezzo/fsetdb

<fsetdb>
<fileset name="shared" servername="muskox" >
<replicator>clientA</replicator>
</fileset>
</fsetdb>

/etc/intermezzo/sysid

muskox でのこのファイルの内容は:

<sysid name="muskox" psdev="/dev/intermezzo0" bindaddr="192.168.0.3" />
clientA でのこのファイルの内容は:
<sysid name="clientA" psdev="/dev/intermezzo0" bindaddr="192.168.0.20" />

/etc/fstab

次の行を muskoxclientA の両方に追加します。

/tmp/fs0 /izo0 intermezzo loop,fileset=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 を起動できます。muskoxclientA の両方で、次を 入力します。

lento

二つのクライアントと一つのサーバ (典型的な利用方: 二つのリモートオフィス)

/etc/intermezzo/serverdb

上記の「一つのクライアントと一つのサーバ」の場合と同様です。

/etc/intermezzo/fsetdb

<fsetdb>
<fileset name="shared" servername="muskox" >
<replicator>clientA</replicator>
<replicator>clientB</replicator>
</fileset>
</fsetdb>

これは最初の例と同様ですが、clientB がレプリケータのリストに追加されています。

/etc/intermezzo/sysid

muskoxclientA でのこのファイルは最初の例と同様で、 clientB のものは次のような内容になります。

<sysid name="clientB" psdev="/dev/intermezzo0" bindaddr="192.168.0.21" />

/etc/fstab

これは、上記の「一つのクライアントと一つのサーバ」の場合で使ったもの と同じです。

IPSec および ssh トンネルの利用

誰かここに何か書いていただけませんか?

暗号化されたトンネルの起動 ssh -f -x -L 3333:localhost:2222 -R 3333:localhost:2222

同じホスト上での一つのクライアントと一つのサーバ (典型的な利用法: 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

<sysid name="muskox" psdev="/dev/intermezzo0" bindaddr="192.168.0.3" />

/etc/intermezzo/sysid.muskoxA1

<sysid name="muskoxA1" psdev="/dev/intermezzo1" bindaddr="192.168.0.100" />

後者のファイルは alias された IP アドレス上で実行する lento 用の sysid ファイルになります。同じホスト上でクライアントとサーバ の両方を実行しているので、それぞれに対して /dev/intermezzo0 および /dev/intermezzo1 という異なるデバイスを指定しなければなら ないことに注意してください。

/etc/intermezzo/fsetdb

<fsetdb>
<fileset name="shared" servername="muskox" >
<replicator>muskoxA1</replicator>
</fileset>
</fsetdb>

二番目の 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 プロジェクト <JF@linux.or.jp> 宛に連絡 してください。

v1.0.5

翻訳: 野本浩一 <hng@ps.ksky.ne.jp>

校正: 
早川 仁さん <cz@hykw.tv>

このページは中野武雄が上記翻訳をベースに改訂したものです。


sgml21html conversion date: 2003年 8月 1日 金曜日 18:58:05 JST