====== 클러스터 구축하기 - 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)$/ }} ----