計算機クラスタ構築メモ

計算機クラスタを構築することになりました。

私の研究室には数値シミュレーションのための計算機クラスタがあるのですが、数年に渡る使用の結果、パッケージやライブラリの管理が煩雑になってきました。正確に言えば、今までまともに管理してこなかったツケがそろそろ回り始めてきました。業を煮やして「もうOSごと再インストールしてしまおう」ということになりまして、その役目を私が仰せつかったわけです。

「後学の為に作業メモをWikiにまとめといてね」と頼まれましたが、研究室Wikiとかまだないのでまずはこちらに。

ちなみに、再インストールのサポート料金の見積もりも前もって業者にお願いしていました。高かったです。

既存データのバックアップ

「再インストールするからちゃんとデータ退避させとけよ」とあらかじめ通達しておきましたが、きっとやってない人がいそうだなぁ、と思って全員のホームディレクトリをまとめて固めて退避させておきました。140GBで2時間ぐらい。

Ubuntu Server のインストール (Master)

Ubuntu Server 11.04 (natty) のインストールCDを焼いて、普通にインストールする。今後の作業は基本的に全て root 権限で行う。
残る17台のSlaveノードには、PXEブートしてOSをネットワークインストールする。その準備として、以下のようにMasterノードを設定する。

ネットワーク設定

基本設定

ネットワークインタフェースの設定を行う。OSインストール時にWAN側設定は済んでいるかもしれない。 eth0 がLAN側なので、取り違えないように注意。

/etc/network/interfaces

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface

auto eth0
iface eth0 inet static
	address 192.168.1.1
	netmask 255.255.255.0
	network 192.168.1.0
	broadcast 192.168.1.255

auto eth1
iface eth1 inet static
	address 163.143.166.104
	netmask 255.255.255.0
	network 163.143.166.0
	broadcast 163.143.166.255
	gateway 163.143.166.1
	# dns-* options are implemented by the resolvconf package, if installed
	dns-nameservers 163.143.166.100
	dns-search eureka.u-aizu.ac.jp
DNS

/etc/resolv.conf

search u-aizu.ac.jp
nameserver 163.143.1.100
hosts

/etc/hosts

127.0.0.1	localhost
163.143.166.104	hpcs01.hpc01.u-aizu.ac.jp	hpcs01

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

192.168.1.1  hpcs01.u-aizu.ac.jp hpcs01
192.168.1.2  hpcs02.u-aizu.ac.jp hpcs02
192.168.1.3  hpcs03.u-aizu.ac.jp hpcs03
192.168.1.4  hpcs04.u-aizu.ac.jp hpcs04
192.168.1.5  hpcs05.u-aizu.ac.jp hpcs05
192.168.1.6  hpcs06.u-aizu.ac.jp hpcs06
192.168.1.7  hpcs07.u-aizu.ac.jp hpcs07
192.168.1.8  hpcs08.u-aizu.ac.jp hpcs08
192.168.1.9  hpcs09.u-aizu.ac.jp hpcs09
192.168.1.10 hpcs10.u-aizu.ac.jp hpcs10
192.168.1.11 hpcs11.u-aizu.ac.jp hpcs11
192.168.1.12 hpcs12.u-aizu.ac.jp hpcs12
192.168.1.13 hpcs13.u-aizu.ac.jp hpcs13
192.168.1.14 hpcs14.u-aizu.ac.jp hpcs14
192.168.1.15 hpcs15.u-aizu.ac.jp hpcs15
192.168.1.16 hpcs16.u-aizu.ac.jp hpcs16
192.168.1.17 hpcs17.u-aizu.ac.jp hpcs17
192.168.1.18 hpcs18.u-aizu.ac.jp hpcs18

ネットワークの設定が済んだら、

$ service networking restart

で再起動する。

DHCPサーバ
$ apt-get install dhcp3-server

でインストール。Slaveノードに固定IPを割り振るために、 /etc/dhcp/dhcpd.conf を以下のように設定する。

ddns-update-style none;

