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 |
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 |
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 |
... 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 ... |
make config | menuconfig | xconfig |
では、コンパイルしてみましょう。
make dep bzImage modules modules_install |
リブートすれば openMosix クラスタのノードが起動します。
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 |
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 |
ノードに複数のネットワークインタフェースがあるなら、範囲指定のオプションを 入れるフィールドに 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 のバージョンは同じバージョンにすること、そしてクラスタに属する ノードの設定も同じにすること、いつも必ずこうしてください。
「setpe」ユーティリティを使って openMosix を各ノードで起動してください。
setpe -w -f /etc/openmosix.map |
一方、ユーザ空間で動くツールがあるディレクトリに存在する「openmosix」 スクリプトを利用する手もあります。/etc/init.d ディレクトリにコピーし、 chmod 0755 してから root になって下記のコマンドを使ってください。
/etc/init.d/openmosix stop /etc/init.d/openmosix start /etc/init.d/openmosix restart |
これでインストールは終了です。クラスタが立ち上がり、動作しています :)
まずカーネル設定にある CONFIG_MOSIX_FS オプションを有効にしなければ いけません。現在のカーネルがこのオプションなしにコンパイルしてあるなら、 オプションを有効にしてから再コンパイルしてください。
クラスタに属する各ノードにあるファイルシステムの UID(ユーザ ID)と GID (グループ ID)は同じでなければいけません。これを実現するために、openldap を使うのもいいかもしれません。カーネルの CONFIG_MOSIX_DFSA オプションは オプションですが、DFSA を使うのならもちろん必要です。 クラスタ上の oMFS をマウントするには、各ノードの /etc/fstab に項目を追加 する必要があります。
DFSA を有効にするには、
mfs_mnt /mfs mfs dfsa=1 0 0 |
mfs_mnt /mfs mfs dfsa=0 0 0 |
[device_name] [mount_point] mfs defaults 0 0 |
シンボリックリンクを利用すれば、クラスタに属する全てのノードから同じデータを アクセスできるようになります。例えば 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 ... |
下記の特殊ファイルは oMFS からは外されています。
/proc ディレクトリ
通常ファイルやディレクトリではないスペシャルファイル。 もしくは、シンボリックリンク(例えば /dev/hda1)
リンクを張るには、
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 や dfsa の設定が異なる。
dup2 で 2 番目のファイルポインタが DFSA ではない場合。
chdir や fchdir をして、親ディレクトリが DFSA でない場合。
DFSA ファイルシステムではないパス名。
システムコールを実行するプロセスがトレースされている。
システムコールを実行するプロセスに対して、待ち状態の リクエストがある。
/mfs/1/、/mfs/2/ と続くファイルの他にも、さらにディレクトリが存在します。
Table 4-1. その他のディレクトリ
/mfs/here | プロセスが動作している現在のノード。 |
/mfs/home | ホームノード。 |
/mfs/magic | 「create」システムコール(もしくは「open」で「O_CREAT」オプション 使う)が使った現在のノード。もしくは、oMFS マジックファイルの作成に成功 した最新のノード(テンポラリファイルを作成してすぐ削除するのに便利)。 |
/mfs/lastexec | プロセスが「execve」システムコールを最後に成功させたノード。 |
/mfs/selected | プロセス自身もしくはその親プロセス(このプロセスを fork する前) が選択したノード。「/proc/self/selected」に番号を書く。 |
マジックファイルは、すべて「プロセス単位」である点を忘れないでください。 つまりどのプロセスがオープンしているかによって、中身が変わります。
最後に openMFS についてではないのですが、このファイルシステム上で "df" を動かした時に、失敗するバージョンが存在することをお伝え します。そのシステムで突如 1.3 TB 使えるようになっても、あわてないでください。