Home Wolfchen Project

Wolfchen = Small +Diskless+ Beowulf Cluster

Plamo Linux 4.01 を使って一家に一組科学計算用並列計算機(PCクラスタ)を!

著者: 西松 毅 <t-nissie{at}imr.tohoku.ac.jp>

最終更新日: 2005-06-01

概要

サーバ1台, クライアント数台からなる科学計算用並列計算機 (Beowulf PC クラスタ) の構築手順を述べる. クライアントをディスクドライブを一切持た ない構成(diskless) とすることにより, アプリケーションの管理や更新の 手間を削減し, また, クライアントの故障率を低減させる. diskless化には PXEとPXELINUXを用いる (Intel PRO/100 などPXEに対応しているネット ワーク・インターフェース・カード (NIC) をクライアントで用いる). PXE とPXELINUXを用ずにフロッピーディスクでクライアントをブートする簡便な 方法についても述べる (たいていのNICが利用可能). OS として GNU/Linux ディストリビューションのひとつ Plamo Linux 4.01 を用いる. wolfchen.tgz というパッケージを用意したので短時間で容易にPCクラスタ の構築が可能である. なお, 本文章の最新版は <URL:http://www-lab.imr.tohoku.ac.jp/%7Et-nissie/computer/wolfchen/doc/HomeWolfchenProject.html> から入手できる.

Figure: Configuration of the PC cluster

はじめに

第一原理分子動力学計算や流体のシミュレーションなど大規模科学技術計算を行うため の計算機として, 数台〜数百台のPCにより構築した並列計算機 (Beowulf PCクラスタ) がここ数年注目を集めている. PC本体はもとより, ハードデスクやネットワーク機器 などの高容量化, 高速化, 高性能化, そして低価格化のスピードはすさまじく, 高性 能の並列計算機を安価に導入することが可能になってきたからである. 最近はPCクラス タ構築のためのPC UNIXをはじめとするフリーソフトウェアやノウハウ, 情報がWeb上 にたくさん公開されており, さらにとっつきやすくなってきている. 反面, ネットワー クセキュリティを保つためのコスト, 情報の取捨選択のためのコスト, コンピュータを 管理するための人件費と教育費は増大してきている. そこでこの文章では後々の管理が 容易な diskless PC クラスタを短時間で構築する手順を最初から最後まで解説する.

OSとしてGNU/Linuxディストリビューションのひとつ Plamo Linux 4.01 を用いる. Plamo Linux で PCクラスタを構築するための wolfchen.tgz というソフトウエア ・パッケージを用意した. このパッケージに含まれるスクリプトを使えばPCクラスタ の構築と管理が劇的に容易になる. なお, このパッケージ名やこの企画「Wolfchen Project」は「小さなBeowulfクラスタを作るひとりで勝手にプロジェクト」という ような意味でつけた.

クライアントを diskless化 (diskless boot) する利点は次のとおり:

しかしながら, 欠点としては

などがある.

この文章の残りの部分の構成はつぎのとおり: IndexGlossary の後, Server and Clients で これから構築しようとしている計算機クラスタを構成するPC3台を紹介する. wolfchen.tgzパッケージではこの パッケージに含まれるディレクトリとファイルについて解説する. 作業工程1: サーバの構築で 1台のPCをDHCPサーバ, NFSサーバ, NISサーバとして構築する. 必要ならゲートウェイの機能も持たせる. 作業工程2: disklessクライアント用 root directory の構築の工程で, サーバの/diskless以下にクライアント用 root directory を構築する. 作業工程3: とりあえずフロッピーディスクでブートの作業で, とりあえずクライアントはフロッピーディスクでブートできるようになる. すべてのクライアントに共通なブートフロッピーディスクを用いることはできな くなるが, クライアント毎にブートフロッピーディスクの中のファイルを書き換 えることによりDHCPサーバを立てずに済ます方法についても言及する. 作業工程4: PXEを使って完全無ディスク化では diskless boot をめざす. もし「完全無ディスク化」にこだわらないのであれば, この作業は飛ばしてかまわない. 作業工程5: 詳細設定では, syslog, postfix, sshなどの設定を行ない, セキュリティや住環境(?)の強化を図る. 作業工程6: 科学計算用のソフトウエアのインストールでは 並列ライブラリMPICHなどをインストールし, このクラスタで並列科学計算などができるようにする. 作業工程7: 日々の管理作業で科学計算機クラスタを構築後, 日々行なうべき作業や注意すべき点を上げる. トラブル・シューティングでは, うまくいかなかった場合の解決方法をいくつか紹介する. やり残している作業では, Batch Queueing System など, 科学計算機クラスタとしてある方が便利だが今のところ その構築やインストールがうまくできていない機能とその要件を紹介する. 最後にまとめでこの文章をまとめる.

文中, 参考文献は[ ]で示し参考文献, URL等に詳細を記した. 例示用の ドメインとして example.com を本クラスタ用のドメインとして, example.net を Broadband Modem を介してつながっているInternet Service Provider (ISP) のドメインとして用いている. インタラクティブ・シェルとしてBourne shell系の bash(1)などを使うことを仮定し, 文中のシェルのコマンドライン入力のプロンプト を, 一般ユーザのものは$, スーパーユーザのものは#で示した. C shell系のcsh(1) またはtcsh(1)を使う場合は

bash$ ROOT=willow ./mknfsroot.sh

