[클러스터] Diskless Cluster using Redhat 9.0 + Openmosix
Diskless Cluster using Redhat 9.0 + Openmosix
Contents
1 Diskless Cluster using Redhat 9.0 + Openmosix
1.1 들어가며
1.2 어떻게 작동되나?
1.3 하드웨어 설치 및 네트웍 구성
1.4 서버를 위한 설치
1.4.1 배포판 설치
1.4.2 네트워크 카드 설정
1.4.3 DHCP 설정
1.4.4 TFTP 설정
1.4.5 NFS 설정
1.4.6 openmosix 패치 및 커널 컴파일
1.4.7 openmosix 설정
1.5 클라이언트를 위한 설치
1.5.1 pxelinux 설치
1.5.2 클라이언트 커널 설치
1.5.3 클라이언트 파일시스템 설치
1.5.4 네트웍 설정
1.5.5 필요한 서비스 설정
1.5.6 NFS 클라이언트 설정
1.5.7 기타 파일 설정
1.6 References
1.1 들어가며 #
먼저 이 글은 클러스터를 처음 만들어 보려는 사람들을 대상으로 했음을 밝힌다.
이 문서에서는 Diskless 클러스터를 만드는 과정을 설명한다. 사용된 배포판은 Redhat 9.0 이고 커널 2.4.22 를 openmosix 패치를 한 다음 컴파일 하여 사용하였다. 부팅방법은 pxelinux 를 이용한 PXE 부팅 방법을 썼다. 사용된 하드웨어는 다음과 같다.
사용된 주요 하드웨어
서버
CPU: athlon MP 1900+ 2개
M/B: asus a7m-266d
NIC: 3com 905CX-TX-M (eth1), 3com 905CX-TX-NM (eth0,2)
클라이언트
CPU: Pentium 4 1.7G
M/B: asus p4b
NIC: 3com 905CX-TX-M (eth0), 3com 905CX-TX-NM (eth1)
여기서 주목해야할 것은 클라이언트에 네트워크 카드로 3com 905CX-TX-M 을 썼다는 것인데, 이것은 905CX-TX-M 이 PXE 부팅을 지원하기 때문이다. 네트워크 부팅을 위해서는 가지고 있는 네트워크 카드가 PXE 를 지원하는 지 살펴야한다. 주의할 것은 PXE 와 Wake-On-Lan 은 전혀 별개라는 사실이다. 헷갈리지 말길. 3com의 경우 Managed 어쩌구 하는 말이 붙어있고 어떤 네트워크 카드던지 네트워크 부팅을 지원하면 PXE 2.x 인증 어쩌구 하는 말이 있다.
Openmosix 는 일종의 커널 패치로서 상당히 놀라운 기능을 한다. 예를 들어, 컴퓨터를 여러 대 붙여서 클러스터를 만들었다 치더라도, 코드를 짜서 컴파일을 한 다음 2 개의 실행 파일을 동시에 실행시키면 모두 로긴되어있는 컴퓨터의 CPU 에서 수행된다. 이걸 다른 컴퓨터의 CPU 에서 실행시키려면 PBS 같은 스케쥴러를 써서 batch job 으로 실행해야 한다. 그러나 Openmosix 커널은 자기가 알아서 클러스터 상에 놀고 있는 CPU 를 찾아서 그 곳에서 실제로 프로그램이 실행되게 한다. 상당히 유용한 기능으로 생각된다. MPI 전용 계산만 하면 필요없는 기능이겠으나 만약 serial 코드를 여러 명이 많이 실행한다면 그 유용성이 매우 높다.
1.2 어떻게 작동되나? #
클라이언트가 네트웍을 통해 부팅되는 과정은 다음과 같다. 클라이언트 컴퓨터에 바이오스 세팅이 네트워크 부팅으로 설정이 되어 있다는 가정하에 클라이언트를 켜면 네트웍 카드가 자신에 대한 정보를 네트웍에서 찾는다. 이때 클라이어트와 연결된 서버에 DHCP 서버가 제대로 설정이 되어서 작동하고 있다면 클라이언트 컴퓨터를 인식하고 클라이언트의 IP 와 다른 정보를 보내게 된다. 다른 정보라는 것은 파일이 될 수도 있는데 여기서는 pxelinux.0 라는 부트 롬 이미지 를 보내고 이 이미지는 서버로 부터 kernel을 받아오게 되어 부팅이 이루어진다. 여기서 파일일 보내고 받는 것은 tftp 를 통해 이루어진다. 일단 부팅이 시작되면 커널말고 부팅에 필요한 다른 파일들이 필요하게 되는데, 이런 파일들은 nfs 를 통해 서버에서 공유된다. 따라서 서버에 반드시 필요한 서비스는 DHCP,TFTP,NFS 이고, 이후 부터 이 서비스들을 설정하는 것과 pxelinux 등 네트웍 부팅의 자세한 설정에 대해 설명하겠다.
1.3 하드웨어 설치 및 네트웍 구성 #
단순히 크로스 케이블을 사용하여 서버와 클라이언트를 연결한다. 크로스 케이블은 구입을 하든지 직접 만들던지 하면된다. 만드는 법은 인터넷을 검색하면 많이 나온다. 서버의 eth1 은 외부로 연결되는 선을 꽂았고, eth0 과 eth2 는 클라이언트의 eth0 와 eth2 에 각각 연결한다. eth0,1,2 는 네트웍 카드를 꽂는 슬롯과 메인보드의 특성에 따라 결정되는데, 원하는 데로 eth0,1,2 가 결정되지 않았다면 그냥 슬롯의 위치를 바꾸어 꽂으면 되겠다. (소프트웨어적 방법은 모름.) 클라이언트와 서버를 연결하는 네트웍 카드들에는 192.168.x.x 또는 10.0.x.x 같은 사설 IP 를 할당한다. 여기서는 10.0.0.1 (eth0,서버), 10.0.1.1 (eth2,서버), 10.0.0.2 (eth0,클라이언트), 10.0.1.2 (eth1,클라이언트) 이다. 왜 네트웍카드를 2장씩 연결하느냐고 물을 수도 있다. 원래는 channel bonding 을 해보려했기 때문이다. 그러나, 아직 잘 안되고 있다.
1.4 서버를 위한 설치 #
아래의 내용은 RedHat 9을 배포판으로 설치하는 것을 가정합니다. [edit]1.4.1 배포판 설치 #
서버에 Redhat 9을 설치한다. 특별한 작업 없이 그냥 everything 을 선택하여 설치하면 별 문제 없다. 그리고 up2date 를 써서 패키지를 최신버전으로 만든다. 다만 주의 할 것은 / 파티션을 좀 크게 잡아 놓아야한다. 그리고 한가지. ntp 를 설정하여 시계를 맞추어 놓는다.
1.4.2 네트워크 카드 설정 #
다음과 같이 (자신의 시스템에 맞게 고쳐서) 설정한다.
/etc/sysconfig/network-scripts/ifcfg-eth0 의 내용: (ip-address 는 실제와 다름.)
DEVICE=eth0
BOOTPROTO=none
BROADCAST=143.248.16.255
IPADDR=143.248.16.242
NETMASK=255.255.255.0
NETWORK=143.248.16.0
ONBOOT=yes
TYPE=Ethernet
USERCTL=no
PEERDNS=no
GATEWAY=143.248.16.1
각각의 숫자가 무엇을 의미하는 지는 다 아시리라 믿는다. 궁금한 것은 redhat 홈페이지에 가면 customization guide 가 있다. 참고하시길.
/etc/sysconfig/network-scripts/ifcfg-eth1 의 내용:
DEVICE=eth1
ONBOOT=yes
BOOTPROTO=none
IPADDR=10.0.0.1
BROADCAST=10.0.0.255
NETMASK=255.255.255.0
NETWORK=10.0.0.0
/etc/sysconfig/network-scripts/ifcfg-eth2 의 내용:
DEVICE=eth2
ONBOOT=yes
BOOTPROTO=none
IPADDR=10.0.1.1
NETMASK=255.255.255.0
NETWORK=10.0.1.0
/etc/sysconfig/network 의 내용:
NETWORKING=yes
HOSTNAME=server.kaist.ac.kr
GATEWAY=143.248.16.1
NISDOMAIN=nisdomain.org
맨 마지막 부분의 NISDOMAIN 은 NIS 를 설정하기 위해 필요한 것이다. 당장은 필요없다.
/etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost
143.248.16.242 server.kaist.ac.kr
10.0.0.1 gateway.server.kaist.ac.kr
10.0.0.2 node1.server.kaist.ac.kr node1
10.0.1.1 client0.server.kaist.ac.kr client0
10.0.1.2 client1.server.kaist.ac.kr client1
위와 같이 설정한 후 적용시켜준다. /etc/init.d/network restart 또는 그냥 reboot 한다.
1.4.3 DHCP 설정 #
/etc/dhcpd.conf
dns-update-style none;
default-lease-time 21500;
max-lease-time 43200;
option subnet-mask 255.255.255.0;
option broadcast-address 10.0.0.255;
option routers 10.0.0.1;
option domain-name-servers 143.248.16.242;
option domain-name “server.kaist.ac.kr”;
subnet 10.0.0.0 netmask 255.255.255.0 {
range 10.0.0.2 10.0.0.100;
}
group {
filename “pxelinux.0”;
use-host-decl-names on;
host node1 {
fixed-address 10.0.0.2;
hardware ethernet 00:0A:01:D4:DA:5B;
option root-path “/tftpboot/10.0.0.2”;
}
}
자세한 내용은 부디 DHCP 에 관한 문서를 찾아보기를 바란다…(자세한 건 본인도 모른다.) 다만 여기서 짚고 넘어갈 것은 router 가 서버의 eth0 (10.0.0.1) 로 설정이 되었다는 것과 클라이언트로 보낼 파일의 이름, IP 등이다. 위의 설정은 ethernet address 가 00:0a:01:d4:da:5b 인 네트웍 카드를 발견하면 그 주소를 10.0.0.2 로 정하고, 클라이언트의 root 디렉토리를 서버의 /tftpboot/10.0.0.2 로 정한다는 것이다. 클라이언트의 호스트네임과 dhcpd 설정의 host … 가 같아야 되는지는 모르겠지만 여기서는 똑같이 node1 이라고 설정했다. 다 설정했으면 /sbin/chkconfig dhcpd on 을 하여 부팅 될 때 시작되도록 하고, /etc/init.d/dhcpd start 해서 DHCP 데몬을 실행한다.
1.4.4 TFTP 설정 #
/etc/xinetd.d/tftp 에서 diable=no 로 바꾼다.
# default: off
# description: The tftp server serves files using the trivial file transfer \\
# protocol. The tftp protocol is often used to boot diskless \\
# workstations, download configuration files to network-aware printers, \\
# and to start the installation process for some operating systems.
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /tftpboot
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}
여기서 diable=no 는 tftp 서버를 사용한다는 의미고, server_args = -s /tftpboot tftp의 root 가 /tftpboot 라는 의미다. 다 했으면 /etc/init.d/xinetd restart 하여 xinetd 를 다시 시작한다.
1.4.5 NFS 설정 #
/etc/export 파일을 편집한다.
/tftpboot/10.0.0.2 10.0.0.2(rw,sync,no_root_squash,no_subtree_check)
/usr 10.0.0.2(rw,sync,no_root_squash,no_subtree_check)
/opt 10.0.0.2(rw,sync,no_root_squash,no_subtree_check)
/var 10.0.0.2(rw,sync,no_root_squash,no_subtree_check)
/home 10.0.0.2(rw,sync,no_root_squash,no_subtree_check)
클라이언트 (10.0.0.2) 의 root 가 /tftp/10.0.0.2 가 될 것이고, 부팅에 필요하지 않은 파일들은 nfs 로 server 와 공유한다. nfs를 시작하기 위해서 /sbin/chkconfig portmap on, /sbin/chkconfig nfs on, /sbin/chkconfig nfslock on, /etc/init.d/portmap start, /etc/init.d/nfs start, /etc/init.d/nfslock start 하여 데몬들을 재시작한다.
1.4.6 openmosix 패치 및 커널 컴파일 #
http://openmosix.sourceforge.net/ 가 openmosix 의 공식 사이트이다 커널 패치는 여기에 있는 HOWTO 를 읽고 따라 하면된다. 만약 커널 컴파일을 한 번도 안해보았다 하더라도 겁낼 필요는 없다. 처음에는 부팅조차 제대로 안되겠지만 계속 도전하면 결국 쉬워진다. 본인이 커널 패치와 컴파일을 한 순서는 다음과 같다.
ftp.kr.kernel.org 에서 linux-2.4.22.tar.bz2 를 받아서 /usr/src 밑에 저장한다.
tar xjvf linux-2.4.22.tar.bz2 를 해서 압축을 푼다. 그러면 /usr/src/linux-2.4.22 라는 디렉토리에 압축이 풀리게 된다.
ln -s linux-2.4.22 linux 와 ln -s linux-2.4.22 openmosix 를 해서 심볼릭 링크를 만든다.
openmosix 홈페이지에서 openMosix-2.4.22-1.bz2 를 다운로드 받아서 /usr/src 에 놓는다.
linux-2.4.22 디렉토리로 가서 bzcat ../openMosix-2.4.22-1.bz2 | patch -p1 을 하여 커널을 패치 한다.
openmosix HOWTO 와 여러 커널 설정 관련 문서를 읽고 시행착오를 반복하여 커널을 컴파일한다. (make mrproper; make menuconfig; make dep; make clean; make bzImage; make modules; make modules_install; make install) 이때 주의할 것은 nfs 관련 옵션 중에서 kernel 레벨의 서버에 관한 항목이 있는데 이것을 반드시 on 해야된다. redhat 은 이것을 이용한다. 한가지, 커널
설정할 때 Diskless 클러스터를 구축하는 것이므로 MFS 는 켤 필요가 없다.
부팅이 실패하면 lilo 메뉴로 들어와서 이전 커널로 부팅하고, 옵션 새로 설정하고 컴파일한다.
커널 컴파일이 제대로 되어서 부팅이 잘 되면, openmosix-tools 를 설치한다. README 를 보면 redhat 의 경우는 어떻게 하라는 말이 있다. 그대로 컴파일해서 설치하면 된다.
1.4.7 openmosix 설정 #
openmosix 의 기능을 쓰기 위해서는 /etc/openmosix.map 이라는 설정파일이 필요하다.
1 143.248.16.242 1
1 10.0.0.1 alias
2 10.0.0.2 1
이 내용은 같은 컴퓨터인 143.248.16.242/10.0.0.1 과 10.0.0.2 로 구성된 클러스터상에서 job이 migration 된다는 것을 의미한다. 자세한 문법은 HOWTO 를 읽어보시라. 한 가지 주의 할 것은 143.248.16.242 와 10.0.0.1 은 같은 컴퓨터 이지만 둘 다 안 넣으면 에러가 난다는 것이다. 부팅 될 때 자동으로 openmosix 를 시작하기 위해서는 /sbin/chkconfig –add openmosix; /sbin/chkconfig openmosix on 을 해서 부팅 될 때 시작되는 서비스에 포함시킬수 있다. HOWTO 와 openmosix-tools 에 있는 README 끝부분을 반드시 읽어야 한다. 몇가지 수정할 것이 더 있다. (/etc/inittab, /etc/rc.d/init.d/sshd)
1.5 클라이언트를 위한 설치 #
클라이언트를 설치할 차례이다. 클라이언트가 쓸 디스크 공간은 서버의 /tftpboot/10.0.0.2/ 아래의 디렉토리들이다.
1.5.1 pxelinux 설치 #
우선, 네트워크 부팅이 되도록 pxelinux 를 설치해야 된다. 작업은 간단하다. 파일하나 복사하고 디렉토리 하나 만들고 텍스트 파일 하나 만들면 끝이다. 우선 syslinux 홈페이지 http://syslinux.zytor.com/ 에 가서 syslinux 패키지를 내려받는다. 압축을 풀어보면 pxelinux.0 라는 파일이 하나가 있는데 실제로 쓸 파일은 이것 하나 뿐이다. pxelinux.0 를 /tftpboot 에 복사한다. 그리고, pxelinux.cfg 라는 디렉토리를 /tftpboot 아래에 만든다. /tftpboot/pxelinux.cfg 아래에 default 라는 파일을 vi 로 만들고 다음 내용을 넣는다.
label linux
kernel vmlinuz-2.4.22-openmosix-1-clients
append root=/dev/nfs ip=dhcp init=/sbin/init
kernel 다음에 오는 것은 클라이언트로 보낼 커널 이름이다. 다른 건 건드리지 말고, kernel 정하고 싶은데로 바꾼다.
1.5.2 클라이언트 커널 설치 #
클라이언트용 커널을 따로 컴파일 해야 한다. openmosix 패치된 커널을 클라이언트에 맞게 바꾸고, 쓸데없는 것들은 다 뺀다. 꼭 들어가야될 옵션은 IP:kernel level autoconfiguration -> dhcp,bootp 와 NFS 에 관련되는 내용들이다. 특히, root file system on NFS 는 반드시 체크한다. 모든 항목은 모듈로 설정해서는 안된다. 서버 커널을 컴파일 할 때와 같이 하는데 make bzImage 까지만 한다. 그러면, 컴파일된 커널이 arch/i386/boot 밑에 bzImage 라는 이름으로 있다. 이름을 적절히 바꾸어서 /tftpboot 로 복사한다. 이 이름은 당연히 pxelinux 설정할 때의 커널 이름과 같아야 한다. 그리고 다음의 명령을 실행한다.
mknod /dev/nfs c 0 255
/usr/sbin/rdev (kerne-name) /dev/nfs
무슨 뜻인지는 모르겠으나 해 주어야 한다.
1.5.3 클라이언트 파일시스템 설치 #
클라이언트 파일시스템을 만드는 것은 단순히 디렉토리 만들고 파일을 복사하는 작업들이다. 먼저 /tftpboot 밑에 10.0.0.2 디렉토리를 만든다. 하필이면 ip 주소인 이유는 dhcp 설정할 때 그렇게 했기 때문이다. /tftpboot/10.0.0.2 밑에 cp -a /bin /boot /dev /etc /lib /root /sbin /tftpboot/10.0.0.2/ 로 해서 주요 디렉토리를 복사한다. -a 옵션은 퍼미션을 유지하면서 복사하라는 것이다. 그리고 /tftpboot/10.0.0.2 밑에 root, usr, home, opt, mnt, proc, tmp 디렉토리를 만들어 준다. usr 밑에도 반드시 복사해야 할 파일들이 있는데, /usr/sbin, /usr/bin /usr/lib 를 -a 옵션을 주어서 복사한다. 이런 파일들을 복사하는 이유는 /usr 같은 디렉토리들을 nfs 로 마운트 하기 전에 필요한 파일들이기 때문이다. var 디렉토리도 필요한데 다 필요한 것이 아니라 rpm 데이터베이스만 있으면 되므로 /var 와 똑같이 디렉토리만 만들고 /var/lib/rpm/* 만 -a 옵션으로 복사해온다.
1.5.4 네트웍 설정 #
/tftpboot/10.0.0.2/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
IPADDR=10.0.0.2
NETMASK=255.255.255.0
NETWORK=10.0.0.0
ONBOOT=yes
/tftpboot/10.0.0.2/etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
ONBOOT=yes
BOOTPROTO=none
IPADDR=10.0.1.2
BROADCAST=10.0.1.255
NETMASK=2555.255.255.0
NETWORK=10.0.1.0
USERCTL=false
/tftpboot/10.0.0.2/etc/sysconfig/network
NETWORKING=yes
HOSTNAME=node1.server.kaist.ac.kr
DOMAINNAME=server.kaist.ac.kr
GATEWAY=10.0.0.1
NISDOMAIN=nisdomain.org
/tftpboot/10.0.0.2/etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost
143.248.16.242 server.kaist.ac.kr
10.0.0.1 gateway.server.kaist.ac.kr
10.0.0.2 node1.server.kaist.ac.kr node1
10.0.1.1 client0.server.kaist.ac.kr client0
10.0.1.2 client1.server.kaist.ac.kr client1
1.5.5 필요한 서비스 설정 #
클라이언트는 오직 계산을 위해 쓰여지므로 잡다한 데몬들이 필요없다. 우선 모든 서비스를 제거한다. 먼저 root 디렉토리를 /usr/sbin/chroot /tftpboot/10.0.0.2 해서 /tftpboot/10.0.0.2 로 바꾼다. /etc/init.d 에 있는 서비스 이름을 single, killall, functions, microdoce_ctl, kudzu, network, portmap, nfslock, netfs, sshd, crond 를 제외한 모든 서비스를 /sbin/chkconfig –del (service_name) 로 모두 제거한다. 그리고 exit 로 원래 root 를 원래대로 바꾼다.
1.5.6 NFS 클라이언트 설정 #
/tftpboot/10.0.0.2/etc/fstab 의 내용을 다음과 같이 해서 주요 디렉토리를 nfs 를 통해 마운트하도록 한다.
10.0.0.1:/tftpboot/10.0.0.2 / nfs rw,defaults 0 0
10.0.0.1:/usr /usr nfs rw,defaults 0 0
10.0.0.1:/home /home nfs rw,defaults 0 0
10.0.0.1:/opt /opt nfs rw,defaults 0 0
none /dev/pts devpts gid=5,mode=620 0 0
none /proc proc defaults 0 0
none /dev/shm tmpfs defaults 0 0
/dev/cdrom /mnt/cdrom udf,iso9660 noauto,owner,kudzu,ro 0 0
/dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0
1.5.7 기타 파일 설정 #
/tftpboot/10.0.0.2/etc/inittab 에서 id:5:initdefault: 를 id:3:initdefault: 로 바꾸어서 text 모드로 부팅하도록 한다. (cf. 5 는 X 윈도우로 시작됨. 추가적 서비스 설정 필요.)