Parallel Compute System

*** 아래 문서는 Debian 12를 기준으로 작성되었으며, 이후 버전에서의 동작을 보장하지 않음.

*** 어디까지나 참고용으로 활용하길 바라며, 세부적인 설정은 관리자가 적절히 수정하길 권장함.

ALiS(A Light Simulator: 공주대 이호석 교수님 개발) 시스템을 사용하는데 필요한 병렬 연산 시스템의 빌드와 설치에 관해 다루는 문서이다.

공주대학교 Nanophysics Lab.의 위키페이지를 참조하여 중앙대 나노광학연구실에 맞게 수정 및 추가하였음.
이 문서는 CC BY-SA 4.0 라이선스에 따라 자유롭게 사용할 수 있음.

원본의 모든 권리는 공주대학교 Nanophysics lab.의 이호석교수님에게 있음.
원문 : nano.kongju.ac.kr

CAU NPL Version

2024.08.27 김영수 - 작성


deb http://deb.debian.org/debian stable main contrib non-free-firmware

deb http://deb.debian.org/debian stable-updates main contrib non-free-firmware

deb http://security.debian.org/debian-security stable/updates main contrib non-free-firmware

주) Debian 12이전 버전에서는 non-free-firmware가 아닌 non-free 만 입력한다.

auto lo

iface lo inet loopback

 

auto eth0

iface eth0 inet static

    address 000.000.000.000/24

    subnetmask 255.255.255.0

  gateway 000.000.000.000

    dns-nameservers 000.000.000.000 111.111.111.111

 

auto eth1

iface eth1 inet static

    address 10.1.1.1/24

# update-grub

# reboot

/etc/hosts 파일에 다음의 내용을 추가한다.

10.1.1.1 srv

10.1.1.101 n01

10.1.1.102 n02

10.1.1.103 n03

10.1.1.104 n04

10.1.1.105 n05

10.1.1.106 n06

10.1.1.107 n07

10.1.1.108 n08

10.1.1.109 n09

10.1.1.110 n10

10.1.1.111 n11

10.1.1.112 n12

10.1.1.113 n13

10.1.1.114 n14

10.1.1.115 n15

/etc/ethers 파일을 생성하고 각 compute node의 MAC address와 할당할 IP address 를 작성한다.
compute node의 MAC address는 BIOS 설정에서 network booting을 활성화 후 부팅 시도할 때 확인할 수 있다.

# touch /etc/ethers

00:e0:4c:68:02:d9 n01

00:e0:4c:68:03:5d n02

00:e0:4c:68:03:85 n03

1c:fd:08:70:1b:19 n04

1c:fd:08:70:1b:8b n05

1c:fd:08:70:1b:b8 n06

1c:fd:08:70:1c:ee n07

1c:fd:08:70:1f:3b n08

1c:fd:08:70:1f:89 n09

1c:fd:08:70:1f:8d n10

1c:fd:08:70:1f:9f n11

1c:fd:08:70:1f:b7 n12

1c:fd:08:70:1f:d5 n13

1c:fd:08:70:20:87 n14

1c:fd:08:70:20:9b n15


compute node의 network 부팅을 위해 DHCP 서버와 TFTP 서버의 역할을 하는 dnsmasq 패키지와 네트워크 부팅에서 부트로더의 역할을 하는 파일을 포함한 pxelinux & syslinux 패키지를 설치한다.

# apt install dnsmasq pxelinux syslinux syslinux-efi

설치가 완료되면 /etc/dnsmasq.d/default 파일을 다음과 같이 작성하여 dnsmasq 데몬을 설정한다.

interface=eth1

dhcp-range=10.1.1.10,10.1.1.200,255.255.255.0,1h

dhcp-match=set:BIOS,option:client-arch,0

dhcp-match=set:UEFI,option:client-arch,7

dhcp-match=set:UEFI,option:client-arch,9

dhcp-boot=tag:BIOS,pxelinux.0

dhcp-boot=tag:UEFI,syslinux.efi

read-ethers

enable-tftp

tftp-root=/srv/tftp

tftp 서버를 통해 전송할 파일 및 설정이 위치할 directory: /srv/tftp, /srv/tftp/pxelinux.cfg 를 생성한다.

 # mkdir -p /srv/tftp/pxelinux.cfg

이후 /srv/tftp directroy 안에 vmlinuz, initrd.img, pxelinux.0, ldlinux.c32 파일에 대한 symbolic link를 만든다.

# mkdir -p /srv/tftp/pxelinux.cfg

# cd /srv/tftp

# ln -s /vmlinuz

# ln -s /initrd.img

# ln -s /usr/lib/PXELINUX/pxelinux.0

# ln -s /usr/lib/SYSLINUX.EFI/efi64/syslinux.efi

# ln -s /usr/lib/syslinux/modules/bios/ldlinux.c32

# ln -s /usr/lib/syslinux/modules/efi64/ldlinux.e64