tcsh% env ROOT=willow ./mknfsroot.sh

などと読みかえること.

Index

Glossary

WOL
PXE
Preboot Execution Environment [PXE]. Intelの云々.
DHCP

Server and Clients

サーバ1台, クライアント2台からなるPCクラスターを構成する各PCの hostname, 役割, 仕様は次の通り. サーバはかなりの年代物.

eringi, server and gateway to Internet

MotherBoard	ASUS P/I-XP55T2P4 (Intel 430HX Chipset)
CPU           AMD K6 200 MHz
Memory        96 MB
NIC           eth0 (Internet) RTL-8029 (ne2k-pci driver)
              eth1 (LAN)      RTL-8139 (8139too  driver)
HDD           3 GB (for /), 8 GB (for /home)
FDD           あり
CD-ROM        あり
Video         Matrox Graphics, Inc. MGA 2164W [Millennium II]
OS            Plamo Linux 4.01

willow, client1

MotherBoard   ACORP 6PLEF (Apollo PLE133 Chipset)
CPU           Intel Celeron Coppermine 1.1 GHz (128 KB cache)
Memory        640 MB (FSB 100MHz)
NIC           Intel Ethernet Pro 100 (e100 driver)
              On-board RTL-8139 is not used.
HDD           なし
FDD           なし
CD-ROM        なし

zinnia, client2

MotherBoard   ASUS TUSC (Terminator TU Barebone Case, SiS 630ET Chipset)
CPU           Intel Celeron Tualatin 1.0 GHz (256 KB cache)
Memory        1024 MB (FSB 100MHz)
NIC           On-board SiS 900 (PXE boot is enabled by the BIOS configuration)
HDD           なし
FDD           あり
DVD-ROM       RICOH DVD/CDRW MP9060, ATAPI CD/DVD-ROM drive

/etc/hosts

各PCとも/etc/hostsはこんなかんじ:

# For loopbacking.
127.0.0.1       localhost
# In LAN
192.168.1.1     eringi.example.com eringi
192.168.1.136   willow.example.com willow
192.168.1.137   zinnia.example.com zinnia
# End of hosts.

wolfchen.tgzパッケージ

<URL:http://www-lab.imr.tohoku.ac.jp/%7Et-nissie/computer/wolfchen/wolfchen.tgz> から入手できる. ただしこのwolfchen.tgzパッケージの利用に際しては, 完全に無保証であることに留意すること. wolfchen.tgzをインストール しても, 既存の設定ファイルや実行形式は置き換わらないようにはなっ ているはず.

# tar ztvf somewhere/wolfchen.tgz

と, どんなファイルがインストールされるのかを確認してから,

# installpkg somewhere/wolfchen.tgz

と, サーバに実際にインストールする. PXE bootのためののディレクトリ /tftpbootと, nfsrootのためのディレクトリ/disklessとが作成される. このwolfchen.tgzパッケージの肝は/diskless/mknfsroot.shと /diskless/clients-initialconfig.sh (clients-fileconfig.sh, clients-ldconfig.sh, clients-netconfig.sh, clients-timeconfig.sh, clients-lpdspool.shはそのシンボリックリンク) の2つの shell script である. これらのshell script によりクライアント用のルート・ディレ クトリを管理する.

実をいえば, このPCクラスタを構築するために新しく書いたのはこの 2つの小さな shell script だけで, 他はすべて既存の技術の寄せ合 わせである. それにもかかわらずおおげさなプロジェクト名をつけて しまうのが人間の悲しい性である.

PXEブートの概観

PXE の Client/Sever Protocol と linux-2.6.x/net/ipv4/ipconfig.c の 自動 Automatic Configuration of IP

作業工程1: サーバの構築

eringi に Plamo Linux 4.01 をインストール

KDEやcontribを後からインストールするなら, 1枚目のCDイメージだけで十分. インストールは普通に, 適当に.

eringi で dhcpd (DHCP server) を起動

ISC DHCP (現時点の最新版は version 3.0.1) をインストール.

eringi:/etc/dhcpd.conf は次のように書く.

+++ dhcpd.conf ここから +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ddns-update-style ad-hoc;
default-lease-time 600;
max-lease-time 7200;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.1.255;
option routers 192.168.1.1;
option domain-name-servers 192.168.0.1;
option domain-name "example.com";

subnet 192.168.1.0 netmask 255.255.255.0 {
}

group {
        use-host-decl-names on;
        next-server 192.168.1.1;
        filename "/tftpboot/pxelinux.0";

        host willow {
        hardware ethernet XX:XX:XX:XX:XX:XX;
        option root-path "192.168.1.1:/diskless/willow";
        fixed-address 192.168.1.136; }

        host zinnia {
        hardware ethernet YY:YY:YY:YY:YY:YY;
        option root-path "192.168.1.1:/diskless/zinnia";
        fixed-address 192.168.1.137; }
}
+++ dhcpd.conf ここまで +++++++++++++++++++++++++++++++++++++++++++++++++++++++++

rc.localに起動スクリプトを書き加える. コマンドライン引数 eth1 は dhcpd がサービスを提供するネットワーク・インタフェイス. こんなかんじ:

# ISC dhcpd
  if [ -f /etc/dhcpd.conf -a -x /usr/sbin/dhcpd ]; then
    echo -n "Starting dhcpd "
    /usr/sbin/dhcpd eth1
    echo "."
  fi

eringiでNFSサーバを起動

