Contents

PiVen(Raspberry Pi + Oven) - 1

라즈베리파이 클러스터 만들기 (준비편)

H/W Design 목표는 겉으로 보았을 때 평범한 컴퓨터 처럼 보이게 하는 것 입니다. Cluster 구성하는 비용으로 Desktop을 구매하는 것이 성능 측면에서 훨씬 좋습니다.

재료

이번 글에서 소개할 Raspberry Pi 8개 노드를 구성할 때 필요한 재료 입니다. 선정한 케이스가 작아서 8개 이상은 무리입니다.

품목 갯수 참고
Raspberry Pi 4 8GB 8ea 중고거래
POE hat 8ea 링크
육각 스탠드 오프 PS2.5-P12M-B 32ea 링크
육각 스탠드 오프 PS2.5-P05F-B 4ea 링크
멀티탭 1 ea 링크
플러그 커넥터 1ea 링크
케이스 1ea 링크
공유기 1ea 링크
USB type A to USB type c 1ea 링크
POE 스위치 2ea 링크
Lan Cable (Flat) 10ea 링크
SSD Braket 4ea 링크
SSD (250GB) 8ea 링크
SATA to USB Cable 8ea 링크
USB to 3/4 Pin Cable 1ea 링크
120mm FAN 2ea 링크
Reusable Tape 1ea 링크

Raspberry Pi OS 준비

MicroSD Card에 Raspberry Pi OS 이미지를 만드는 것은 balenaEtcher를 이용합니다.

  • 링크에서 Raspberry Pi OS Lite 이미지를 다운로드 받습니다.
  • 다운받은 이미지의 압축을 풀어줍니다.
  • MicroSD Card를 컴퓨터에 연결합니다.
  • balenaEtcher를 실행합니다.
  • Select image를 눌러서 다운로드 받은 이미지를 선택합니다.
  • Select driver를 눌러서 MicroSD Card를 선택합니다.
  • Flash를 누르고 기다립니다.

Raspberry Pi OS Booting

Raspberry Pi에 모니터를 연결할 수 없는 경우에는 ssh를 통하여 Rapberry Pi 조작해야 합니다. ssh를 enable하기 위해서는 MicroSD Card의 boot영역에 ssh이름을 가진 파일을 생성해야 합니다.

1
touch ssh

그 다음 MicroSD Card를 Rapberry Pi에 연결하고 Booting합니다. 다음으로 Raspberry Pi를 공유기에 연결하고 공유기 Admin page에서 IP를 확인합니다. 초기 id/password는 다음과 같습니다.

Info
ID: pi
Password: raspberry

1
ssh pi@<IP>

Bootloader Update

Raspberry Pi를 USB으로 부팅하기 위해서 Bootloader를 Update를 해주어야 합니다. Raspberry Pi OS으로 Boot한 뒤, 아래의 명령을 통해서 System Update & Upgrade를 해줍니다.

1
sudo apt update && sudo apt full-upgrade -y

아래의 명령을 수행하여 rpi-eeprom-update설정을 수행합니다.

1
2
3
sudo tee /etc/default/rpi-eeprom-update << EOF
FIRMWARE_RELEASE_STATUS="stable"
EOF
Info
/lib/firmware/raspberrypu/bootloader/stable Directory에는 다양한 Version의 Bootloader Binary가 존재합니다. 설치 할 때 최신 버전은 2021-02-16 이었습니다.

아래의 명령을 통해서 Bootloader를 Update하고 Raspberry Pi를 Reboot합니다.

1
2
sudo rpi-eeprom-update -d -f /lib/firmware/raspberrypi/bootloader/stable/pieeprom-2021-02-16.bin
sudo reboot

아래의 명령을 통해서 Bootloader 버전을 확인합니다.

1
2
3
4
5
6
7
vcgencmd bootloader_version

Feb 16 2021 13:23:36
version d6d82cf99bcb3e9a166a34cfde53130957a36bd3 (release)
timestamp 1613481816
update-time 1615091055
capabilities 0x0000001f

