====== 클러스터 구축하기 - 4.Lam을 이용한 과학계산클러스터 ======
====== 준비운동 하기 ======
저번 문서까지는 고가용성 부하분산 클러스터를 직접 구축했었다. 이번에는 클러스터의 또 다른 분야인 과학 계산 클러스터를 만들어 볼 것이다.
과학 계산 클러스터를 구축하는 방법에는 여러가지가 있겠지만, 필자는 디스크-리스(disk-less) 클러스터를 구축할 것이다.
우선 준비물을 알아보자!
필자는 총 3대의 컴퓨터를 묶어서 만들 것이다. 1대의 Master node 와 2대의 real node 이다.
===== 1. master node(210.119.108.172) =====
| cpu | 펜티엄 3 500MHZ |
| ram | 256MB |
| hdd | 8.5G (참고로 파티션은 /boot 와 / 로만 잡아주었다) |
| etc | lan card(realtek 8139) 1장 |
===== 2. real node(210.119.108.173) ☞ 플로피 드라이브가 있어야 한다 =====
| cpu | 셀러론 533MHZ |
| ram | 128MB |
| etc | lan card(realtek 8139) 1장 |
===== 3. real node(210.119.108.174) =====
| cpu | 펜티엄 2 233MHZ |
| ram | 64MB |
| etc | lan card(realtek 8139) 1장 |
그외 허브 1개(참고로 필자는 5port 였다)
위에서 하드웨어 사양을 봐도 알겠지만, 어떻게 저 사양을 가지고 클러스터를 만들겠다는 건지 의문이 들 정도이다. 암튼 우리는 저 사양을 가지고 클러스터를 만들어 볼 것이다.
참고로 read node들은 하드가 필요없다. 하지만 반드시 플로피 드라이브가 있어야 한다.
왜냐하면, 하드가 없는 대신 플로피로 부팅을 해야 하기 때문이다.
자~아 이제 본격적인 설정에 들어가보자!!
====== 세팅 및 설정하기(Master node) ======
참고로, 우리가 만들어 볼 클러스터의 모습은 아래와 같다.
{{ :computer:network:cluster_map.jpg |}}
우선 마스터 노드에 레드햇 8.0을 설치했다. 참고로 설치할때 X윈도우 관련 패키지는 설치하지 않았고, lam, pvm, dhcp 패키지를 추가로 선택하여 설치했다. 필자의 경우 용량은 총 1G 남짓되었다.
===== 필요한 프로그램 설치하기 =====
우선 master node에 필요한 프로그램들을 다운 받아서 설치해야 한다.
다음과 같다.
- tftp (tftp-0.29-3, tftp-server-0.29-3)
- mknbi (mknbi-1.4.2-1.noarch.rpm)
☞ 만일 나중에 아래와 같은 에러가 난다면, 아래 패키지를 설치한다.
$mpicc my_mpi.c
/usr/bin/ld: cannot find -laio
Colletct2: ld returned 1 exit status
* libadio(libadio, libadio-devel) : 참고로 이것은 Redhat8.0 CD에 포함된 패키지다.
===== tftp 설정 =====
우선 tftp 부터 알아보자!
/etc/xinetd.d/tftp 파일을 아래와 같이 편집해야 한다.
service tftp
{
disable = no -> 활성화 시켜준다.
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /tftpboot -> 나중에 커널 이미지가 있을 경로
per_source = 11
cps = 100 2
}
그리고 나서,
#/etc/init.d/xinetd restart
제대로 설정이 되었는 지 확인해보자!!
#netstat -lnu
결과 udp 포트 69번이 열려 있어야 한다.
===== 부팅용 커널이미지 만들기 =====
우선 부팅용 커널 이미지를 만들기 전에 우리는 여기서 커널 컴파일을 해야 한다. 기본적으로 Redhat8.0에 기본적으로 탑재되어 있는 바닐라 커널로는 우리가 원하는 disk-less를 구현할 수 없다. 그래서 여기서 우리는 따로 kernel-2.4.18 커널을 받아서 컴파일할 것이다.
다음은 컴파일시 반드시 지정해주어야 하는 커널 옵션이다!! 주의 깊게 보기 바란다!!
Block divices
<*> loopback block device support
<*> Network block device support
<*> RAM disk support
(4096) efault RAM disk size
[*] initial RAM disk(initrd) support
Networking options
<*> Network packet filtering(replaces ipchains)
<*> Socket Filtering
<*> Unix domain sockets
<*> TCP/IP networking
<*> IP:kernel level autoconfiguration
<*> IP:DHCP support
<*> IP:BOOTP support
<*> IP:RARP support
Network device support
<*> RealTek RTL-8139 C+ PCI Fast Ethernet Adapter support
ReadTek Lan Card 관련 모두 체크한다.
Character devices
<*> Enhanced Read Time Clock Support
File systems
<*> Ext3 journalling file system support
Ext3 관련 모두 체크한다. master node의 파일시스템을 확인한다.
<*> NFS file system support
<*> Provide NFSv3 client support
<*> Root file system on NFS
<*> NFS server support
<*> Provide NFSv3 server support
<*> Provide NFS server over TCP support
위에서 언급한 것은 반드시 해주어야 한다. 만일 커널 패닉이 난다면, 위의 옵션을 다시 한번 확인하자!! 성공적으로 컴파일을 했다면, 커널 이미지를 /boot 파티션으로 복사하고 부트로더에 등록해서 다음부터는 새로 만든 커널 이미지로 부팅하도록 한다.
여기서 새로운 커널 이미지로 할 것이 있다. 바로 부팅용 커널 이미지를 만드는 것이다.
바로 위에서 설치했던 mknbi를 사용할 것이다.
#mknbi-linux --ip=dhcp --output=/tftpboot/vmlinuz bzImage
위에서 보면 알겠지만 새로 만들어진 커널 이미지(bzImage)를 /tftpboot/ 아래에 부팅 커널 이미지(vmlinuz)으로 만들었다.
이제 부터 다른 read node들은 모두 이 부팅 커널 이미지를 사용해서 부팅하게 될 것이다.
===== 네트워크 설정 =====
새로운 커널로 부팅했다면, 이제 네트워크 설정을 해주어야 한다. 우선 /etc/hosts 파일을 다음과 같이 수정하자!!
127.0.0.1 localhost.localdomain localhost
210.119.108.172 cluster
210.119.108.173 node1
210.119.108.174 node2
그리고 나서 이제 real node들이 사용할 부팅 영역을 만들어 주어야 한다.
우리는 앞에서 /tftpboot 아래에 영역을 만들어 줄 것임을 암시했었다.
#cd /tftpboot
#mkdir node1 node2
#cd node1
#cp -a /bin /boot /dev /etc /lib /root /sbin /usr /var /home ./
#mkdir proc
#ln -s var/tmp tmp
#chroot /tftpboot/node1 /bin/bash
#vi /etc/fstab
---------------------------------------------------------------------------------------
210.119.108.172:/tftpboot/node1 / nfs defaults 0 0
none /dev/pts devpts gid=5,mode=620 0 0
none /proc proc defaults 0 0
none /dev/shm tmpfs defautls 0 0
---------------------------------------------------------------------------------------
node2 의 경우도 위와 마찬가지로 설정해준다.
===== dhcp 설정하기 =====
어떻게 보면 가장 중요한 부분일지도 모르겠다. 왠만한 정보를 dhcp가 부팅할 때 정보를 주기 때문에 만일 real node에서 부팅이 안된다면, dhcp문제일 가능성이 가장 높다.
--------------------------------------------------------------------------
ddns-update-style none;
default-lease-time 21500;
max-lease-time 43200;
authoritative;
option subnet-mask 255.255.255.0;
option broadcast-address 210.119.108.255;
option routers 210.119.108.254;
option domain-name-servers 210.119.108.178;
option domain-name "cluster";
shared-network WORKSTATIONS
{
subnet 210.119.108.0 netmask 255.255.255.0
{
option routers 210.119.108.254;
option subnet-mask 255.255.255.0;
range dynamic-bootp 210.119.108.150 210.119.108.170;
default-lease-time 21600;
max-lease-time 43200;
}
}
group
{
use-host-decl-names on;
option log-servers 210.119.108.172;
host node1
{
hardware ethernet 00:E0:4C:6D:54:B7;
fixed-address 210.119.108.173;
option root-path "/tftpboot/node1";
filename "vmlinuz";
}
host node2
{
hardware ethernet 00:50:FC:A5:E9:53;
fixed-address 210.119.108.174;
option root-path "/tftpboot/node2";
filename "vmlinuz";
}
}
--------------------------------------------------------------------------
===== nfs 설정 =====
/etc/exports 파일을 아래와 같이 수정해준다.
--------------------------------------------------------------------------
/tftpboot/node1 210.119.108.173(rw,no_root_squash,no_subtree_check,sync)
/tftpboot/node2 210.119.108.174(rw,no_root_squash,no_subtree_check,sync)
--------------------------------------------------------------------------
#exportfs -ar
적용시킨다.
#/etc/init.d/portmap restart
#/etc/init.d/nfs restart
====== 세팅 및 설정하기 (real node) ======
===== 네트워크 부팅 디스크 만들기 =====
real node는 하드 디스크가 없기때문에 네트워크 부팅 디스켓으로 부팅해서 램 디스크를 사용해야 한다. 그래서 부팅 디스켓을 만들어야 한다.
우선 www.rom-o-matic.org 에 접속한다. 그리고 자신에 맞는 랜카드를 선택한 후에 'Get ROM' 버튼을 눌러 이미지를 다운 받는다. 그리고 빈 플로피 디스켓을 한장 준비한다.
#cat eb-5.2.0-rtl8139.zdsk > /dev/fd0
필자의 경우는 2대의 real node가 같은 랜카드를 사용했으므로 같은 것으로 디스켓 2장을 준비했다.
이제는 각각의 real node를 부팅시켜보자!!
각 노드로 부팅하고 로그인 했다면, 수정해주어야 할 것들이 있다.
왜냐하면, master node의 파일 시스템을 그대로 복사했기 때문에 설정이 같을 수 있기 때문이다. 예를 들면, ip address 같은 것들이다.
====== ssh 설정하기 ======
이 사이트(http://people.kldp.org/~eunjea/ssh/x87.html)를 참조하기 바란다.
설정해주는 이유는 전에는 rsh를 이용해서 각 노드간에 통신을 했지만, 보안적인 문제때문에 ssh로 바뀌고 있는 추세이기 때문이다.
====== 구동 및 테스트 ======
이제 테스트 할 시간이다.
우선 master node에 일반 사용자(여기에서는 fat81 이라는 계정)을 만들어야 한다. 참고로 real node에서도 같은 'fat81' 이라는 계정이 있어야 한다. 이 것은 앞의 ssh를 설정할 때의 필요한 조건이다.
master node에 'fat81' 로 로그인하고서,
$vi /home/fat81/lamhosts
--------------------------------------------------------------------
cluster
node1
node2
--------------------------------------------------------------------
$recon -v lamhosts
.
---------------------------------
Woo hoo!!
..
..
..
---------------------------------
$lamboot -v -d lamhost
topology done
☞ 위의 명령을 내렸을 때 크게 두가지 반응이 있을 수 있다.
- 실패
- 응답 없음 ( Ctrl + C 로 나온뒤 다시 시도)
필자의 경우 위의 두경우에 모두 무시하고 다시 시도해본 결과 잘 되었다.
이제는 작동 여부를 판단 할 프로그램을 구해야 한다.
이것은 lam source파일로 구할 수 있다. 압축을 풀면 example 디렉토리가 있다. 거기에 ring 이라는 프로그램이 있을 것이다.
$mpicc -o ring ring.c
$mpirun -np 3 ring
----
{{indexmenu>:#1|skipns=/^(wiki|etc|diary|playground)$/ skipfile=/^(about|guestbook|todays)$/ }}
----