다음으로 PXELINUX 설정파일을 다음과 같이 만들어준다.

# touch /srv/tftp/pxelinux.cfg/default
# vi /srv/tftp/pxelinux.cfg/default

default Debian

prompt 1

timeout 2

label Debian

kernel vmlinuz

append ro initrd=initrd.img ip=dhcp net.ifnames=0 biosdevname=0 root=/dev/nfs nfsroot=10.1.1.1:/srv/nfs

dnsmasq 데몬을 다시 시작한다.

# systemctl restart dnsmasq

작업이 완료되면 compute node를 하나씩 부팅해서 실제로 master node로 부터  IP할당 여부, 부팅 정보와 커널, initial ramdisk image (initrd.img) 파일을 잘 받아 오는지 반드시 확인한다. 


nfs-kernel-server, debootstrap, ntpsec 패키지를 설치한다. 각 패키지는 NFS 서버, debian base system installer, time sync 를 위한 패키지이다.

# apt install debootstrap nfs-kernel-server ntpsec

compute node가 네트워크로 읽어들여 부팅할 directory 를 생성하고, 해당 위치에 debootstrap을 이용해 debian-basesystem 을 설치한다.

# mkdir /srv/nfs

# debootstrap stable /srv/nfs

이후 master node와 동일하게 /srv/nfs/etc/apt/source.list 파일을 수정해준다.

deb http://deb.debian.org/debian stable main contrib non-free-firmware

deb http://deb.debian.org/debian stable-updates main contrib non-free-firmware

deb http://security.debian.org/debian-security stable/updates main contrib non-free-firmware

호스트 목록과 ssh server의 암호화 키, 사용자 계정 등이 공유되도록 하기 위해 /etc directory에 있는 해당 설정 파일들을 /srv/nfs/etc 디렉토리로 복사한다.

# rm /srv/nfs/etc/hostname

# cp /etc/apt/sources.list /srv/nfs/etc/apt/

# cp -r /etc/ssh /etc/hosts /etc/passwd /etc/shadow /etc/group /etc/gshadow /srv/nfs/etc/

다음으로 chroot 명령을 사용하여 설치된 compute node용 debian base system의 root filesystem을 업데이트 하고, 필수 패키지를 설치한다.

# chroot /srv/nfs apt update

# chroot /srv/nfs apt upgrade

# chroot /srv/nfs apt install aptitude sudo vim kbd locales nfs-common openssh-server

# chroot /srv/nfs dpkg-reconfigure tzdata

# chroot /srv/nfs dpkg-reconfigure locales

이때 timezone (tzdata) 설정시 Asia / Seoul 을 선택하고 locales 설정시에는 모든 체크리스트를 해제한다.

지금까지 만든 base system이 NFS를 통해 compute node로 서비스될 수 있도록 /etc/exports 파일의 맨 아래에 다음의 내용을 추가한다.

# vi /etc/exports

/srv/nfs 10.1.1.1/24(ro,no_root_squash,no_subtree_check)

/home 10.1.1.1/24(rw,no_root_squash,no_subtree_check,fsid=0)

/etc/ntpsec/ntp.conf 파일의 pool을 아래와 같이 수정하여 시간 동기화 설정을 해준다.

# vi /etc/ntpsec/ntp.conf

pool 0.kr.pool.ntp.org iburst

pool 1.kr.pool.ntp.org iburst

pool 2.kr.pool.ntp.org iburst

pool 3.kr.pool.ntp.org iburst

변경한 NFS 및 NTP 서버 설정이 적용되도록 다음과 같은 명령을 실행하여 두 서버 데몬을 재시작한다.

# systemctl restart nfs-kernel-server ntpsec

compute node 부팅을 위해 필요한 kernel-module 을 로드하도록 아래와 같이 /etc/initramfs-tools/modules 파일의 끝에 다음과 같은 문구를 추가한다.

#vi /etc/initramfs-tools/modules

autofs4

nfsv4

update-initramfs -u 명령을 이용해 initrd.img 파일을 업데이트 한다.

# update-initramfs -u

root filesystem (/) 및 사용자 계정 디렉토리 (/home), 그리고 시스템에 필요한 임시 디렉토리 들을 automount 하기 위해
/srv/nfs/etc/fstab 파일에 다음의 내용을 작성한다.

10.1.1.1:/srv/nfs / nfs ro,nolock 0 1

10.1.1.1:/ /home nfs sync 0 2

tmpfs /var tmpfs defaults 0 0

tmpfs /tmp tmpfs defaults 0 0

compute node의 시간을 master node와 동기화 되도록 하기 위해 /srv/nfs/etc/systemd/timesyncd.conf 파일을 다음과 같이 만든다.

# vi /srv/nfs/etc/systemd/timesyncd.conf

[Time]

NTP=10.1.1.1