이 과정을 모든 Raspberry Pi에 수행합니다.

Ubuntu Install

Raspberry Pi OS는 작성일 기준으로 64-bit 이미지가 발표되지 않았고, Ubuntu는 64 bit 이미지가 있지만 SSD으로 Booting하기 위해서는 작업이 필요합니다.

Ubuntu Image

Raspberry Pi OS와 마찬가지로 SSD에 Ubuntu 이미지를 만드는 것은 balenaEtcher를 이용합니다.

  • 링크에서 Ubuntu Server 64-bit 이미지를 다운로드 받습니다.
  • 다운받은 이미지의 압축을 풀어줍니다.
  • balenaEtcher를 실행합니다.
  • Select image를 눌러서 압축을 풀어준 이미지를 선택합니다.
  • Select driver를 눌러서 SSD를 선택합니다.
  • Flash를 누르고 기다립니다.

이 과정을 8개의 SSD에 수행합니다.

Post Work

링크에 있는 내용을 요약하였습니다. Ubuntu으로 Booting하기 전에 설정해주어야 하는 것이 있습니다.

Warning
Raspberry Pi OS Booting을 한뒤에 SSD를 연결해줍니다.

lsblk 명령을 수행하여 SSD의 device 이름을 확인합니다. sda가 SSD 이름이고, mmcblk0가 MicroSD Card 이름입니다.

1
2
3
4
5
6
7
8
9
lsblk

NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda           8:0    0 232.9G  0 disk
|-sda1        8:1    0   256M  0 part
`-sda2        8:2    0   2.8G  0 part
mmcblk0     179:0    0  14.9G  0 disk
|-mmcblk0p1 179:1    0   256M  0 part /boot
`-mmcblk0p2 179:2    0  14.6G  0 part /

SSD의 각 partition을 mount합니다.

1
2
sudo mkdir -p /mnt/boot && sudo mount /dev/sda1 /mnt/boot
sudo mkdir -p /mnt/principal && sudo mount /dev/sda2 /mnt/principal/

vmlinuz의 압축을 풀어줍니다.

1
sudo sh -c 'zcat /mnt/boot/vmlinuz > /mnt/boot/vmlinux'

config.txt파일을 업데이트 해줍니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
sudo tee /mnt/boot/config.txt << EOF
# Please DO NOT modify this file; if you need to modify the boot config, the
# "usercfg.txt" file is the place to include user changes. Please refer to
# the README file for a description of the various configuration files on
# the boot partition.

# The unusual ordering below is deliberate; older firmwares (in particular the
# version initially shipped with bionic) don't understand the conditional
# [sections] below and simply ignore them. The Pi4 doesn't boot at all with
# firmwares this old so it's safe to place at the top. Of the Pi2 and Pi3, the
# Pi3 uboot happens to work happily on the Pi2, so it needs to go at the bottom
# to support old firmwares.

[pi4]
max_framebuffers=2
dtoverlay=vc4-fkms-v3d
boot_delay
kernel=vmlinux
initramfs initrd.img followkernel

[pi2]
kernel=uboot_rpi_2.bin

[pi3]
kernel=uboot_rpi_3.bin

[all]
arm_64bit=1
device_tree_address=0x03000000

# The following settings are "defaults" expected to be overridden by the
# included configuration. The only reason they are included is, again, to
# support old firmwares which don't understand the "include" command.

enable_uart=1
cmdline=cmdline.txt

include syscfg.txt
include usercfg.txt
EOF

boot partition에 script를 추가합니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
sudo tee /mnt/boot/auto_decompress_kernel << \EOF
#!/bin/bash -e

#Set Variables
BTPATH=/boot/firmware
CKPATH=$BTPATH/vmlinuz
DKPATH=$BTPATH/vmlinux

#Check if compression needs to be done.
if [ -e $BTPATH/check.md5 ]; then
	if md5sum --status --ignore-missing -c $BTPATH/check.md5; then
	echo -e "\e[32mFiles have not changed, Decompression not needed\e[0m"
	exit 0
	else echo -e "\e[31mHash failed, kernel will be compressed\e[0m"
	fi