nfsdとportmapperとmountdとが起動していることを確認. client用 root directory と 共通の /usr, /home を export する.

eringi:/etc/exports は次のとおり. オプション にsyncを入れておかないと警告がうるさい. 商用パッケージのインストール先 としてしばしば用いられるディレクトリ/optは, サーバ, クライアントとも /usr/optという実体のシンボリックリンクにしておけばeringi:/usrだけを exportするだけで済む. /usrをlocalhostにもexportしているのは, clients-ldconfig.sh が使用するため.

# See exports(5) for a description.
# This file contains a list of all directories exported to other computers.
# It is used by rpc.nfsd and rpc.mountd.
/diskless/willow  willow(rw,no_root_squash,sync)
/diskless/zinnia  zinnia(rw,no_root_squash,sync)
/usr              localhost(ro,sync) willow(ro,sync) zinnia(ro,sync)
#/opt              willow(ro,sync) zinnia(ro,sync)
/home             willow(rw,sync) zinnia(rw,sync)

クライアントPCの数が増えてきたら, マシン名の代りに192.168.1.136/255.255.255.248(ro)などとも指定できる. 192.168.1.136〜143のこと. たぶん.

NFSや後述するtftpでクライアントがサーバに接続するためには TCP Wrapper (/etc/inetd.conf に記述されている /usr/sbin/tcpd のこと) によって正しいアクセスであると認められなくてはならない. そのルールを書いておくのが/etc/hosts.allowと/etc/hosts.denyの 2つのファイル.

eringi:/etc/hosts.allow (プライベートからのアクセスを許す.)

#
# hosts.allow    This file describes the names of the hosts which are
#                allowed to use the local INET services, as decided by
#                the '/usr/sbin/tcpd' server.
#
ALL : 192.168.1.0/255.255.255.0
# End of hosts.allow.

eringi:/etc/hosts.deny

#
# hosts.deny     This file describes the names of the hosts which are
#                *not* allowed to use the local INET services, as decided
#                by the '/usr/sbin/tcpd' server.
#
ALL : ALL EXCEPT LOCAL
# End of hosts.deny.

willow を KNOPPIX, 1CD-Plamo 等で起動してDHCPやNFSが動いていることを確認する

KNOPPIXの場合

# pump -i eth0 --status
# mount -t nfs 192.168.1.1:/diskless/willow /mnt

1CD-Plamoの場合

★ここ書きかけ/未確認.

# cat /var/state/dhcp/dhclient.leases              ← dhclient の場合
# mount -t nfs 192.168.1.1:/diskless/willow /mnt

dhcpcの場合

★ここ書きかけ/未確認.

# cat /etc/dhcpc/dhcpcd-eth0.info

eringi で NIS server を起動

★ここ書かねば.

eringiをゲートウェイとして設定

[Unix User 2002-03], [Software Design 2002-11], [Ohmori]などを参考に, 必要なら, サーバをインターネットへのゲート ウェイとしても設定する.

カーネルのコンパイル

linux-2.4.27を使用した. サーバ用 .config の例を上げておく. gateway機能を使わないのであれば, Plamo Linux 4.01 附属のkernelを使用できる.

ネットワークの基本設定

/etc/rc.d/rc.inet1.gateway/etc/rc.d/rc.firewall-masquradeと を参考まで用意した. あまりセキュアではないかもしれないし, クライアントから外へ ftpができないかもしれない. ISPからIPアドレスをもらってくる方法がDHCPではなく PPPoEの場合はrc.inet1.gatewayをさらに工夫する必要がある. 使いかたは次の とおり.

# cd /etc/rc.d
# chmod 755 rc.inet1.gateway rc.firewall-masqurade
# rm rc.inet1
# ln -s rc.inet1.gateway rc.inet1

作業工程2: disklessクライアント用 root directory の構築

disklessクライアントはLinuxカーネルのnfsrootという仕組みを使って 起動時にサーバにあるクライアント用 root directory をNFSマウントする. この節では, eringi:/diskless/HOSTNAME_OF_CLIENT/ にクライアント用 root directory を構築する.

eringi:/sbin/installpkg

/sbin/installpkgを変更して, ldconfigが走らないようにする.

installpkg~ 2004-10-03 07:22:54.000000000 +0900
+++ installpkg    2004-10-03 08:46:23.000000000 +0900
@@ -470,6 +470,7 @@

   if [ -x /sbin/ldconfig ]; then
     if [ -n "$ROOT" ]; then
-      /sbin/ldconfig -r $ROOT
+      # /sbin/ldconfig -r $ROOT
+      echo "installpkg: ldconfig was not executed."
     else
       /sbin/ldconfig

eringi:/diskless

wolfchen.tgzパッケージにより/diskless以下に次のディレクトリと ファイルがインストールされているはず.

