Diskless Cluster-HOWTO
Diskless Cluster using Redhat 9.0 + Openmosix ¶김동희
KAIST 물리학과
idji (at) kaist.ac.kr
v. 0.8
History:
0.8 : 최초작성 (2003/11/19)
1.1. 들어가며 ¶먼저 이 글은 클러스터를 처음 만들어 보려는 사람들을 대상으로 했음을 밝힌다.
이 문서에서는 Diskless 클러스터를 만드는 과정을 설명한다.
사용된 배포판은 Redhat 9.0 이고 커널 2.4.22 를 openmosix
패치를 한 다음 컴파일 하여 사용하였다. 부팅방법은 pxelinux 를 이용한 PXE 부팅 방법을 썼다.
사용된 하드웨어는 다음과 같다.
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.1. 배포판 설치 ¶서버에 Redhat 9을 설치한다. 특별한 작업 없이 그냥 everything 을 선택하여
설치하면 별 문제 없다. 그리고 up2date 를 써서 패키지를 최신버전으로 만든다.
다만 주의 할 것은 / 파티션을 좀 크게 잡아 놓아야한다. 그리고 한가지.
ntp 를 설정하여 시계를 맞추어 놓는다.
1.4.2. 네트워크 카드 설정 ¶다음과 같이 (자신의 시스템에 맞게 고쳐서) 설정한다.
/etc/sysconfig/network-scripts/ifcfg-eth0 의 내용: (ip-address 는 실제와 다름.)
DEVICE=eth0 BOOTPROTO=none BROADCAST=xxx.xxx.xxx.xxx IPADDR=xxx.xxx.xxx.xxx NETMASK=255.255.255.0 NETWORK=xxx.xxx.xxx.0 ONBOOT=yes TYPE=Ethernet USERCTL=no PEERDNS=no GATEWAY=xxx.xxx.xxx.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=name.x.x.x GATEWAY=xxx.xxx.xxx.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 xxx.xxx.xxx.xxx name.x.x.x 10.0.0.1 gateway.name.x.x.x 10.0.0.2 node1.name.x.x.x node1 10.0.1.1 client0.name.x.x.x client0 10.0.1.2 client1.name.x.x.x 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 name.x.x.x;
option domain-name "name.x.x.x";
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 를 읽고 따라 하면된다. 만약 커널 컴파일을 한 번도 안해보았다 하더라도 겁낼 필요는
없다. 처음에는 부팅조차 제대로 안되겠지만 계속 도전하면 결국 쉬워진다.
본인이 커널 패치와 컴파일을 한 순서는 다음과 같다.
1.4.7. openmosix 설정 ¶openmosix 의 기능을 쓰기 위해서는 /etc/openmosix.map 이라는 설정파일이 필요하다.
1 xxx.xxx.xxx.xxx 1 1 10.0.0.1 alias 2 10.0.0.2 1 이 내용은 같은 컴퓨터인 xxx.xxx.xxx.xxx/10.0.0.1 과 10.0.0.2 로 구성된 클러스터상에서 job이 migration 된다는 것을 의미한다.
자세한 문법은 HOWTO 를 읽어보시라. 한 가지 주의 할 것은 xxx.xxx.xxx.xxx 와 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.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.name.x.x.x DOMAINNAME=name.x.x.x 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 xxx.xxx.xxx.xxx name.x.x.x 10.0.0.1 gateway.name.x.x.x 10.0.0.2 node1.name.x.x.x node1 10.0.1.1 client0.name.x.x.x client0 10.0.1.2 client1.name.x.x.x 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 윈도우로 시작됨. 추가적 서비스 설정 필요.)
|
You will be awarded a medal for disregarding safety in saving someone. |











![[http]](/imgs/http.png)