subnet 192.168.1.0 netmask 255.255.255.0 {

       default-lease-time 1200;
       max-lease-time 1200;
       option routers 192.168.1.1;
       option subnet-mask 255.255.255.0;
       option broadcast-address 192.168.1.255;
       
       allow booting;
       allow bootp;

       filename "pxelinux.0";
       next-server 192.168.1.1;

    host hpcs01 {
        hardware ethernet 00:15:17:31:10:E8;
        option host-name "hpcs01";
        fixed-address 192.168.1.1;
    }
    host hpcs02 {
        hardware ethernet 00:15:17:31:11:00;
        option host-name "hpcs02";
        fixed-address 192.168.1.2;
    }
    host hpcs03 {
        hardware ethernet 00:15:17:31:0D:8C;
        option host-name "hpcs03";
        fixed-address 192.168.1.3;
    }
    host hpcs04 {
        hardware ethernet 00:15:17:31:11:04;
        option host-name "hpcs04";
        fixed-address 192.168.1.4;
    }
    host hpcs05 {
        hardware ethernet 00:15:17:31:0B:38;
        option host-name "hpcs05";
        fixed-address 192.168.1.5;
    }
    host hpcs06 {
        hardware ethernet 00:15:17:31:0E:C0;
        option host-name "hpcs06";
        fixed-address 192.168.1.6;
    }
    host hpcs07 {
        hardware ethernet 00:15:17:92:A9:98;
        option host-name "hpcs07";
        fixed-address 192.168.1.7;
    }
    host hpcs08 {
        hardware ethernet 00:15:17:92:AA:04;
        option host-name "hpcs08";
        fixed-address 192.168.1.8;
    }
    host hpcs09 {
        hardware ethernet 00:15:17:92:A8:18;
        option host-name "hpcs09";
        fixed-address 192.168.1.9;
    }
    host hpcs10 {
        hardware ethernet 00:15:17:92:A9:24;
        option host-name "hpcs10";
        fixed-address 192.168.1.10;
    }
    host hpcs11 {
        hardware ethernet 00:15:17:92:A9:30;
        option host-name "hpcs11";
        fixed-address 192.168.1.11;
    }
    host hpcs12 {
        hardware ethernet 00:15:17:92:A6:70;
        option host-name "hpcs12";
        fixed-address 192.168.1.12;
    }
    host hpcs13 {
        hardware ethernet 00:15:17:92:AA:AC;
        option host-name "hpcs13";
        fixed-address 192.168.1.13;
    }
    host hpcs14 {
        hardware ethernet 00:15:17:92:A9:F0;
        option host-name "hpcs14";
        fixed-address 192.168.1.14;
    }
    host hpcs15 {
        hardware ethernet 00:25:90:11:69:1A;
        option host-name "hpcs15";
        fixed-address 192.168.1.15;
    }
    host hpcs16 {
        hardware ethernet 00:25:90:11:67:C4;
        option host-name "hpcs16";
        fixed-address 192.168.1.16;
    }
    host hpcs17 {
        hardware ethernet 00:30:48:FD:9D:06;
        option host-name "hpcs17";
        fixed-address 192.168.1.17;
    }
    host hpcs18 {
        hardware ethernet 00:30:48:FD:9D:2C;
        option host-name "hpcs18";
        fixed-address 192.168.1.18;
    }
}

さらに、このDHCPサーバがLAN内のノードからのリクエストを受け付けるように、 /etc/default/isc-dhcp-server を以下のように編集する。

Interfaces="eth0"
$ service isc-dhcp-server restart

で再起動。最初から /sbin/dhcpd のパスが通っていたが、これは使えないようだった。

tftpサーバ

ネットワークブート用のOSイメージを転送するために、 TFTP を利用する。これは軽量版の FTP とでも言うべきものであり、FTP に比べて機能が制限されている。専らネットワークブートのために使われているようだ。

$ apt-get install tftpd-hpa

でインストール。

/var/lib/tftpboot/ が TFTP サーバの公開ディレクトリとなる。 /etc/default/tftpd-hpa が設定ファイルだが、特に書き換えるべき点はない。

OSイメージのダウンロード
$ cd /var/lib/tftpboot
$ wget http://jp.archive.ubuntu.com/ubuntu/dists/maverick/main/installer-i386/current/images/netboot/netboot.tar.gz
$ tar zxvf netboot.tar.gz

/var/lib/tftpboot/pxelinux.0 などのファイルがあることを確認しよう。このファイルがネットワーク用のブートローダである。

