4.3. openMosix の一般的な利用上の注意

4.3.1. カーネルのコンパイル

openMosix 用カーネルをコンパイルするには、 http://www.kernel.org/ から基本機能だけを備えた素のカーネルソースをいつも利用するようにしてください。 そばにあるミラーサイトを利用して、カーネルをダウンロードするようにしてください。 そしてカーネルソース全部をダウンロードするのではなく、最新のカーネルソース に対するパッチをダウンロードしてください。こうすることで、Linux コミュニティ に歓迎され、オタクなカルマを大いに積めるでしょう ;-) カーネルバージョンにマッチした正しい openMosix のパッチを必ず使ってください。 これを書いている時点では、2.4 カーネルの最新版は 2.4.20 です。したがって、 openMosix-2.4.20-x.gz パッチをダウンロードするようにしてください。「x」 の部分はリビジョンに該当します(つまりリビジョン番号が大きくなる程、新しく なります)。 Linux ディストリビューション付属のカーネルは使わないようにしてください。 恐らく動かないでしょう。ディストリビューションの作成者が多量にカーネルソース にパッチを当てています。そのようなカーネルに openMosix のパッチを適用すると 間違いなく失敗するでしょう。私はあれこれやってきました。信じてください ;-)

実際に openMosix パッチをダウンロードしたら、カーネルソースのあるディレクトリ に移してください(たとえば、/usr/src/linux-2.4.20)。カーネルソースの ディレクトリが「/usr/src/linux-[version_number]」という形式でなければ、 少なくとも「/usr/src/linux-[version_number]」にシンボリックリンクを張って ください。 root ユーザなら gzip されたパッチはホームディレクトリにダウンロードして います。patch ユーティリティ(何だと思います?)を使ってパッチを当ててください。
mv /root/openMosix-2.4.20-2.gz /usr/src/linux-2.4.20
cd /usr/src/linux-2.4.20
zcat openMosix-2.4.20-2.gz | patch -Np1
まれにシステムで「zcat」が無い場合があります。その時は下記のように してください。
mv /root/openMosix-2.4.20-2.gz /usr/src/linux-2.4.20
cd /usr/src/linux-2.4.20
gunzip openMosix-2.4.20-2.gz
cat openMosix-2.4.20-2 | patch -Np1
もっと変な環境だとシステムに「cat」がありません!
mv /root/openMosix-2.4.20-2.gz /usr/src/linux-2.4.20
cd /usr/src/linux-2.4.20
gunzip openMosix-2.4.20-2.gz
patch -Np1 < openMosix-2.4.20-2
「patch」コマンドは、カーネルソースに当てるパッチファイルの一覧を表示する はずです。 自分が大胆な方だと思うなら、カーネル設定ファイルにある openMosix 関連の オプションを有効にしてください。
...
CONFIG_MOSIX=y
# CONFIG_MOSIX_TOPOLOGY is not set
CONFIG_MOSIX_UDB=y
# CONFIG_MOSIX_DEBUG is not set
# CONFIG_MOSIX_CHEAT_MIGSELF is not set
CONFIG_MOSIX_WEEEEEEEEE=y
CONFIG_MOSIX_DIAG=y
CONFIG_MOSIX_SECUREPORTS=y
CONFIG_MOSIX_DISCLOSURE=3
CONFIG_QKERNEL_EXT=y
CONFIG_MOSIX_DFSA=y
CONFIG_MOSIX_FS=y
CONFIG_MOSIX_PIPE_EXCEPTIONS=y
CONFIG_QOS_JID=y
...
しかし Linux カーネル設定ツールのどれかを使えば、上記のオプションの設定 はとても簡単になります。
make config | menuconfig | xconfig
上記は「config」、「menuconfig」、「xconfig」のどれかを選ぶという意味 です。これは好みの問題です。ただ「config」はどんなシステムでも動作 します。「menuconfig」は curses ライブラリがインストールされている ことが必要で、「xconfig」は X Window System の環境に TCL/TK ライブラリとその インタプリタが必要になります。

では、コンパイルしてみましょう。
make dep bzImage modules modules_install
コンパイルが終わったら、新しいカーネルに openMosix のオプションをつけて ブートローダに設定してください。例えば /etc/lilo.conf に新しいカーネル のエントリを入れて、lilo を実行します。

リブートすれば openMosix クラスタのノードが起動します。

4.3.2. /etc/openmosix.map ファイルの書き方

openMosix を動かす前に /etc/openmosix.map 設定ファイルがなければ いけません。このファイルはどのノードでも共通でなければいけません。

標準的な場所は /etc/openmosix.map です。/etc/mosix.map と /etc/hpc.map は以前の標準でした。しかし CVS バージョンのツールでは、下位互換から /etc/openmosix.map、/etc/mosix.map、/etc/hpc.map(この順序で)を検索します。

