計算機クラスタ構築メモ
計算機クラスタを構築することになりました。
私の研究室には数値シミュレーションのための計算機クラスタがあるのですが、数年に渡る使用の結果、パッケージやライブラリの管理が煩雑になってきました。正確に言えば、今までまともに管理してこなかったツケがそろそろ回り始めてきました。業を煮やして「もう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
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段階以上のシンボリックリンクを解決できない」という罠に半日ハマった。
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サーバ (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