작성 이유

사람은 자기가 하고싶은 일을 해야합니다. 그게 다소 비효율적일지라도 재미있어 보인다면 과감히 해봐야죠. 논문쓰느라 바쁜데, 수업때문에 바쁜데… 이런 저런 핑계를 대면 항상 우선순위에서 밀려나는 것은 늘 내 마음 한구석에서 ‘언제 한번 해봐야겠다’라는 작은 욕구입니다.

몇년동안 저만의 장난감 서버를 만들고 싶었습니다만, 빈번히 그 시도가 미뤄졌습니다. NAS같은 경우는 (쓸만하게끔 쓰려면 시놀로지를 사야하니깐) 돈이 많이 들기도 하고, 그럴만한 환경이 되지 못한다는 특징(기숙사)도 있긴 했습니다만 모두 핑계지요.

그래서 이번에 과감하게 한번 해보려고 합니다. 학교에서 파밍한 라즈베리파이와 연구실에서 파밍한 라즈베리파이, 그리고 제가 1년전쯤 호기심에 따로 구매했던 30만원짜리 Khadas Vim4 를 가지고 만들 생각입니다.

자체 클러스터 서버 제작기

재료

오해의 소지를 없애기위해 위에서 라즈베리파이 파밍은 모두 각 소유자로부터 허가를 받은 것입니다. 연구실 라즈베리파이야 실 소유주인 동료들로부터 일종의 거래를 했고 (태생이 연구실 비품이 아님), 학교 라즈베리파이의 경우 어차피 새로 사면서 버릴 것들이라며 관련 담당자 선생님과 교수님의 허가가 있었습니다.

사실 버릴 라즈베리파이라서 제대로 작동할지는 의문이긴 한데, 일단 작동 시켜 보면서 확인해보려고 합니다.

그리고 보통 라즈베리파이 클러스터를 보면 아래 링크의 유튜브 영상처럼 되어있는 경우가 많습니다.

라즈베리 파이 클러스터 유튜브 영상

참고 이미지

그래서 클러스터를 만드려면 보드 말고도 전체 구조물 렉 프레임이나 스위치, 포트 등을 필요로 합니다. 그리고 전원 관련도 필요한데, 이건 오늘은 다루지 않습니다. 오늘은 Khadas Vim4랑 노닥거리면서 그 기틀을 만들 것입니다.

주요 사용처 고민

라즈베리파이를 여러개를 묶어서 어따 쓸 수 있을까요? 이런 것들을 Gemini와 함께 고민을 했는데, 크게 쿠버네티스와 HPC가 있었습니다. 한쪽은 안정적인 어플리케이션 관리, 다른 한쪽은 연산량 합치기 정도의 느낌이죠. 사실 둘 모두 뭘 하더라도 실질적으로 쓸모 있는 무언가를 만들긴 어려울 겁니다. 애초에 목적은 교육(이라 쓰고 장난감 서버 만들기)이니까요.

그래서 성능적으로 보진 않고 가지고 놀만한 것이 무엇이 있나 봤는데 과학 시뮬레이션 관련 내용이 있었습니다. 그래서 HPC쪽으로 구성하는 걸로 생각을 했습니다. 나중에 뭘 사용할지는 그때 결정하기로 하고…

일단 뭘 하든지 우선 제가 인터넷으로 원격으로 이 클러스터에 접속할 수 있어야 겠죠. 그게 최우선 조건입니다.

그렇다면 그건 어떻게 하고, 그 대상은 뭘로 할까요?

Head Node 설정 및 외부 기기 설정

우선 보드들 중에서 으뜸을 골라야 합니다. 주방 셰프같은 친구죠.

전 Khadas Vim4가 있기 때문에 이 친구를 head node로 했습니다. 얘가 어지간한 라즈베리파이보다 좋기 때문이죠. (그만큼 가격도 비싸고…)

khadas vim4 하드웨어

그러면 이 친구랑 제가 주로 사용하는 PC와 스마트폰에서 이 Khadas Vim4에 접속하면 되겠죠? 그래야 클러스터로 연결된 다른 라즈베리파이도 건들 수 있으니까요.

인터넷을 사용하는데, 그렇다고 포트를 열기엔 보안이 걱정되고. Anydesk를 쓰자니 모니터가 하나 항상 켜져야 하니. 곤란하죠. 새로운 방법을 찾아보았습니다.

tailscale