/diskless/
         /00common/
                  /boot/System.map
                  /etc/fstab
                  /etc/group             -> /etc/group
                  /etc/hosts             -> /etc/hosts
                  /etc/hosts.allow       -> /etc/hosts.allow
                  /etc/hosts.deny        -> /etc/hosts.deny
                  /etc/hosts.equiv       -> /etc/hosts.equiv
                  /etc/passwd            -> /etc/passwd
                  /etc/postfix/main.cf
                  /etc/postfix/master.cf -> /etc/postfix/master.cf
                  /etc/printcap          サーバのqueueに渡すqueueを書く
                  /etc/resolv.conf       -> /etc/resolv.conf
                  /etc/shadow            -> /etc/shadow
                  /etc/rc.d/rc.6         comment out killall5 -9
                  /etc/rc.d/rc.M         After nfs-mounting /usr by rc.inet2, then ldconfig.
                  /etc/rc.d/rc.dhcp.tradnet
                                         このファイルは実は必要ない. 念のため.
                                         Do nothing in the case of reason=PREINIT
                                                  for continuous mounting of / .
                  /etc/rc.d/rc.inet2     Should be modified from original one. nfsdなどは起動しない.
                                         NISクライアントにするにはypbindをここで起動すること.
                  /etc/rc.d/rc.keymap    -> /etc/rc.d/rc.keymap
                  /etc/rc.d/rc.local     rc.once. RAM disk -> /tmp. ntpdate.
                  /etc/rc.d/rc.modules   echo "rc.modules is called. But do nothing."; exit 0
                  /etc/rc.d/rc.once      mktexlsrなど余計なものは消してある.
                  /var/run/inet1-scheme  DHCPと書いてあるだけ. このファイルも実は必要ない.
                  /var/spool/cron/crontabs/root
         /00packages/                    nfsroot用パッケージ置場
         /clients-fileconfig.sh          -> clients-initialconfig.sh
         /clients-initialconfig.sh
         /clients-ldconfig.sh            -> clients-initialconfig.sh
         /clients-netconfig.sh           -> clients-initialconfig.sh
         /clients-timeconfig.sh          -> clients-initialconfig.sh
         /clients-lpdspool.sh            -> clients-initialconfig.sh

なお, クライアントはブート時にkernelがIP-Configにより取得/確立した ネットワークの設定(IPアドレス, netmask等)をブート後もそのまま使うこと になる. よって, クライアントの /etc/rc.d/rc.inet1 -> rc.inet1.tradnet はデフォルトの非常に簡単なもののままである.

必要なa/*.tgz, n/*.tgzパッケージをCD-ROMより/diskless/00packages以下に コピーする. 最新版をftpで持ってきてもよい.

# cp -Rv /cdrom/plamo/a /diskless/00packages
# cp /cdrom/plamo/n/mailx.tgz /cdrom/plamo/n/postfix-2.0.18-i386-P1.tgz /diskless/00packages/n
# cd /diskless/00packages/a
# rm kernel-2.4.26-i586-P4.tgz
# rm murasaki-0.7.12-i386-P4.tgz 
# rm pcmcia_cs-3.2.7-i386-P2.tgz
# rm planet-4.0.0-i386-P6.tgz

お好みで/diskless/00common/以下にクライアント用のファイルを作ってもよい. なお, /diskless/00common/以下のファイル中の文字列「00common」はすべて クライアントのホスト名に置換されて, 各クライアント用の / にコピーされる.

root directory の構築

スクリプト mknfsroot.sh を 実行することにより /diskless/00packages/*/*.tgz を展開する. 環境変数ROOTを使う. 作業はrootで行なう.

# cd /diskless
# mkdir willow
# ROOT=willow ./mknfsroot.sh
# rm -r willow/usr/share/doc               ← ディスクスペースを節約するため消す.
# rm willow/etc/passwd                     ← 新しいのができてしまうので消す.
# rm willow/var/spool/cron/crontabs/nobody ← クライアントでlocate用データベースの更新はしない.
# cd willow/var/ ; rm -r locate ; ln -s /usr/var/locate . ; cd ../..
# cp -a willow zinnia
# ./clients-initialconfig.sh               ← で willow, zinnia 以下を初期設定
# chmod 644 00common/etc/rc.d/rc.once      ← 誤って再びコピーされても /etc/rc.d/rc.local から実行されないように
# du -sk * | sort -n                       ← 各クライアント用の / は 120 MB くらいになる.
# exportfs -a                              ← 忘れずにexportし直す.

その他

/usr は no_root_squash で export されていないため, eringi:/usr/sbin/crond

eringi:/usr/sbin/lpd のpermissionを755または555に変更しておかないと,

クライアントでこれらのデーモンが起動しない.

# ls -l /usr/sbin/crond
-rwx------    1 root     root        13264  9月 17日 2000年 /usr/sbin/cron
# chmod 555 /usr/sbin/crond
# ls -l /usr/sbin/crond
-r-xr-xr-x    1 root     root        13264  9月 17日 2000年 /usr/sbin/cron

bootじ lpd をきどうするには /diskless/00common/etc/rc.d/rc.inet2 も変更.

作業工程3: とりあえずフロッピーディスクでブート

クライアント用に Linux kernel 2.6.8.1 をコンパイルする. rootにならずに, 一般ユーザのままで home directory などにカーネル・ソースを展開して作業が 可能. /sbin/syslinux [SYSLINUX]を最新のもの (syslinux-2.11.tar.gz に入っているもの) に入れ換えておくこと.

$ which syslinux   (syslinuxのある/sbinにPATHが通っているか確認)
$ make mrproper
$ make help
$ cp somewhere/client.config .config
$ make menuconfig

クライアント用のブートフロッピーディスクを作る.

$ make fdimage FDARGS='root=/dev/nfs ip=:::::eth0:dhcp'
$ cat arch/i386/boot/fdimage > /dev/fd0