ネットワークブートのためには、インストールサーバ (Masterノード) のIPアドレスや、ブートローダのパス名を設定しておく必要がある。実は、この設定は既に済んでいる。 dhcpd.conf の中の next-server 192.168.1.1; と filename "pxelinux.0" がそれである。 filename には、 /var/lib/tftpboot/ をルードディレクトリとしたときのブートローダのパス名を指定する。

閑話休題

最初 Ubuntu 11.04 (natty) をインストールすると言ったが、先ほどダウンロードしたOSは maverick 、つまり Ubuntu 10.10 である。実は 11.04 はインストールこそできたがうまくブートせず、 10.10 では問題なかったのでこちらにした。Masterノードにも後で 10.10 を入れ直した。

リリースノートに怪しげな記述が見つかったので、全ての原因をこいつに押し付けてしまうことにする。

PXEを用いてネットワークからブートしていて、その際にSyslinuxのLOCALBOOTによりローカルのハードディスクにイメージを渡しているユーザーから、ローカルブートが成功しないという報告があります。Syslinuxはchain.c32というCOM32のイメージを提供しますが、PXE BIOSごとの挙動の差異を吸収しきれていないためです。
NattyNarwhal/ReleaseNotes/ja - Ubuntu Wiki - 既知の問題 - 起動・インストール・アップグレード・初回起動時の挙動

ブート

Slaveノードの電源を投入し、F12連打でネットワークブートする。インストールはCDから行うのと同様にできる。途中でインストールするパッケージを聞かれるが、 OpenSSH Server だけはここでインストールしておかないと、後で涙目になること請け合いである。

失敗する場合、他のPCに TFTP クライアントをインストールして、/var/lib/tftpboot/ 以下のファイルが全て取得できるか調べよう。私は「TFTPサーバは2段階以上のシンボリックリンクを解決できない」という罠に半日ハマった。

ディスプレイを4台使って、4並列でひたすらインストールした。

Fig.1 インストール風景

Slave設定

スクリプト

Slaveを一括操作するため、 RSH, RCP という2つのシェルスクリプトを使う。それぞれ、 rsh と rcp を各Slaveに対して1回ずつ行うだけの簡単なスクリプト

RSH

#!/bin/bash
for n in `seq 2 18`
do
    rsh 192.168.1.$n "$*"
done
exit

RCP

#!/bin/bash
for n in `seq 2 18`
do
    rcp $1 192.168.1.$n:$2
done
exit
SSH

まずは、全てのSlaveノードに root パスワードを設定する。

arc-env@hpcs01$ sudo su -
root@hpcs01$ passwd

Masterノードで

root@hpcs01$ ssh-keygen -b 2048 -t rsa

と打つ。入力を求められるがリターン連打で良い。作成された ~/.ssh/id_rsa.pub を authorized_keys にリネームし、全てのSlaveノードの ~/.ssh/ に配布する。

この一連の作業で、何十回と root パスワードを打ち込むことになる。頑張れとしか言いようがない。

終わったら、

root@hpcs01$ ssh 192.168.1.2

などとして、パスワード無しでログインできることを確認する。

IP Masquerade

SlaveはMasterを経由してインターネットに接続することになるので、まずはMasterに NAT の設定をする。

/etc/sysctl.conf

net.ipv4.ip_forward=1

として、

$ sysctl -p

でリロードする。。さらに、

root@hpcs01$ iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE

IPマスカレード。これはUbuntuを起動する度に実行しなければならないので、 /etc/rc.local に記述しておく。

うまく行けば、

root@hpcs01$ ssh hpcs02 ping www.google.com

などとして、応答が帰ってくるはず。

hosts

hostsもばらまいておく。

root@hpcs01$ RCP /etc/hosts /etc/hosts
NIS

NISを使ってアカウントを一元管理する。

NISサーバ (Master)
root@hpcs01$ apt-get install portmap nis

ドメイン名を聞かれるが、 hpc01.u-aizu.ac.jp としておいた。

/etc/hosts.allow

portmap ypserv ypbind : 192.168.1.0/24

/etc/default/nis

NISSERVER=master

/etc/yp.conf