openmosix.map ファイルには、空白で区切られたフィールドが 3 つあります。
openMosix-Node_ID               IP-Address(or hostname)          Range-size
openmosix.map ファイルの例はこのようになります。
1       node1   1
2       node2   1
3       node3   1
4       node4   1
もしくは
1       192.168.1.1     1
2       192.168.1.2     1
3       192.168.1.3     1
4       192.168.1.4     1
もしくは範囲指定を利用すれば、上記と下記は同じになります。
1       192.168.1.1     4
openMosix は openMosix-Node_ID を元に、ノードの IP アドレスの最終バイトを 数え上げます。1 より大きな範囲指定をするなら、当たり前ですがホスト名のかわり に IP アドレスを使わなければいけません。

ノードに複数のネットワークインタフェースがあるなら、範囲指定のオプションを 入れるフィールドに ALIAS オプションを使って設定を入れられます(範囲指定に 0 を設定したのと同じです)。
1       192.168.1.1     1
2       192.168.1.2     1
3       192.168.1.3     1
4       192.168.1.4     1
4       192.168.10.10   ALIAS
この図で openMosix-Node_ID が 4 のノードは、ネットワークインタフェースを 2 つ持っていて(192.168.1.4 と 192.168.10.10)、このインタフェースは openMosix から両者とも見えます。

openMosix のバージョンは同じバージョンにすること、そしてクラスタに属する ノードの設定も同じにすること、いつも必ずこうしてください

「setpe」ユーティリティを使って openMosix を各ノードで起動してください。
setpe -w -f /etc/openmosix.map
openMosix クラスタに属するすべてのノードで、このコマンド(後ほどこの HOWTO で説明します)を実行してください。

一方、ユーザ空間で動くツールがあるディレクトリに存在する「openmosix」 スクリプトを利用する手もあります。/etc/init.d ディレクトリにコピーし、 chmod 0755 してから root になって下記のコマンドを使ってください。
/etc/init.d/openmosix stop
/etc/init.d/openmosix start
/etc/init.d/openmosix restart

これでインストールは終了です。クラスタが立ち上がり、動作しています :)

4.3.3. oMFS

まずカーネル設定にある CONFIG_MOSIX_FS オプションを有効にしなければ いけません。現在のカーネルがこのオプションなしにコンパイルしてあるなら、 オプションを有効にしてから再コンパイルしてください。

クラスタに属する各ノードにあるファイルシステムの UID(ユーザ ID)と GID (グループ ID)は同じでなければいけません。これを実現するために、openldap を使うのもいいかもしれません。カーネルの CONFIG_MOSIX_DFSA オプションは オプションですが、DFSA を使うのならもちろん必要です。 クラスタ上の oMFS をマウントするには、各ノードの /etc/fstab に項目を追加 する必要があります。

DFSA を有効にするには、
mfs_mnt         /mfs            mfs     dfsa=1          0 0
DFSA を無効にするには、
mfs_mnt          /mfs           mfs     dfsa=0          0 0
fstab のエントリの書き方は、
[device_name]           [mount_point]   mfs     defaults        0 0
です。 各ノードのマウントポイントである /mfs をマウントすると、各ノードのファイル システムは /mfs/[openMosix-Node_ID]/ ディレクトでアクセス可能です。

シンボリックリンクを利用すれば、クラスタに属する全てのノードから同じデータを アクセスできるようになります。例えば node1 の /work は下記のようになります。
on node2 :      ln -s /mfs/1/work /work
on node3 :      ln -s /mfs/1/work /work
on node3 :      ln -s /mfs/1/work /work
...
これで /work に対してどのノードからでも読み書きができます。

下記の特殊ファイルは oMFS からは外されています。

リンクを張るには、
ln -s /mfs/1/mfs/1/usr         
もしくは、
ln -s /mfs/1/mfs/3/usr
が正しいやり方です。

下記のシステムコールをサポートしています。マイグレートされたプロセス (このシステムコールをそのホーム(リモート)ノードで実行する)をホームノード に戻さなくても結構です。

read, readv, write, writev, readahead, lseek, llseek, open, creat, close, dup, dup2, fcntl/fcntl64, getdents, getdents64, old_readdir, fsync, fdatasync, chdir, fchdir, getcwd, stat, stat64, newstat, lstat, lstat64, newlstat, fstat, fstat64, newfstat, access, truncate, truncate64, ftruncate, ftruncate64, chmod, chown, chown16, lchown, lchown16, fchmod, fchown, fchown16, utime, utimes, symlink, readlink, mkdir, rmdir, link, unlink, rename

DFSA でマウントしたファイルシステム上で、システムコールがうまく動かないケース を挙げます。

/mfs/1/、/mfs/2/ と続くファイルの他にも、さらにディレクトリが存在します。

マジックファイルは、すべて「プロセス単位」である点を忘れないでください。 つまりどのプロセスがオープンしているかによって、中身が変わります。

最後に openMFS についてではないのですが、このファイルシステム上で "df" を動かした時に、失敗するバージョンが存在することをお伝え します。そのシステムで突如 1.3 TB 使えるようになっても、あわてないでください。