FDARGSは出来上がるMS-DOSフォーマットのフロッピーディスクの中に syslinux.cfgというテキストファイルとして書き込まれる. 上のようにcatで ブートフロッピーディスクを作成後, このsyslinux.cfgを編集することもできる.

すべてのクライアントに共通なブートフロッピーディスクを用いることはできな くなるが, クライアント毎にsyslinux.cfgを root=/dev/nfs nfsroot=/diskless/willow ip=192.168.1.136:192.168.1.1:192.168.1.1:255.255.255.0:willow:eth1: などと書き換えた, 各クライアントに専用のブートフロッピーディスクを用意 すればDHCPサーバを立てずに済ますことができる.

クライアント用のブートフロッピーディスクを作らないで, すぐに PXE boot に 挑戦するなら,

$ make bzImage

たけでもよい.

作ったブートフロッピーディスクを使ってクライアントを起動

ここで作ったブートフロッピーディスクを使ってクライアントを起動してみる. うまくいけば/etc/rc.d/rc.once が動いてからloginプロンプトが表示される.

クライアント用 .config の例

クライアント用 .config の例をあげておく. カーネル構築のときに注意しなければならない項目は次の通り:

loadable module
面倒なので使わない. Nと答える.
Processor type and features
全クライアントで共通のbzImageを使うなら, クライアントのCPUの中でいちばんセコイものを選択する. また, /usr/include/asm -> /usr/src/linux/include/asm -> asm-i386 という都合もあるのでサーバと同じにしておくのが無難.
CONFIG_CC_OPTIMIZE_FOR_SIZE
カーネルのサイズが小さくなるように最適化. これにYと答えないとフロッピーディスクに入るbzImageを作ることができない.
CONFIG_PACKET, CONFIG_FILTER (Socket filtering)
dhcpdを動かすのに必要.
IP_PNP, IP: kernel level autoconfiguration
This enables automatic configuration of IP addresses of devices and of the routing table during kernel boot, based on either information supplied on the kernel command line or by BOOTP or RARP protocols. You need to say Y only for diskless machines requiring network access to boot.
ROOT_NFS, Root file system on NFS
If you want your Linux box to mount its whole root file system (the one containing the directory /) from some other computer over the net via NFS (presumably because your box doesn't have a hard disk), say Y. Read <file:Documentation/nfsroot.txt> for details.
IDEドライバ, swapは不要
クライアントがハードディスクを内蔵しないならIDEドライバ, swapは不要
Parallel
プリンタをつなげる予定がないのなら組み込まない.
USB
カーネルのサイズがフロッピーディスクに入らないほど大きくなってしまうときには組み込まない.

作業工程4: PXEを使って完全無ディスク化

この節の作業によりクライアントはフロッピーディスクさえ使わない diskless boot ができるようになる. もし「完全無ディスク化」にこだわらないのであれば, もしくは クライアントのネットワーク・インターフェイス・カードがPXEの機能を持っていない などの理由があればこの工程をスキップしてかまわない.

PXEとPXELINUX [PXELINUX]([SYSLINUX]で配布のtar ballに同梱されて いる) とを用いる.

ディレクトリ /tftpboot の準備

wolfchen.tgz を installpkg したことにより, /tftpboot ディレクトリ ができているはずである.

tftpで配布するファイルやカーネルイメージを /tftpboot/ 以下に用意する. カーネルイメージは bzImage または fdimage のどちらか1つがあればよい.

# cp somewhere/linux-2.6.8.1/arch/i386/boot/bzImage /tftpboot/images
# cp somewhere/linux-2.6.8.1/arch/i386/boot/fdimage /tftpboot/images

+++ /tftpboot/pexlinux.cfg/default の例 ++++++++++++++++++++++++++++++++
PROMPT 1
DEFAULT bzImage
DISPLAY messages
TIMEOUT 200
label bzImage
        KERNEL images/bzImage
        APPEND root=/dev/nfs ip=:::::eth0:dhcp
label fdimage
        KERNEL memdisk
        APPEND initrd=images/fdimage
label localboot
        LOCALBOOT 0
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

+++ /tftpboot/messages の例 ++++++++++++++++++++++++++++++++++++++++++++
PXELINUX for Wolfchen
   Select: bzImage, fdimage or localboot
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

TFTP Server

tsizeに対応したtftpdが必要. freshmeet.net または kernel.org から tftp-hpa-0.39.tar.bz2 をダウンロード, インストール.

inetd.confの変更が必要:

- -- inetd.conf~	2003-04-05 14:48:17.000000000 +0900
+++ inetd.conf	2004-07-04 01:15:54.000000000 +0900
@@ -86,7 +86,7 @@
 # Tftp service is provided primarily for booting.  Most sites
 # run this only on machines acting as "boot servers." 
 #
-# tftp	dgram	udp	wait	nobody	/usr/sbin/tcpd	in.tftpd
+tftp    dgram   udp     wait    root    /usr/sbin/tcpd  in.tftpd -v /tftpboot
 # bootps	dgram	udp	wait	root	/usr/sbin/in.bootpd	in.bootpd
 #
 # Finger, systat and netstat give out user information which may be

クライアントの PXE boot

クライアントのBIOSを適当に設定して PXE boot してやると, /tftpboot/pxelinux.0, /tftpboot/pxelinux.cfg/default, /tftpboot/images/bzImage の順に tftp して, フロッピーブートのときと同様にloginプロンプトが表示さる ところまでいくはず. これでめでたく完成.

作業工程5: 詳細設定

時刻合わせ

make(1)などに「未来の時刻に更新したファイルがあるよ!」などと文句を言われない ためには, 各ホストのシステム・クロックのずれが常に1秒未満になっているようにす るのが望ましい. 起動時, /etc/rc.d/rc.S によりハードウェア・クロック (RTC) の時刻がシステム・クロックに読み込まれる (/sbin/hwclock --hctosys). その後すぐに /etc/rc.d/rc.local 中で ntpdate によってシステム・クロックを 正確な時刻に調整し, それが成功したなら, ハードウェア・クロックもその正確な 時刻に合わせる (/sbin/hwclock --systohc) ことにする. よって, ハードウェア・ クロックはだいたい合っていればよいことにする. 各ホストともともプロバイダ等の 提供するntpサーバを使って, 起動時および1日1回, システム・クロックとハード ウェア・クロックとを調節する. LANにわざわざntpサーバは立てない. adjtimex の --tick と --frequency オプションを使ってシステム・クロックの進みまたは遅れ をなくしておけば, 1日1回程度のntpdateで十分に「ずれが1秒未満」の精度を達成 できる. Plamo Linux 4.01 には adjtimex(8)がインストールされていないので, どこかからか探してインストールする. hwclock(8), adjtimex(8)の man pages や /etc/adjtime, /usr/include/sys/timex.h も一読されたい.

起動時に時刻をあわせるため /etc/rc.d/rc.local に次の数行を書く:

+++ ここから +++++++++++++++++++++++++++++++++++++++
# Configure the system clock with ntp.
# This can be changed if your system keeps GMT.
# ref. /etc/adjtime, hwclock(8), adjtimex(8), /usr/include/sys/timex.h
if [ -x /usr/bin/ntpdate -a -x /sbin/hwclock ]; then
  /usr/bin/ntpdate -s ntp.example.net && /sbin/hwclock --systohc
fi
if [ -x /usr/local/bin/adjtimex ]; then
  /usr/local/bin/adjtimex --tick 10000 --frequency 1
fi
+++ ここまで +++++++++++++++++++++++++++++++++++++++

crontab(5)に次の1行を追加して, 毎日20時20分 (あなたが日常的にPCを使いはじ める少し前がよい) に時刻をあわせる.

20 20 * * *   /usr/bin/ntpdate -s ntp.example.net && /sbin/hwclock --systohc

/var/log/messages に offset が記録されるはずなので, それを元に --tick と --frequency の値を決める. たとえば

Aug 22 20:20:03 eringi ntpdate[1180]: step time server X.Y.Z.123 offset 1.626606 sec
Aug 23 20:20:03 eringi ntpdate[1490]: step time server X.Y.Z.123 offset 1.642889 sec
Aug 24 20:20:03 eringi ntpdate[6441]: step time server X.Y.Z.123 offset 1.665247 sec

なら1日平均1.645秒遅れるということなので, そのぶんシステム・クロック をスピードアップする. 1.645/8.64*6553600=1247763 だから,

# /usr/local/bin/adjtimex --tick 10000 --frequency 1247763

とする.

# /usr/local/bin/adjtimex --print

で設定を確認する. 11分ごとのハードウェア・クロックへの同期を行わない設定 ((status & 64) が真) になっていることも確認しておく. システム・クロックの スピードが十分調整されたら, /etc/rc.d/rc.localにも同じadjtimexを書いておく.

この調整が面倒なら, 2〜3時間ごとくらいに ntpdate することにすれば「ずれが 1秒未満」の精度はたいてい達成できる. ntpdateの頻度はログのoffsetの値を見て 決めるとよい.

Wolfchenクラスタではさらに

# chmod 555 /etc/rc.d/rc.local

とpermissionを変更しておき, clients-fileconfig.sh が /etc/rc.d/rc.local を上書きしてしまうのを防ぐ.

Wake-On-LAN

wolfchen.tgzパッケージには usr/sbin/ether-wake [ether-wake] と usr/man/cat8/ether-wake.8 とが含まれている. クライアントのBIOSの設定で Wake-On-LANを有効にしてから,

# ether-wake -u
# ether-wake -i eth1 00:11:22:33:44:55

などと試す.

locatedb

locate(1)用のデータベースファイル (Plamo Linux 4.01 は /var/locate/locatedb) はサーバで更新が成功したら /usr/var/locate/locatedb にもコピーする:

# crontab -l nobody
# This updates the database for 'locate' every day:
40 04 * * *   updatedb 1> /dev/null 2> /dev/null && cp /var/locate/locatedb /usr/var/locate

ディレクトリのオーナに注意:

# ls -ld /var/locate /usr/var/locate
drwxr-xr-x    2 nobody   nogroup      4096  8月 30日  04:40 /var/locate/
drwxr-xr-x    2 nobody   nogroup      4096  8月 30日  04:40 /usr/var/locate/

クライアントの /var/locate/locatedb は /usr/var/locate/locatedb の シンボリックリンクとする. クライアントの nobody の crontab は消す.

クライアントの/proc/loadavgを表示する方法

次のようなシェルスクリプトをlaという名前で使っている.

#!/bin/sh
for i in foo bar baz longlong longlonglong; do
    la=`rsh $i cat /proc/loadavg`
    set `echo -n $i | wc`
    if [ $3 -lt 8 ]; then
        echo -e "$i\t\t$la"
    else
        echo -e "$i\t$la"
    fi
done

postfixの設定

/usr/share/doc/postfix-2.0.18/INSTALL.gz の『7 - Configuring Postfix to send mail only』を読んで, server, client とも null mail client にする.

/etc/postfix/main.cf:myhostname = pentium3dual.imr.tohoku.ac.jp <--- host dependent

クライアントの/tmp

tmpfsで確保する. ramdiskは使用しない. /diskless/00common/etc/fstab は次のとおり.

pentium3dual:/diskless/00common /      nfs     rw,hard,intr       0 0    
tmpfsdev                        /tmp   tmpfs   defaults,size=512M 0 0
pentium3dual:/usr               /usr   nfs     ro,hard,intr       0 0    
cmsserv:/home                   /home  nfs     rw,hard,intr       0 0    
/dev/cdrom                      /cdrom iso9660 user,ro,noauto,exec,codepage=932,iocharset=euc-jp 0   0
/dev/sda1                       /card  vfat    user,noauto,noexec,codepage=932,iocharset=euc-jp  0   0
none                            /proc  proc    defaults           0 0

var/spool はどうする?

★ここ書かねば.

sshの設定

★ここ書かねば.

serverのバックアップ方法

★ここ書かねば.

作業工程6: 科学計算用のソフトウエアのインストール

Fortranのインストール

ifort

FFTWのインストール

MPICHのインストール

This section is OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD.

MPICHとはMPIの1インプリメンテーションで, 2004年末にMPI-2.0のAPIを すべて取り込んだversion 1.0がリリースされた[MPICH2]. MPICH2 home page より mpich2-1.0.tar.gz を入手し, インストールする. MPD process manager を daemon としてサーバおよびクライアントで走らせること により, ユーザーが誰でも特別な手続きなしに並列化プログラムを実 行できるようにする.

$ which python
/usr/bin/python
$

と/usr/bin/pythonがインストールされていることを確認する. もしなければ,

などで/usr/bin/pythonをインストールする(OS起動時の /etc/rc.d/rc.local 実行時にPATHが通っているところにpythonをインストールしておく必要がある).

mpich2-1.0.tar.gz を --prefix=/opt/mpich2-1.0 でインストールする.

# cd /opt ; ln -s mpich2-1.0 mpich2

とする(MPI-2.0の他の実装もインストールするかもしれないので/usr/local などにはインストールしないほうがよい).

サーバおよびクライアントともに/etc/mpd.confという

secretword=<secretword>

と1行書かかれただけのファイルを作る. Wolfchenの場合クライアント用は,

# cd /diskless/00common/etc
# ln -s /etc/mpd.conf .

としておく.

/etc/rc.d/rc.local で mpd を, サーバでは

/opt/mpich2/bin/mpd --daemon --listenport=12345

と起動, クライアントでは

/opt/mpich2/bin/mpd --daemon --host=<server hostname> --port=12345

と起動するようにしておく.

ユーザーは /opt/mpich2/bin にPATHを通しておく。/etc/profile や /etc/csh.cshrc などで設定してしまうのも一案.

LAM-MPIのインストール

BLASのインストール

bals goto でぐぐる.

LAPACKのインストール

ABINITのインストール

GNUPLOTのインストール

作業工程7: 日々の管理作業

クライアントの追加

クライアントnewcomerを追加する手順は次のとおり.

# cd /diskless
# mkdir newcomer
# emacs /etc/dhcpd.conf                      ← newcomerのMACアドレスとIPアドレスを記入
# kill dhcpdのPID ; /usr/sbin/dhcpd          ← dhcpdの再スタート
# emacs /etc/exports /etc/hosts /etc/hosts.allow /diskless/00common/etc/hosts.equiv
                                             ← ファイル内の各項目にnewcommerを追加
# ROOT=newcomer ./mknfsroot.sh
# rm -r newcomer/usr/share/doc               ← ディスクスペースを節約するため消す.
# rm newcomer/etc/passwd                     ← 新しいのができてしまうので消す.
# rm newcomer/var/spool/cron/crontabs/nobody ← クライアントでlocate用データベースの更新はしない.
# cd newcomer/var/ ; rm -r locate ; ln -s /usr/var/locate . ; cd ../..

# ROOT=newcomer ./clients-initialconfig.sh   ← で newcomer 以下を初期設定
# chmod 755 newcomer/etc/rc.d/rc.once
# du -sk * | sort -n                         ← 各クライアント用の / は 100 MB くらいになる.
# exportfs -a                                ← 忘れずにexportし直す. 何か他に再スタートしなくてよい?

ソフトウエアやtgzパッケージのインストール

通常はサーバにのみインストールすればよい.

たとえばそのソフトウエアが /etc/foo というファイルを作るのなら, /diskless/00common/etc/foo にもコピーして clients-fileconfig.sh を実行する.

# cd /diskless
# ./clients-fileconfig.sh 00common/etc/foo

tgzパッケージがクライアントの/に必要なものなら, /deskless/00packeages/ にコピーしておいて, 各クライアントにもmknfsroot.shを使ってパッケージをインストールする.

# cd /diskless
# ROOT=willow ./mknfsroot.sh 00packeages/newpackage.tgz

/lib, /usr/lib などの dynamic link library に変更があった場合は clients-ldconfig.sh を実行してクライアントの /etc/ld.so.cashe を更新する:

# cd /diskless
# ./clients-ldconfig.sh

トラブル・シューティング

クライアントのブートやシャットダウンがうまく行かない

クライアントにディスプレイを接続し, /diskless/willow/etc/rc.d/以下の 起動/遮断スクリプトに

echo "foo=$foo"
echo -n " Sleep 30 seconds... "
sleep 30
echo "End of sleep."

などと数行付け加えて, 表示されるメッセージを読みながらデバッグする.

シャットダウンがうまく行かないときは, さらにキーボードを接続して, 起動時の LILO: の後に linux apci=off とカーネル・パラメータを 指定しておくと自動的に電源が切れなくなり, シャットダウン時に表 示されるメッセージを読むことができる.

やり残している作業

/etc/printcap

一斉電源断のしくみを作る

一斉/homeのマウント, アンマウントのしくみを作る

clients-initialconfig.sh

00common があれば sed "s/00common/$root/g" $1 > $2, なければ cp -av $1 $2 こうしないと/etc/shadowのpermissionがやばい.

wolfchen.tgz: rc.local.wolfchen.example

syslog (How to collect system messages from clients to server)

DHCP option log-servers は使わない. サーバ側: syslogd -r

クライアントの/のスリム化

% du -sk /diskless/willow/usr/share/locale /diskless/willow/usr/share/i18n
10912   /diskless/willow/usr/share/locale
7140    /diskless/willow/usr/share/i18n
%

などは消してよいと思われる. postfixは/etc/postfix/以下だけをクライアント用にインストール.

クライアントの /var/locate/locatedb は /usr/var/locate/locatedb のシンボリックリンクとする

これをwolfchen.tgzパッケージに入れ込む. 「クライアントの nobody の crontab は消す.」も.

sj3 の -H willow

クライアントでのカーネルモジュールの利用

クライアントでもカーネルモジュールが使えるようにして、 lm_sensorによりCPU温度、FAN回転数を監視できるようにする。 異常時にはメールで通報するシステムを作る。

クライアントでもXが立ち上がるようにする

クライアントでXが立ちあがるようにすれば, 情報処理教育用の端末などになる云々. なんで立ち上がらないのー???/usrがroだから?/etcに何かが足りない?

ベンチマーク

この文章の句読点の統一

「サーバー」は「サーバ」に統一

boot disk image と bzImage もパッケージに含める

System.map

kernel panic した時の原因究明等に便利だが, なくてもかまわない.

64bit化

server and clients とも AMD Opteron64 にして

の64bit化.

クライアントの software suspend

ジョブが複数のクライアントで並列実行中でも software suspend できるようにする.

UPS

Batch Queueing System

[Sun Grid Engine]???

要件

参考文献

http://www.cmpharm.ucsf.edu/~srp/batch/systems.html

汎用/tftpboot/images/bzImage

たいていのPCがbootできるようなbzImageをwolfchen.tgzパッケージに含める.

まとめ

PCクラスタの構築が安価で容易な理由としては (1)市販の安価な部品を使用すること ができる, (2)PC UNIXを使うため構築と保守管理の方法の情報の入手が容易なこと, があげられる. 本文章ではさらに, (3)クライアントPCをdiskless化し, (4)クライ アントPC管理用のスクリプトを使うこと, によりさらに簡便な保守管理を追求した.

参考文献, URL等

[ether-wake]
Donald Becker: ether-wake.c <URL:http://www.scyld.com/wakeonlan.html>
[GAMMA]
[ISC DHCP]
Internet Systems Consortium's DHCP <URL:http://www.isc.org/index.pl?/sw/dhcp/>
[LAM-MPI]
<URL:http://www.lam-mpi.org/>
[MOSIX]
<URL:http://www.mosix.org/>
[MPI-Forum]
Message Passing Interface (MPI) Forum Home Page MPI-2.0の規格書などが置いてある. <URL:http://www.mpi-forum.org/>
[MPICH2]
MPICH2 home page <URL:http://www-unix.mcs.anl.gov/mpi/mpich2/>
[Ohmori]
Kenji Ohmori: Firewall <URL:http://www.geocities.co.jp/SiliconValley-Cupertino/9120/firewall.html>
[PXE]
Preboot Execution Environment (PXE) Version 2.1 <URL:http://www.intel.com/labs/manage/wfm/wfmspecs.htm>
[PXELINUX]
<URL:http://syslinux.zytor.com/pxe.php>
[Scyld Beowulf]
The Scyld Beowulf of Scyld Software <URL:http://www.scyld.com/>
[Software Design 2002-11]
Software Design 2002年11月号 特集『究める Plamo Linux』
[Sun Grid Engine]
<URL:http://gridengine.sunsource.net/>
[SYSLINUX]
<URL:http://syslinux.zytor.com/> kernel.org <URL:http://ring.tains.tohoku.ac.jp/pub/linux/kernel.org/utils/boot/syslinux/> からtar ballをダウンロードできる.
[Unix User 2002-03]
Unix User 2002年3月号 特集『買うか? 作るか? ブロードバンドルーター』
[yamamori]
YAMAMORI Takenori: 『PXEを使ってPCもディスクレスにしよう』 <URL:http://www15.big.or.jp/~yamamori/sun/pxe/>
[ひんやりNetBSD]
Unix Magazine 2004年11月号 連載文房具としてのUNIX 07『ひんやりNetBSD』
[超並列計算研究会]
<URL:http://www.is.doshisha.ac.jp/SMPP/index.html>