준비운동 하기
저번 문서까지는 고가용성 부하분산 클러스터를 직접 구축했었다. 이번에는 클러스터의 또 다른 분야인 과학 계산 클러스터를 만들어 볼 것이다.
과학 계산 클러스터를 구축하는 방법에는 여러가지가 있겠지만, 필자는 디스크-리스(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)
참고로, 우리가 만들어 볼 클러스터의 모습은 아래와 같다.
우선 마스터 노드에 레드햇 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