domain hpc01.u-aizu.ac.jp server hpcs01.u-aizu.ac.jp

/etc/ypserv.securenet

# This line gives access to everybody. PLEASE ADJUST!
# 0.0.0.0		0.0.0.0    # この行をコメントアウト

255.255.255.0   192.168.1.0        # この行を追加

とどめに再起動。

root@hpcs01$ /usr/lib/yp/ypinit -m
root@hpcs01$ service portmap restart
root@hpcs01$ service nis restart
root@hpcs01$ make -C /var/yp
NIS クライアント (Slave)

インストールする。 やはりドメイン名を聞かれるので、先ほどと同じものを入力する。

root@hpcs01$ RSH "echo 'hpc01.u-aizu.ac.jp' | apt-get install -y portmap nis"

NISを使用するように、passwdなどの末尾に追記する。

root@hpcs01$ RSH "echo '+::::::'   >> /etc/passwd"
root@hpcs01$ RSH "echo '+:::'      >> /etc/group"
root@hpcs01$ RSH "echo '+::::::::' >> /etc/shadow"

再起動。

root@hpcs01$ RSH service nis restart
root@hpcs01$ RSH make -C /var/yp

確認。

root@hpcs01$ ypcat passwd

ユーザの追加。

root@hpcs01$ adduser
root@hpcs01$ make -C /var/yp
NFS

全てのノードでファイルを共有できるように、NFSの設定を行う。

まずはMasterにサーバを、Slaveにクライアントをインストールする。

root@hpcs01$ apt-get install portmap nfs-kernel-server
root@hpcs01$ RSH apt-get install -y portmap nfs-common

公開ディレクトリ /nfsroot を作る。この中にホームディレクトリの実体も置くことにする。

root@hpcs01$ mkdir /nfsroot
root@hpcs01$ mv /home /nfsroot

/etc/exports を編集して、このディレクトリを公開するよう設定する。

/nfsroot/ 192.168.1.0/24(rw,sync,fsid=0,no_root_squash,no_subtree_check)

再起動。

root@hpcs01$ service nfs-kernel-server restart

このディレクトリをSlaveにマウントさせる。その前に、元のホームディレクトリも待避させる。

root@hpcs01$ RSH "mv /home /home.old; mkdir /home"
root@hpcs01$ RSH "mount -t nfs 192.168.1.1:/nfsroot/home /home"

ただマウントさせるだけなら上のコマンドでいいが、起動時に自動的にマウントしてくれる方が嬉しいので、 /etc/fstab に登録する。そういえば、Masterにもマウントさせるのを忘れていた(シンボリックリンクという手もあるが、どちらがいいのかは知らない)。

root@hpcs01$ RSH 'echo "192.168.1.1:/nfsroot/home  /home  nfs  defaults  0 2" >> /etc/fstab'
root@hpcs01$ echo "192.168.1.1:/nfsroot/home  /home  nfs  defaults  0 2" >> /etc/fstab

外付けHDDもあるので、これもマウントさせる。やるべきことはさっきと変わらない。この辺りで、 mountall で /etc/fstab を再読込できることを覚えた。

hpcs01:/etc/fstab

/dev/sdc1 /mnt/disk1               ext4    defaults,errors=remount-ro 0       2

hpcs01:/etc/exports

/mnt/disk1 192.168.1.0/24(rw,sync,fsid=1,no_root_squash,no_subtree_check) 
root@hpcs01$ mkdir -p /mnt/disk1
root@hpcs01$ mountall
root@hpcs01$ RSH mkdir -p /mnt/disk1
root@hpcs01$ RSH echo "192.168.1.1:/mnt/disk1 /mnt/disk1 nfs  defaults  0 2" >> /etc/fstab
root@hpcs01$ RSH mountall


これでサーバ周りの設定はだいたいお終い。次は研究に使う各種ソフトウェアのインストール。終わったら書きます。

追記

メモリが4GB弱しか認識されない件について

メモリを12GB積んだノードが、4GB弱しか認識しない。どうやら32bit版をインストールしてしまったようだが、それにしては8GB積んだノードは8GB全部認識しているのが妙だ。
とにかく、カーネルをアップデートすればいいらしい。以下のコマンドで12GB認識した。

$ apt-get install linux-server linux-headers-server