fi

#Backup the old decompressed kernel
mv $DKPATH $DKPATH.bak

if [ ! $? == 0 ]; then
	echo -e "\e[31mDECOMPRESSED KERNEL BACKUP FAILED!\e[0m"
	exit 1
else 	echo -e "\e[32mDecompressed kernel backup was successful\e[0m"
fi

#Decompress the new kernel
echo "Decompressing kernel: "$CKPATH".............."

zcat $CKPATH > $DKPATH

if [ ! $? == 0 ]; then
	echo -e "\e[31mKERNEL FAILED TO DECOMPRESS!\e[0m"
	exit 1
else
	echo -e "\e[32mKernel Decompressed Succesfully\e[0m"
fi

#Hash the new kernel for checking
md5sum $CKPATH $DKPATH > $BTPATH/check.md5

if [ ! $? == 0 ]; then
	echo -e "\e[31mMD5 GENERATION FAILED!\e[0m"
	else echo -e "\e[32mMD5 generated Succesfully\e[0m"
fi

#Exit
exit 0
EOF

추가된 script에 실행 권한을 부여합니다.

1
sudo chmod +x /mnt/boot/auto_decompress_kernel

apt upgrade후에 실행될 script를 추가합니다.

1
2
3
sudo tee /mnt/principal/etc/apt/apt.conf.d/999_decompress_rpi_kernel << EOF
DPkg::Post-Invoke {"/bin/bash /boot/firmware/auto_decompress_kernel"; };
EOF

추가된 script에 실행 권한을 부여합니다.

1
sudo chmod +x /mnt/principal/etc/apt/apt.conf.d/999_decompress_rpi_kernel

System을 종료합니다.

1
sudo poweroff

MicroSD Card를 제거한 뒤에 Raspberry Pi를 Booting합니다.

초기 id/password는 다음과 같습니다.

Info
ID: ubuntu
Password: ubuntu

hostname을 변경하기 위해서 다음을 수행합니다.

Info
8개의 node가 있기 때문에 이름을 rpi-node1, rpi-node2, … 으로 변경하였습니다.

1
hostnamectl set-hostname rpi-node1

(Optional) POE Fan Control

POE의 Fan이 동작하는 조건을 변경하는 것은 필수는 아닙니다. 동작 속도와 동작 온도를 설정하는 것으로 불필요한 Fan 동작에 의한 소음을 줄일 수 있습니다. 링크를 참고하였습니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
sudo tee /etc/udev/rules.d/50-rpi-fan.rules << EOF
SUBSYSTEM=="thermal"
KERNEL=="thermal_zone3"

# If the temp hits 81C, highest RPM
ATTR{trip_point_0_temp}="82000"
ATTR{trip_point_0_hyst}="3000"
#
# If the temp hits 80C, higher RPM
ATTR{trip_point_1_temp}="81000"
ATTR{trip_point_1_hyst}="2000"
#
# If the temp hits 70C, higher RPM
ATTR{trip_point_2_temp}="71000"
ATTR{trip_point_2_hyst}="3000"
#
# If the temp hits 60C, turn on the fan
ATTR{trip_point_3_temp}="61000"
ATTR{trip_point_3_hyst}="5000"
#
# Fan is off otherwise
EOF

Fan rule 적용을 위해서 Raspberry Pi를 reboot합니다.

1
sudo reboot

Placement & Arragement

Raspberry Pi를 위한 케이스가 아니기 때문에 구성품들을 쉽게 Mount할 수 없습니다. POE 스위치와 멀티탭은 양면테이프를 활용하여 고정하였습니다. SSD Bracket은 케이스의 파워가 있는 자리에 위치하였습니다.

/piven-1/placement_and_arrangement.jpg
Placement

정리

작은 케이스에 8개의 Node가 각각 Lan Calbe, SATA to USB Calbe이 연결되기 때문에 Cable을 정리하는 것이 매우 힘듭니다. 다음 글에서는 k3s를 이용하여 Kubernetes를 설치하는 과정을 소개합니다.