이 사이트를 통해서 해결했습니다. 구글이나 깃허브 계정을 사용해서 각 기기에서 로그인 하면 해당 계정에 연결한 기기들끼리만 통하는 일종의 VPN ip를 받습니다. 그걸 통해서 서로 인터넷을 거쳐서 통신하는 것이 가능합니다. 포트를 열지 않아도 말이죠.

윈도우나 스마트폰쪽은 관련 프로그램을 다운받아서 사용하기에 크게 어렵지 않습니다. 공홈 들어가시면 쉽게 할 수 있도록 되어있습니다.

그리고 사실 우분투쪽도 어렵진 않습니다.

VIM4의 Ubuntu 데스크톱에서 ‘설정(Settings)’에서 왼쪽 메뉴에서 ‘공유(Sharing)’를 찾아 클릭하고, 창 오른쪽 상단의 토글 스위치를 눌러 ‘켬(On)’ 상태로 만듭니다.

‘원격 데스크톱(Remote Desktop)’ 메뉴에서 ‘원격 데스크톱’과 ‘RDP’를 활성화합니다. (VNC보다 RDP가 더 빠르고 현대적입니다)

‘인증(Authentication)’ 섹션에서 사용자 이름(보통 현재 계정)과 새로운 비밀번호를 설정합니다.

대충 이정도 설정을 해준 다음에

curl -fsSL https://tailscale.com/install.sh sh

이걸 통해서 설치하시고

sudo tailscale up

이 명령어로 키시면 됩니다.

만약 설치가 안된다면 업데이트를 좀 하시고, 그래도 안되면 LLM에게 물어보면 쉽게 해결 될 것입니다.

그러면 각 기기별로 tailscale로부터 부여받은 새로운 ip들이 있을겁니다.

그러면 윈도우에서 “원격 데스크톱 연결(RDP연결)”을 해봅시다.

ip는 tailscale이 부여한 서버측 ip를 입력합시다. 저에겐 Khadas Vim4의 ip(tailscale이 할당한)죠.

그러면? 아마 연결이 될 겁니다.

Khadas_Vim4

이런식으로 말이죠. 이거 윈도우에서 찍은 것입니다. 윗부분은 ip가 있어서 빼고 찍었습니다.

여기까지 했다면 사실 원격 접속 서버? 워크스테이션? 정도까진 한 것입니다.

보면 아시겠지만, 서버가 뭐 별게 있겠습니까. 원격으로 접속할 수 있고, 24시간 내내 켜져있고, 내가 원하는 서비스를 언제든 누릴 수 있다는 것. 그게 서버 아닐까요.

웹 사이트를 호스팅한다거나 하는 용도로는 쓸 생각이 없어서, 저는 그냥 이렇게 tailscale로 원격 워크스테이션같이 쓰려고 합니다.

여기서 로그아웃된 상태로 tailscale을 시스템으로 켠 상태로 두고 싶다면 다음 명령어를 치세요

sudo systemctl enable –now tailscaled

이러면 전원 넣기만 해도 알아서 켜지면서 접속 가능하게 됩니다.

클러스터 준비

이제 원격 접속이 되었으니, 이 Khadas VIM4를 앞으로 연결될 라즈베리파이를 ‘지휘’할 ‘헤드 노드(Head Node)’로 만드는 작업을 할겁니다. 그냥 PC들 중에서 제일 좋은 스펙을 가진 PC가 Head Node인거죠.

지금부터 VIM4의 원격 데스크톱(RDP)으로 접속한 상태에서, 터미널(Terminal)을 열고 다음 작업들을 순서대로 진행하시면 됩니다. (그냥 모니터 키마 연결해서 써도 되긴 합니다만, 원격 접속한 기분 내야죠?(극한의 낭만 끌어 올리기))

다음과 같은 과정을 해줍시다.

  1. HPC 프로그램 컴파일에 필요한 필수 개발 도구 설치
  2. Pi들(클러스터 구성 PC들)이 접속할 공유 폴더(NFS) 생성
  3. Pi들에게 작업을 분배할 MPI 라이브러리 설치

1단계: 필수 개발 도구 설치

제가 재미를 위해 굴리고 싶은 N-Body, OpenFOAM 같은 과학 프로그램들은 소스 코드를 직접 ‘컴파일’(빌드)해야 하는 경우가 많습니다. 그러니 컴파일러를 설치합시다.

저는 Khadas가 완전 비어있었어서 하는건데, 원래 쓰던게 있으시면 굳이 필요는 없습니다.

sudo apt update

