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 김영수 - 작성
설치를 위한 준비
운영체제의 설치: Debain Linux
Debain 사이트에 접속하여 Debian netinst CD image를 AMD64 버전으로 내려받는다.
Rufus, Win32 Disk imager 등을 사용하여 Bootable disk를 제작한다.
제작한 Bootable disk를 이용하여 Master node를 부팅후, install을 선택한다. (Graphical install 이 아님)
Language: C - No localization 선택
Region: Asia / Korea, Republic of 혹은 South Korea 선택
Keymap: Americal English 선택
이후 Debain 11 이전 버전에서는 상용 firmware가 포함되어 있지 않기 때문에 다음과 같은 과정을 따른다.
Load missing firmware - YES 선택
Load missing firmware from removable media - No 선택
이전 버전의 경우 Debain non-free 버전의 boot image를 받아 설치하면 해당 과정이 필요 없게 되니 참고하기 바란다.
Debian 12 이후 버전에서는 상용 firmware를 포함하고 있으므로 해당 과정이 필요하지 않다.
인터넷으로 연결된 랜카드를 Primary NIC로 선택한다.
ALiS1의 경우 마더보드 내장랜을, ALiS2와 3의 경우 PCI-e 에 장착된 외장 랜카드의 1번 랜포트를 Primary로 사용한다.
할당받은 IP, subnetmask, gateway, dns-nameserver 주소를 사용해 수동으로 네트워크를 설정한다.
기본적으로는 자동설정이 되므로 강제도 취소시켜 진입하거나 자동 설정 완료 후 설치 프로그램에서 뒤로가기를 눌러서 설정할 것.
Partitioning method - Manual 선택
기본적으로 모든 시스템은 2개의 디스크를 사용하여, device name에 따라 첫번째 디스크를 OS설치용으로, 두번째 디스크를 /home 폴더에 할당한다.
설치과정을 진행
유틸리티 설치 관련 메시지가 뜨는 경우 SSH Server와 필수 유틸리티만 설치하고 나머지는 모두 선택을 해제한다.
업데이트 및 패키지 설치
설치 직후 /etc/apt/source.list 파일을 편집하여 apt 소스 리스트를 수정한다.
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 만 입력한다.
패기지 목록을 업데이트하고 최신버전으로 업그레이드한다.
# apt update && apt upgrade -yapt를 사용해 vim 과 커널 모듈 등 필요한 계정을 패키지를 설치한다.
# apt install sudo tmux vim ifenslave ncurses-term firmware-linux필요한 유저를 sudoer 그룹에 추가한다.
# sudo usermod -aG sudo [uesrname]
네트워크 설정
네트워크 인터페이스의 이름이 보안상의 이유로 enp0s1 등의 이름으로 되어있으나, 관리를 위해 구버전으로 변경한다.
/etc/default/grub 를 열고 편집하여
GRUB_CMDLINE_LINUX="quiet nomodeset net.ifnames=0 biosdevname=0" 으로 수정한다.네트워크 설정 파일인 /etc/network/interfaces 파일을 다음과 같이 편집한다.
IP주소와 gateway 등의 정보는 실제로 학교로부터 제공받은 정보를 입력한다.
이 페이지에서는 외부 IP노출로 인한 공격방지를 위해 실제 IP를 적지 않았다.
eth0이냐 eth1 의 이름은 각각 실제 외부망과 내부망에 연결되는 ethernet device number 로 입력한다.
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
Grub설정을 새로 적용하도록 grub-update를 진행하고 시스템을 재부팅 한다.
# update-grub
# reboot
네트워크 부팅 서버 설치
hostname 및 address 설정
/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
DNSMASQ 설치 및 설정
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 Server 설치 및 설정
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 설정
booting 설정
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 호스트 기반 자동 로그인 설정
서버에서 계산 노드로, 계산 노드에서 서버로 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