서론
목포를 계절마다 오가며 일을 하게 되어 IT업력 25년만에 서버 환경이 필요해 Synology와 Linux 서버를 구축해 두었는데, 집에서 서버의 원격 업데이트를 실행하고 리부팅 실행 후에 더 이상 서버 접속이 안되는데... 아마도 부팅 과정에 Hang이 발생한 듯 한 직감! 누군가의 도움도 받을 수 없는 상황!!!
그래서 찾아보게 되었습니다. 집에서 목포에 설치해 놓은 장비들을 원격으로 관리할 수 있는 KVM을~
ATEN 과 같은 KVM 전문 회사 에서는 "KVM Over IP" 제품을 출시해 판매하고 있었지만, 일백만원을 넘어서는 장비 가격으로 달랑 2대의 장비를 관리하고자 투자하기에는 가성비가 좋지 않아 보다 저렴한 제품을 찾기 시작해 결국 찾게 되었습니다.
바로, "PiKVM" (https://pikvm.org/; Maxim Devaev; 2018~) 이라는 이름으로 라즈베리파이를 이용해 KVM over IP를 제작한 오픈소스 제품이 개발되어 공개되고 판매되고 있음을 말이죠!
현재(2023년) 는 패키지 제품화한 모델 2종을 직접 제작하여 판매하고 있기도 합니다.
그런데...
이미 가지고 있는 라즈베리파이를 이용하면 비용을 좀 더 아낄 수 있을 것 같았고, 개발자(Maxim Devaev) 또한 홈페이지에 아래와 같이 언급하고 있는 것을 확인하고 DIY로 PiKVM 제작에 돌입 했습니다.
It only costs between $30 and $100 for DIY depending on the features desired. Even the most expensive configuration will be cheaper than a $500 commercial IP-KVM.
아래는 그 제작(?)(조립!!!) 과정과 완성된 PiKVM과 Intel AMT 를 조합 운영할 수 있도록 구축한 과정을 소개합니다.
본론
제작 목표는 아래의 두 가지를 고려하여 제작하기로 했습니다.
- 현재 보유하고 있는 Raspberry Pi 2B 를 이용
- 10만원 이내의 제작 추가비용 한도
필요한 하드웨어
☞ PiKVM 제작용
품목 | 수량 | 비용 |
RaspberryPi 2B | 1 ea | ₩58,000 (US$ 42.99) //Amazon.com// |
RaspberryPi 2B Case | 1 ea | ₩4,570 //쿠팡// |
32GB Micro SD 카드 (Class 10) | 1 ea | ₩4,800 //쿠팡// |
Micro SD 카드 리더 | 1 ea | ₩7,500 //쿠팡// |
5V 3A Micro USB 전원 아답터 | 1 ea | ₩7,800 //쿠팡// |
HDMI-USB 캡처 동글 | 1 ea | ₩25,170 //쿠팡// |
RaspberryPi Pico | 1 ea | ₩9,800 //디바이스마트// |
브레드보드 400핀 | 1 ea | ₩800 //디바이스마트// |
Female-Male 점퍼 케이블 | 8 ea | ₩800 //쿠팡// |
총 비용 | ₩119,240 |
☞ 테스트 대상 및 작업용
- 1ea * PC (용도: PiKVM 연결 제어 테스트 대상; HP Z230 활용)
- 1ea * PC (용도: Micro SD 카드에 OS 이미지 굽기 / PiKVM SSH 터미널 접속 / PiKVM 웹 브라우저 접속 / Intel AMT 명령 전송 등; Windows 10)
1. RaspberryPi 2B에 PiKVM 컴파일
* 이하의 내용은 https://docs.pikvm.org/building_os/ 를 참고하였으나 컴파일 중에 오류가 발생해 이 문제를 해결하는 방법을 포함하여 기술합니다.
(1) Raspberry Pi Image 등을 이용해 RPi 2B에서 실행 가능한 "Raspberry Pi OS" 를 Micro SD 메모리에 Flashing 합니다.
(2) Micro SD 카드를 RPi 2B에 삽입하고 부팅합니다.
(3) Docker 환경을 구성합니다.
[user@localhost ~]$ sudo apt-get install git make curl binutils -y
[user@localhost ~]$ sudo apt-get install docker.io
[user@localhost ~]$ sudo usermod -aG docker $USER
(4) Re-login
(5) PiKVM github 소스코드를 체크아웃하여 내려받습니다.
[user@localhost ~]$ git clone --depth=1 https://github.com/pikvm/os
[user@localhost ~]$ cd os
(6) RPi 보드와 플랫폼에 맞게 쉘 환경변수 지정합니다. (상세 정보 링크: "3. Determine the target board and platform")
BOARD=rpi2
PLATFORM=v0-hdmiusb
(7) 빌드 환경 파일 `config.mk` 파일을 BOARD, PLATFORM 및 TIMEZONE 을 환경에 맞춰 생성합니다.
# rpi4 for Raspberry Pi 4; rpi3 for Raspberry Pi 3; rpi2 for the version 2, zero2w for Zero2W
BOARD = rpi2
# Hardware configuration
PLATFORM = v0-hdmiusb
# Target hostname
HOSTNAME = pikvm
# ru_RU, etc. UTF-8 only
LOCALE = en_US
# See /usr/share/zoneinfo
TIMEZONE = Asia/Seoul
# For SSH root user
ROOT_PASSWD = root
# Web UI credentials: user=admin, password=<this>
WEBUI_ADMIN_PASSWD = admin
# IPMI credentials: user=admin, password=<this>
IPMI_ADMIN_PASSWD = admin
# SD card device
# (Used for burning the image with `make install`. Irrelevant if you only use `make image`.)
CARD = /dev/mmcblk0
(8) (버그 수정) `Makefile` 에 `BOARD`, `PLATFORM` 및 `TIMEZONE` 지정을 위와 같이 해 주어야 합니다.
(이 Makefile을 수정하지 않고 이미지 빌드를 하면 오류가 계속 발생해 찾아낸 방법 입니다.)
PLATFORM ?= v0-hdmiusb
export BOARD ?= rpi2
export TIMEZONE ?= Asia/Seoul
(9) OS 컴파일
[user@localhost os]$ make os
(10) image 생성 : `images` 디렉토리에 `*.img` 패턴의 이미지 파일이 생성 됩니다.
[user@localhost os]$ make image
(11) `images` 디렉토리에 만들어진 `v0-hdmiusb-rpi2-20231019.img` 파일을 SFTP를 이용해 PC로 다운로드 합니다.
(12) `Raspberry Pi Imager`를 이용해 (11)에서 다운로드한 .img 파일을 PiKVM OS 부팅용 Micro SD 메모리에 Flashing 합니다.
2. PC의 HDMI 출력을 PiKVM이 입력받아 처리할 수 있도록 HDMI-USB 캡처 동글 연결 합니다.
HDMI-USB 캡처 동글을 RPi 2B에 연결할 때는 반드시 오른쪽 아래 포트에 연결을 해야 합니다. (이유는, udev 데몬이 해당 포트 위치의 USB포트에 HDMI-USB 캡처 동글이 감지될 경우에만 리눅스의 video 디바이스 `/dev/video0` 를 `/dev/kvmd-video` 로 링크를 하기 때문)
3. PiKVM에서 PC에 키보드 마우스 입력을 전달할 수 있도록 HID 에뮬레이션을 합니다.
(1) Raspberry Pi Pico를 `BOOTSEL` 버튼을 누른 상태에서 Micro USB 포트를 이용해 PC의 USB포트에 연결하면 드라이브가 인식된다.
(2) 새로 생성된 드라이브에 펌웨어 `pico-hid.uf2` 를 다운로드 해서 파일탐색기로 복사해 넣는다.
(3) Raspberry Pi Pico의 USB케이블을 해제하고 RPi 2B의 GPIO 8개 핀을 아래 규칙에 맞게 연결합니다.
주의사항으로, RPi2 GPIO의 5V와 Pico의 VSYS를 직접 연결해서는 안되고, `1N5819` 다이오드와 같인 5V-3.3V Voltage Level Shifter 를 이용해 연결해 주어야 합니다.
원 개발자는 [RPi 2 5V] - [1N5819 다이오드] - [Pico GP39 VSYS] 를 가급적 연결해야 제어 대상 시스템이 재부팅 되는 순간에도 Pico에 전원 공급이 유지되어 HID 인식을 잃는 경우가 없을 것이라고 권고하며 없어도 HID 에뮬레이션은 가능할 것이라 말합니다.
하지만, 아직 Level Shiter가 준비되지 않아 개발자의 말씀 대로 GP39(pico)핀 연결 없이 제작은 진행했고, PiKVM 기능 구현 또한 "성공" 했습니다.
* 실제 핀 연결 사진
여기서 잠깐!
Pi Pico에 발이 달려있죠!?
이런 제품을 구매한 이유를 설명 드리자면~
원래 Pico 제품은 납땜을 할 수 있도록 아래 왼쪽과 같은 모양을 하고 있지만, 납땜을 하기 위한 도구(납, 납땜용 인두기, 거치대, 연기 흡입기... 등) 을 가지고 있지 않아 납땜을 보류하고 GPIO핀 연결로만 제작을 해 보고자 Pico GPIO 포트에 핀이 달려 있는 제품(아래 오른쪽)을 구매하고, 곁들여서 점퍼선 또한 Female-Female(암-암) 로 구입하여 핀 연결을 했습니다. (납땜이 어렵거나 번거롭다면... 이 방법을 추천 드립니다.)
![]() |
![]() |
그리고, Pico의 핀 들이 뾰족하기도 하고 약해서 자칫 휘거나 부러질 수도 있기에 브레드보드에 쫌 더 깔끔하게 만드는 작업을 추가 진행 했습니다. 그 결과 아래와 같은 모양으로 완성 되었습니다.
이제 남은 것은, Level Shiter (1N58169 다이오드)를 구해 브레드보다를 통해 VSYS 핀을 연결하는 것이 최종 목표 입니다. 하지만 부품 주문을 아직 하지 않아~ 언제쯤 Add-on 될지 모르겠네요. 현재는 보류 상태!
(4) Raspberry Pi Pico와 제어 대상 서버(PC)를 Micro-USB to USB-A 케이블로 서로 연결하면 Pi Pico로 에뮬레이션한 HID 신호를 제어 대상 서버(PC)에 전달 할 수 있게 됩니다.
(5) PiKVM OS용 Micro SD 메모리를 RPi 2B에 삽입 후 부팅하고 아래의 각 파일에 설정을 추가합니다. (설명 링크)
- /boot/config.txt
dtoverlay=spi0-1cs
- /etc/kvmd/override.yaml
kvmd:
hid:
type: spi
chip: 0
bus: 0
sw_cs_pin: 7
sw_cs_per_byte: true
reset_pin: 25
reset_inverted: true
reset_self: true
power_detect_pin: 16
power_detect_pull_down: true
4. PiKVM을 포트포워딩 없이 외부에서 원격 접속할 수 있도록 Tailscale VPN 을 설치 구성합니다.
(참고) Tailscale VPN (https://tailscale.com/) 은 원격 접속을 하고자 하는 호스트에 Tailscale client를 설치하여 각 Client 프로그램이 Tailscale의 VPN Gateway 서버와 연결되어 하나의 계정으로 연결된 모든 호스트를 하나의 네트워크에 참가한 것 처럼 운영할 수 있도록 해 줍니다.
(1) 클라이언트를 설치하고 tailscaled 서비스가 부팅 시 자동 실행되도록 합니다.
[root@pikvm ~]# rw
[root@pikvm ~]# pacman -Syu
[root@pikvm ~]# pacman -S tailscale-pikvm
[root@pikvm ~]# systemctl enable --now tailscaled
[root@pikvm ~]# tailscale up
(2) 화면에 표시되는 링크를 클릭해서 승인을 한다. 또한 인증서 경고가 나타나지 않도록 disable key expiry! 도 가능합니다.
(3) 리부팅 합니다.
[root@pikvm ~]# reboot
(4) 이제 Tailscale 네트워크 IP를 확인할 수 있습니다.
[root@pikvm ~]# ip addr show tailscale0
이제 PiKVM을 이용해 자유롭게 대상 PC를 외부에서 제어할 수 있는 기본 환경이 갖춰 졌습니다.
웹브라우저로 http://pikvm-tailscale-ip/ 를 접속하고 대상 PC의 전원을 켜면 아래 화면과 같이 PiKVM에서 부팅 과정을 포함한 화면을 보고 키보드/마우스로 필요한 제어를 할 수 있게 됩니다.
그런데...
무언가 부족함을 느끼지 않나요?
바로 "전원" 켜고 끄기!!!
PiKVM 개발자는 전원 관리 또한 할 수 있도록 PC의 ATX 전원 핀을 PiKVM과 연결하는 방법과 Wake On LAN 설정으로 대상 서버(PC)를 켤 수 있도록 기능을 포함시켰습니다.
다만, ATX 전원 연결을 위해서는 Raspberry Pi 3 나 4 모델이 필요하고 PiKVM HAT을 구매하는 등 추가 비용 소모가 발생하여 이번 DIY 작업에는 포함하지 않았습니다.
다행히도 대상 PC가 Intel AMT를 지원하는 네트워크 컨트롤러를 사용하고 있어 원격 전원 관리를 할 수 있다고 판단했습니다.
Intel AMT 기능 활성화 방법에 대해서는 인터넷 검색을 해 보시기 바라며, 간략하게는 (BIOS에서 활성화 / Intel ME Configuration (F9키) 진입 / 관리자(admin) 패스워드 지정) 을 하면 됩니다.
(넋두리... 약 15년 전 부터인가? 노트북 컴퓨터에 OS를 설치할 때 마다 Intel AMT 드라이버가 제공되어 활용 방법이 늘 궁금했지만 방법을 찾지 못하고 그냥 무시하며 살아 왔는데... 지금에서야 비로소 그 가치를 알게 되었습니다.)
오픈소스 MeshCentral (https://ylianst.github.io/MeshCentral/meshcentral/; YLIAN SAINT-HILAIRE) 을 이용하면 Intel AMT를 이용한 모든 관리를 아주 손쉽게 할 수 있습니다.
MeshCentral은 NodeJS 로 개발되어 배포되고 있습니다. 즉, NodeJS설치가 우선 필요합니다.
MeshCentral을 설치하고 실행합니다.
npm install meshcentral
node node_modules/meshcentral
MeshCentrl 웹 콘솔을 이용해서 대상 서버(PC)의 Intel AMT 를 이용한 정보조회 및 제어가 가능하다.
명령행 터미널을 이용하는 방법 또한 가능합니다.
cd meshcentral\node_modules\meshcentral\agents
MeshCmd.exe AmtPower --hostname 192.168.0.2 --user admin --password PassW0rD --poweroff
MeshCmd.exe AmtPower --hostname 192.168.0.2 --user admin --password PassW0rD --poweron --bootdevice hdd
결론
Raspberry Pi 2B 를 이용하면 아주 저렴한 KVM over IP 장비를 만드는 것이 가능함을 알게 되었습니다. 기업용 IP-KVM에 비하면 가격이 10배~20배 가량 저렴한 것이죠!
ATX 보드를 제어하고 전용 케이스로 패키징을 하도록 구현하는 것은 매우 깔끔하고 모든 것이 가능한 시스템을 만드는 방법 이지만, 이 마저도 비용을 아끼고자 하다면 Intel AMT를 활용하는 것이 가능합니다.
이제 목포에 놓아둔 서버를 집 에서든 아니면 전 세계 어디에서든 켜고, 끄고, 제어할 수 있게 되었습니다.