hng@ps.ksky.or.jp
)
多くの方々がこの HOWTO に寄与しました。著者は Peter J. Braam, Rob Simmonds, Gordon Matzigkeit, Christopher Li, Shirish Phatak です。
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 ウェブサイト上のソフ トウェアを言及するために、自由に使用することができます。
InterMezzo は フォルダ集合 (folder collection), (別名 ファイルセット (fileset)) のレプリカを管理するファイルシステムです。 フォルダ集合は複数のコンピュータに置くことができます。 InterMezzo はこれらのレプリカに対してなされた変更を記録してログを構築し、 それを他のノードに伝播させることにより、各レプリカを同期された状態に保ちます。 レプリカに対して興味を示したコンピュータはファイルセットの レプリケータ と呼ばれます。InterMezzo にはファイルセットのサーバがひとつ置かれ、 これはレプリケータによる更新のやり取りを管理する役割を果たします。
InterMezzo には 切断時動作 (disconnected operation) があります。 すなわち、InterMezzo はログを管理してすべての更新を覚えておきます。 このログは不通となっていたチャネルが復旧した時に フォワードしなければなりません。 これはベストエフォート型の同期です。 なぜなら切断時動作の間には、設定パラメータでこれを避けるようにしない限り、 更新競合 (conflicting updates) が起こりうるからです。
InterMezzo は全データの記憶領域として、 既存のディスクファイルシステムを使用します。 現時点では ext3 をサポートしていますが、 間もなく ReiserFS と XFS もサポートする予定です。 ext3 フォーマットされたディスクボリュームが、 ファイルシステムタイプ InterMezzo でマウントされると、 InterMezzo ソフトウェアはそのファイルシステムへの すべてのアクセスを管理しはじめます。 InterMewzzo は変更記録のログを管理し、 また接続時動作中の更新競合を回避するために ディスクファイルシステムを変更するための 許可 (permits) をネゴシエーションします。
InterMezzo は、組み込みの簡単なファイル転送機構か、 または rsync プロトコル ( Rsync ウェブサイト を参照してください) を使うことができます。
今のところ、InterMezzo を実行するのは信頼されたネットワーク上に限るべきです - レプリカを使うシステム上のルートユーザは等しく信頼される必要があります。 システムに組込まれた基本的なセキュリティ機構もありますが、これは (root squash のない) NFS のセキュリティと似たようなものです。信頼されたネットワー クを得る良い方法は IPSEC ( FreeSwan を参照)、 CIPE、 SSH トンネルなどを使うことです。SSL ユーティリティの stunnel は再接続を試みる際にデーモンをたくさん生成するので、 多少難しいかもしれません。 POSIX ACL レプリケーションのサポートは 2.2 カーネルには既にあり、2.4 向けもまもなく出ます。 時がたつにつれ、セキュリティは向上するでしょう。
現在このシステムには (Ext3 と組合わせたことによって) ジャーナルリカバリが備わっています。 システムがクラッシュした後、 配布状態の情報を含む KML, LML last_rcvd といったファイルがある ローカルディスクシステムは、自動的に復旧します。 通信先がある場合のリカバリも、普通はシームレスに行われます。
現状システムには競合処理機能はなく、 代わりに悲観的かつ厳格な競合検出のみがあります。 より拡張された競合解決ツールの開発も続けられており、 次のメジャーリリースでは使えるようになると思います。 このシステムの設計では、競合が起きるのは一定の期間 切断時動作が行われたあとに再接続された場合だけで、 かつ競合はクライアントでのみ起こるようになっています。
今のところ、 InterMezzo は全ファイルシステムを複製します。 しかし、オンデマンド取得の機構が将来登場する予定で、 これを使えばファイルシステムの部分的な複製ができるようになるでしょう。 この最初の版は、ファイルデータはオンデマンドで取得しますが、 メタデータ (ディレクトリや inode の全部) は複製することになるでしょう。 メタデータの一部をキャッシュする機構も 将来のバージョンで実装されるかもしれません。
InterMezzo には InterMezzo ファイルシステムを持つカーネルが必要です。 またユーザレベルのファイルサーバ・キャッシュマネージャがあり、 これらは現在 Perl で書かれています。 そして最後に InterMezzo ファイルシステムを作成するユーティリィティがあります。
バージョン 1.0.4 のパッケージは ftp://ftp.inter-mezzo.org:/pub/intermezzo/1.0.4/rh7.1/RPMS から入手できます。 これらのパッケージは RedHat 7.1 システムにクリーンにインストールできるはずです。 2.2 カーネルパッケージか 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
あなたのカーネル向けにカーネルモジュールを生成するには、
あなたのカーネル向けの .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 カーネルでも同じ手順で行います。
デフォルトの設定ディレクトリは /etc/InterMezzo
です。
以下に示す設定ファイルを生成するには、
対話型のコマンドである inconfig
を利用するか、
もしくは手で書きます。
バージョン 1.0 およびそれ以降で使う設定ファイルは、 XML フォーマットを用います (古いバージョンでは Perl フォーマットを用いていました)。
システム名、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 デバイス名が含まれていませんでした。 しかし今ではこのフィールドは必要です。
サーバのデータベースを保持します。 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
を指定しなければなりません。
ファイルセットのデータベースを保持します。 fsetdb 構造体は XML の fileset 要素で、次のようになります。
<fsetdb>
<fileset name="yourfsetname" servername="muskox" fetchtype="bulktype" >
<replicator>clientA</replicator>
<replicator>clientB</replicator>
</fileset>
</fsetdb>
上記には、muskox
が提供する yourfsetname
という名前の
ファイルセットの記述がひとつ書かれています。
このファイルセットはホスト clientA
と clientB
とで複製されます。
fetchtype にはサポートされているバルク転送プログラムの クラス名を与えることができます。 デフォルトは "Rsync" で、 InterMezzo が管理する、より簡単なバルク転送プログラムは "Desc" という名前が付いています。
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
注記:
/etc/fstab
のエントリは一行でなければなりません。以下に示す例でもこれは同じです。ファイル /izo0/.intermezzo/fsetname/kml
には、
InterMezzo ファイルシステム内で行なわれた変更をすべての把握する
kernel modification log (別名 KML
) が含まれます。
ファイル /izo0/.intermezzo/fsetname/last_rcvd
は分散同期ファイルを記録する last_rcvd
ファイルです。
InterMezzo の現行のリリースでは、
InterMezzo ファイルシステムを初めてマウントする前に、KML および
last_rcvd ファイルを作成 (通常 mkizofs
を実行します) する必要があります。
フォーマットには mkizofs ツールを利用します。
mkizofs -r fsetname -j /tmp/cache mkizofs -r fsetname -j /dev/hdaX
-r
オプションの引き数は InterMezzo の複製ログの対象となるルートの
ファイルセット名です。-j
オプションで Ext3 ジャーナルが作成されます。
さらにファイルシステム種別を指定するようなオプションもあります。
これらのオプションについては mkizofs -h
を参照してください。
既にキャッシュファイルシステムが初期化されている場合、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 としてマウントする前には、 これらをレプリケータに手動で複製し、 各ファイルシステムを同一にしなければなりません。
一般的なシステム設定を三つ例にとり、 それぞれでの設定ファイルと、 サーバ/キャッシュマネージャの正しい起動手順とを示します。
この場合、ホスト muskox
がファイルセット shared
を提供し、ホスト
clientA
がファイルセットを複製するものとします。
次のファイルは muskox
と clientA
の両方に置かれます。
<serverdb>
<server name="muskox" ipaddr="192.168.0.3" />
</serverdb>
<fsetdb>
<fileset name="shared" servername="muskox" >
<replicator>clientA</replicator>
</fileset>
</fsetdb>
muskox
でのこのファイルの内容は:
<sysid name="muskox" psdev="/dev/intermezzo0" bindaddr="192.168.0.3" />
clientA
でのこのファイルの内容は:
<sysid name="clientA" psdev="/dev/intermezzo0" bindaddr="192.168.0.20" />
次の行を muskox
と clientA
の両方に追加します。
/tmp/fs0 /izo0 intermezzo loop,fileset=shared,prestodev=/dev/intermezzo0,
mtpt=/izo0,cache_type=ext3,noauto 0 0
このファイルとファイルシステムとを、以下のコマンドをつかって作成します。
dd if=/dev/zero of=/tmp/fs0 bs=1024 count=10k
mkizofs -F /tmp/fs0
上記の 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
これは次のコマンドを使って作成します。
mknod /dev/intermezzo0 c 185 0
chmod 700 /dev/intermezzo0
モジュールの設定ファイルは /etc/modules.conf
かもしれません。
[訳注: conf.modules は obsolete です]
次の行を追加してください。
alias char-major-185 intermezzo
lento を起動する前に、キャッシュをマウントします。
mkdir /izo0; mount /izo0
これで lento を起動できます。muskox
と clientA
の両方で、次を
入力します。
lento
上記の「一つのクライアントと一つのサーバ」の場合と同様です。
<fsetdb>
<fileset name="shared" servername="muskox" >
<replicator>clientA</replicator>
<replicator>clientB</replicator>
</fileset>
</fsetdb>
これは最初の例と同様ですが、clientB がレプリケータのリストに追加されています。
muskox
と clientA
でのこのファイルは最初の例と同様で、
clientB
のものは次のような内容になります。
<sysid name="clientB" psdev="/dev/intermezzo0" bindaddr="192.168.0.21" />
これは、上記の「一つのクライアントと一つのサーバ」の場合で使ったもの と同じです。
誰かここに何か書いていただけませんか?
暗号化されたトンネルの起動 ssh -f -x -L 3333:localhost:2222 -R 3333:localhost:2222
ホスト muskox
上で実行していると仮定します。一つのホスト上で複数の
lento を実行するには ip-alias を使う必要があります。
ip-alias オプション (CONFIG_IP_ALIAS
)
をカーネルに組込んでおかなければなりません。ip-alias は一つ
のインターフェースに複数の IP アドレスを関連付けるものです。名前
muskoxA1
と IP アドレス 192.168.0.100
が利用できるとします。
以下の各ファイルを編集します。
次の行を追加します。
192.168.0.100 muskoxA1
そして次を入力して ip-alias を追加します。
ifconfig eth0:1 muskoxA1 up
次に下記の内容の設定ファイルを二つ作成します。
<sysid name="muskox" psdev="/dev/intermezzo0" bindaddr="192.168.0.3" />
<sysid name="muskoxA1" psdev="/dev/intermezzo1" bindaddr="192.168.0.100" />
後者のファイルは alias された IP アドレス上で実行する lento 用の
sysid
ファイルになります。同じホスト上でクライアントとサーバ
の両方を実行しているので、それぞれに対して /dev/intermezzo0
および
/dev/intermezzo1
という異なるデバイスを指定しなければなら
ないことに注意してください。
<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
このファイルには二つのエントリが必要となります。
/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
今のところ、checkconfig ツールは動作していません。設定チェッ クの XML 版はまだできていません。
設定ファイルの簡単なチェックを行うスクリプトはあります。
config_check
と呼ばれるスクリプトで .../intermezzo/tools
ディレクトリ内にあります。
lento が標準的なシステム id ファイル /etc/intermezzo/sysid
を使
用しているなら、スクリプトは引き数なしで実行できます。異なるシステム id
ファイルを使っているのなら、--idfile=my_idfile
フラグで指定します。
さらに --configdir=my_confdir
フラグを使えば、
/etc/intermezzo
以外の設定ディレクトリを指定できます。
InterMezzo の現行版にはリカバリ機構が組み込まれており、 ほとんどのシステムクラッシュに対応できます。 設定を選ぶことで、競合 (つまりクライアントキャッシュの更新と サーバキャッシュの更新との間の不整合) を回避できます。
しかし、切断時動作の間には、 ファイルシステムをリードオンリーにして明示的に避けるような設定にしていない限り、 競合が起こる可能性はあります。 クライアントとサーバのキャッシュに不整合が生じてしまった場合、 システムを回復するには手動でリカバリを行うしかありません。
手動でのシステムの回復は次のように行えます。
umountizo ; rmmod presto
mount -o loop /tmp/fs0 /izo0
touch /var/intermezzo/SYSID/FSETNAME-synced
例えば、クライアント iclientA
とファイルセット
shared
に対しては次のようになります。
touch /var/intermezzo/iclientA/shared-synced
cp /dev/null /izo0/.intermezzo/shared/kml ;
cp /dev/null /izo0/.intermezzo/shared/last_rcvd
以上の手続きは面倒ですが、ジャーナルによるリカバリも開発中です。
バグの発見しやすくするには、情報を記録することが必要です。ログは二箇所
で発生し、カーネルからのログは /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 ですべてのことが、記録されます。
ログといっしょに、バグが生じた際に行った動作の正確な説明をメールしてくだされば、 なにが起こったかを突き止めることができるでしょう。
../intermezzo/tests
ディレクトリの README ファイルを読ん
でください。これはすべての情報を容易に保存でき、
一台のシステム上でクライアントとサーバを実行します。
InterMezzo は Coda の影響を強く受けており、現在のキャッシュ同期プ ロトコルは Coda がサポートする多くのプロトコルの一つです。すべての状況で 最良とは言えませんが、我々にできる限り簡単なものにしてあります。
InterMezzo ファイルシステムは、ファイルの集合を複数のホスト上で 同期状態に保ちます。各ホストのネイティブファイルシステムの上に位置し、 ファイルシステムに行われた更新を追跡し、その変更を複数のホストの間で 同期できるようにします。 この文書では、InterMezzo がファイルの同期に用いているアーキテクチャと プロトコルを説明します。
InterMezzo はファイルシステム間の非常に緩い一貫性だけを保証します。 ファイルはそれ自体を単位として扱われ、ファイルが書込まれ、クロー ズされるまで変更は伝播されず、あるシステム上の変更が直ちに別のシステムに 反映されるとも限りません。InterMezzo 1.0 ではファイルシステ ム全体が複製され、ある時点においてそのファイルシステムに 書き込みロックをかけられるのはひとつのホストだけです。
Presto は InterMezzo 用のカーネルモジュールです。 Presto は VFS の制御下にある InterMezzo ファイルシステムに 関連するさまざまな動作を実装しており、 Lento と通信するための仮想デバイスを生成します。
Lento はユーザ空間のデーモンで、presto の依頼を受けて ファイル転送やその他のキャッシュ動作を処理します。 マウントされた InterMezzo ファイル システムにつき Lento が一つあります。
マウントされた InterMezzo ファイルシステムにつき一つの KML ファイ ルがあります。KML ファイルはファイルシステムの変更記録を保持します。 全体として見ると、KML ファイルはファイルシステム全体の複製を構築する ためのスクリプトを提供しています。
KML ファイルは一連のバイナリレコードで、その各々はファイルシステム に対する一つの修正を表わします。各レコードは他のレコードと関係がな く閉じており、このためレコードを容易に移動できます。レコードは 可変長で、レコード長さは各レコードの最初と最後に格納されているため、 ファイル中で前後に動かし安くなっています。許される KML レコードフォー マットの完全な記述はまだ存在していません。
マウントされた InterMezzo ファイルシステムにつき一つの Expect ファ イルがあります。Expect ファイルは、このホストおよび他のホストの KML ファイルへのポインタを持ち、このホストが他のホス トと同期する方法に関する情報を保持しています。この情報はファイルシステ ム内に格納されるので、リブートされても永続性があります。
Expect ファイルは各リモートホストに対してそれぞれ四つの情報を持ちます。
一貫性を維持するために、KML ファイルと Expect ファイルは、 ある特定の方法でのみ変換でき、また一般的にはトランザクションを用いて 同時に行わなければなりません。これはシステムが一貫性のある状態に 保たれることを確実にするためです。
InterMezzo ウェブサイトは http://www.inter-mezzo.org
です。
InterMezzo の一般的な質問は
intermezzo-discuss@lists.sourceforge.net
に送ることができます。
これは、InterMezzo に関連する他のメールリストと同様に InterMezzo ウェ
ブサイト上でアーカイブされていますので、ここをチェックして、
あなたの質問が既に答えられたものかどうかを確認するといいでしょう。
バグ報告は sourceforge に提出してください。使用している InterMezzo のバー ジョン、システム構成の詳細、観察された不具合も添えてください。
さらに、適切なログもすべて添えてください - サーバおよびクライアントの /var/log/messages、(デバッグで実行した) Lento の出力。
日本語訳は Linux Japanese FAQ Project が行いました。 翻訳に関するご意見は JF プロジェクト <JF@linux.or.jp> 宛に連絡 してください。
翻訳: 野本浩一 <hng@ps.ksky.ne.jp>
校正: 早川 仁さん <cz@hykw.tv>
このページは中野武雄が上記翻訳をベースに改訂したものです。