Debian 10 (buster) 이후 버전인 경우 compute node에서 임시폴더 디렉토리의 하위 구조가 만들어지지 않아 각종 에러가 발생한다.
이를 해결하기 위해 만들어지도록 하기 위해 다음 내용으로 /srv/nfs/etc/tmpfiles.d/vartmp.conf 파일을 만든다. 

#  vi /srv/nfs/etc/tmpfiles.d/vartmp.conf

d /var/backups  0755 - - -

d /var/local    2775 root staff -

d /var/mail     2775 root mail -

d /var/opt      0755 - - -

d /var/tmp      1777 - - -

Debian 10 (buster) 이후 버전인 경우 systemctl mask 명령으로 systemd-sysusers 데몬이 부팅시 자동으로 실행되지 않도록 한다.

# chroot /srv/nfs systemctl mask systemd-sysusers


서버에서 계산 노드로, 계산 노드에서 서버로 ssh를 사용하여 접속할 때 패스워드를 입력하지 않아도 자동으로 로그인이 되도록 하기 위하여 /etc/ssh/sshd_config.d/ 및 /srv/nfs/etc/ssh/sshd_config.d/ 디렉토리 안에 hbauth.conf 파일을 다음과 같은 내용으로 만든다.

# vi /etc/ssh/sshd_config.d/hbauth.conf 

HostbasedAuthentication yes

IgnoreRhosts no

또한, 서버 및 노드의 ssh 클라이언트 설정 파일인 /etc/ssh/ssh_config.d/ 및 /srv/nfs/etc/ssh/ssh_config.d/ 디렉토리 안에 

hbauth.conf 파일을 다음과 같은 내용으로 만든다.

# vi /etc/ssh/ssh_config.d/hbauth.conf

HostbasedAuthentication yes

EnableSSHKeysign yes

하드 링크를 사용하여 계산 노드가 서버와 같은 키를 사용하도록 설정하고, 다음 명령으로 신뢰할 수 있는 호스트 목록 파일인 /etc/ssh/shosts.equiv 파일과 알려진 호스트 키 목록 파일인 /etc/ssh/ssh_known_hosts 파일을 생성한다.

# ln -f /etc/ssh/ssh_host_* /srv/nfs/etc/ssh/

# KEY=$(cut -d' ' -f1,2 /etc/ssh/ssh_host_ed25519_key.pub)

# sed -nr "s/(^10.1.1.\S*)\s*.*/\1/p" /etc/hosts > /etc/ssh/shosts.equiv

# ssh-keyscan -t ed25519 $(grep '^10\.' /etc/hosts) | sort > /etc/ssh/ssh_known_hosts 

다음 명령을 사용하여 만들어진 호스트 및 키 목록 파일들의 퍼미션을 644로 변경하고 하드 링크를 만든다.

# chmod 644 /etc/ssh/shosts.equiv /etc/ssh/ssh_known_hosts

# ln -f /etc/ssh/ssh_known_hosts /srv/nfs/etc/ssh/ssh_known_hosts

# ln -f /etc/ssh/shosts.equiv /srv/nfs/etc/ssh/shosts.equiv 

# ln -f /etc/ssh/shosts.equiv /srv/nfs/root/.shosts
# ln -f /etc/ssh/shosts.equiv /root/.shosts

계산 노드를 재부팅하거나 계산 노드의 openssh-server 데몬을 재 시작한 후 패스워드 없이 계산 노드에 접속이 되는지 확인한다.

# ssh n01
# exit


아래는 계산 노드에서 nfsroot를 사용하는 경우 서버와 계산 노드의 패스워드 파일에 하드링크를 걸어 계정을 동기화하는 방법에 대한 설명으로, 계산 노드에서 필요로 하는 모든 시스템 계정이 서버에도 동일하게 존재하는 경우에만 사용할 수 있으며, 패스워드 변경 등의 작업은 오직 서버에서만 가능하다. 

하루 한 번씩 패스워드가 강제로 동기화 되도록 /etc/cron.daily/passwdsync 파일을 다음 내용으로 만든다.

# vi /etc/cron.daily/passwdsync

#!/bin/sh
ln -f /etc/passwd /etc/shadow /etc/group /etc/gshadow /srv/nfs/etc/

서버에 계정을 추가할 때 노드에도 함께 추가되도록 하기 위해 다음과 같은 내용으로 /usr/local/sbin/adduser 파일을 만든다.

# vi /usr/local/sbin/adduser

#!/bin/sh

test -x ${0#/usr/local} && ${0#/usr/local} $@
ln -f /etc/passwd /etc/shadow /etc/group /etc/gshadow /srv/nfs/etc/

만들어진 파일들의 퍼미션을 755로 변경하고, 계정을 삭제 할 때에도 노드의 계정이 함께 삭제되도록 /usr/local/sbin/deluser로 심볼릭 링크를 만든다.

# chmod 755 /etc/cron.daily/passwdsync

# chmod 755 /usr/local/sbin/adduser
# ln -sf adduser /usr/local/sbin/deluser