sudo apt install build-essential git gfortran cmake

  • build-essential: C/C++ 컴파일러(gcc, g++)와 make 도구
  • git: 소스 코드를 다운로드할 때 쓰는데… 이건 다들 아시죠?
  • gfortran: 저도 이번에 처음 알게된 것인데, WRF 등 많은 과학 프로그램이 사용하는 포트란(Fortran) 컴파일러입니다.
  • cmake: 앞으로 잘 사용할 빌드 시스템입니다.

여기까지는 클러스터랑은 큰 관련 없고, 기초적인 것들을 마련하는 과정입니다.


2단계: NFS 서버 설치

이제 진짜 클러스터를 구성하는 단계입니다. 라즈베리 파이들을 연결하기 전에 먼저 head node부터 그 준비를 하는 단계죠.

우선 클러스터의 ‘공유 폴더’를 만듭니다. 나중에 8대의 Pi가 모두 이 폴더를 자신의 하드디스크처럼 연결하여 동일한 파일을 보고 작업을 수행합니다.

1번 NFS 서버 프로그램 설치:

sudo apt install nfs-kernel-server

2번 공유할 폴더 생성:

sudo mkdir -p /cluster/shared

/cluster/shared라는 이름의 폴더를 만드는 것입니다.

3번 폴더 권한 설정: 홈 클러스터에서는 권한 문제로 골치 아프지 않도록 가장 개방적으로 설정합니다.

sudo chown -R nobody:nogroup /cluster/shared

sudo chmod 777 /cluster/shared

4번 폴더 공유 설정: 네트워크의 모든 기기가 이 폴더를 읽고 쓸 수 있게 허용합니다. 즉, 라즈베리 파이들이 읽고 쓸 수 있게 하는거죠.

echo “/cluster/shared *(rw,sync,no_subtree_check,no_root_squash)” sudo tee -a /etc/exports

5번 NFS 서버 재시작:

sudo systemctl restart nfs-kernel-server

이제 VIM4는 /cluster/shared라는 폴더를 네트워크에 공유하기 시작한겁니다.


3단계: MPI 라이브러리 설치

‘헤드 노드’인 VIM4가 ‘컴퓨트 노드’인 Pi들에게 명령을 내리고 결과를 취합하는 데 필요한 핵심 라이브러리입니다.

여러개 알아봤는데, 우선 mpich부터 설치해서 써보려고 합니다.

sudo apt install mpich

다음 계획

이제 Khadas VIM4는 클러스터의 ‘Head Node’가 되기 위한 모든 기본 소프트웨어 설치를 마쳤습니다.

다음은 첫 번째 라즈베리파이(컴퓨트 노드)를 가져와서, 여기에 Ubuntu Server 22.04를 설치하고 VIM4에 연결할 차례입니다.

여기서 다른분들 참고사항으로 말씀드리자면, 제 경우 Khadas Vim4에 22.04 GUI가 설치되어 있어서 라즈베리파이에 22.04 서버 버전을 설치하는 것입니다.

이제 다른 라즈베리파이들에 CLI 우분투들을 설치하고 연결 할 차례입니다.

아마 다음엔 다른 라즈베리파이들을 연결해볼 것 같고, 그 이후에는 렉을 직접 연결하면서 클러스터 서버 덩어리(렉이라 부르는게 맞겠죠?) 하드웨어를 구성하는 과정을 사진 찍어가면서 올릴 것 같습니다.

후기 및 잡담

공돌이 낭만 치사량이네요.

꼭 해보고 싶었는데, 꽤 재밌습니다.

돈 그렇게 많이 드는 취미도 아니고요. 저는 라즈베리파이랑 Khadas로 했지만, 어디선가 죽어가는 노트북들이나 PC들 모아다가 이런식으로 만들면 그건 그것대로 또 괜찮은 장난감이 될 수 있을 것 같네요.

헤놀로지 NAS만드는 것은 아마 안할 것 같습니다. 이건 설치 가능한 기기들이 따로 있기도 하고… 그냥 시놀로지 정품 쓰는게 차라리 나아요.

차라리 HDD두개를 도킹 스테이션으로 USB처럼 연결해서, 거기에 저장해둔 애니를 원격으로 나만의 애니 스트리밍 서버를 만드는 것을 해보려고 합니다. 그게 가능한 모니터 쪽을 지탱해주는 부분이 나가버린 제 첫 노트북이 있습니다. 이건 그때 새로운 방법으로 알아보고, 앞으로 2차례 이걸 해야겠네요.

사람은 아무리 바쁘더라도 자기가 재밌을 것 같다고 생각이 드는걸 한번 해봐야 합니다.