본문 바로가기

서버 | OS/원격 관리

PiKVM - KVM over IP 로 컴퓨터 시스템 원격 관리

서론

먼 지방을 계절 따라 오가며 일을 하게 되면서, IT 업력 25년 만에 처음으로 서버 환경이 필요해 Synology와 Linux 서버를 직접 구축했습니다. 그런데 집에서 원격으로 서버를 업데이트하고 재부팅까지 마친 뒤, 갑자기 접속이 되지 않는 상황이 벌어졌죠. 왠지 부팅 중에 시스템이 멈춘 것 같은 불길한 예감이 들었지만, 당장 도움을 요청할 사람도 없는 막막한 상황이었습니다.

그 일을 계기로, 자취방에 설치해둔 장비들을 집에서도 직접 제어할 수 있는 KVM 장비의 필요성을 절실히 느끼게 되었고, 결국 관련 장비들을 찾아보던 중 원격 KVM에 집중하게 되었죠!.

 

ATEN 과 같은 KVM 전문 회사 에서는 "KVM Over IP" 제품을 출시해 판매하고 있었지만, 일백만원을 넘어서는 장비 가격으로  달랑 2대의 장비를 관리하고자 투자하기에는 가성비가 좋지 않아 보다 저렴한 제품을 찾게 되었습니다.

 

바로, "PiKVM" (https://pikvm.org/; Maxim Devaev; 2018~) 이라는 이름으로 라즈베리파이를 이용해 KVM over IP를 제작한 오픈소스 제품이 개발되어 공개되고 판매되고 있었습니다.

현재(2023년) 는 패키지 제품화한 모델 2종을 직접 제작하여 판매하고 있기도 합니다.

(2025년 현재, 최대 20대 까지 호스트를 하나의 PiKVM으로 동시에 관리할 수 있도록 하는 PiKVM SWITCH 도 개발 되었어요!)

 

국내 판매처 https://netsket.co.kr/ 에서 판매중인 PiKVM 제품

 

이미 가지고 있는 라즈베리파이를 이용하면 비용을 좀 더 아낄 수 있을 것 같았고, 개발자(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 웹 브라우저 접속 / Tailscale VPN 으로 손쉬운 원격 접속)

1. RaspberryPi 2B에 PiKVM 컴파일

* 라즈베리파이 모델에 맞는 https://files.pikvm.org/images/ 에서 OS이미지를 직접 내려받아 Miscro SD에 직접 이미징 해서 사용하면 편리합니다.  (아래에 소개되어 있는 OS 컴파일 과정은, 다운로드 받은 이미지가 정상동작하지 않을 때, 아니면 호기심이 생기실 때 고려 해 보시기 바랍니다.)

 

* 이하의 내용은 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-YYYYmmdd.img` 파일을 SFTP를 이용해 PC로 다운로드 합니다.

 

(12) `Raspberry Pi Imager`를 이용해 위 (11)에서 다운로드한 `v0-hdmiusb-rpi2-YYYYmmdd.img` 파일을 PiKVM OS 부팅용 Micro SD 메모리에 Flashing 합니다.

2. PC의 HDMI 출력을 PiKVM이 입력받아 처리할 수 있도록 HDMI-USB 캡처 동글을 연결 합니다.

HDMI-USB 캡처 동글 연결은 반드시 아래 그림처럼 RPi 모델에 따라 빨강색으로 표시한 포트에 해야 합니다.  (이유는, udev 데몬이 해당 포트 위치의 USB포트에 HDMI-USB 캡처 동글이 감지될 경우에만 리눅스의 video 디바이스 `/dev/video0` 를 `/dev/kvmd-video` 로 링크를 하기 때문)

 

RPi 모델별 HDMI-USB 동글 연결 위치

3. PiKVM에서 PC에 키보드 마우스 입력을 전달할 수 있도록 HID 에뮬레이션이 필요 합니다.

이 과정은, Raspberry Pi Pico 1 (Pico / Pico H / Pico W / Pico WH) 제품을 이용해 진행하는 것으로 했습니다.

 

(1) Raspberry Pi Pico를 `BOOTSEL` 버튼을 누른 상태에서 Micro USB 포트를 이용해 PC의 USB포트에 연결하면 외장 USB 드라이브로 인식되어 파일탐색기를 열어 드라이브를 확인할 수 있습니다.

 

(2) https://github.com/pikvm/kvmd/releases 에서 최신 버전의 "pico-hid.uf2" 를 다운로드 합니다.

 

(3) (1)에서 연결된 드라이브에 다운로드 한 "pico-hid.uf2" 펌웨어를 파일탐색기로 Pico 드라이브에 복사해 넣습니다. (파일 붙여넣기를 하는 순간 연결되어 있던 드라이브의 연결이 자동으로 끊어집니다.  이는 펌웨어가 Pico에 설치되는 과정으로 이해 하시면 됩니다.)

 

(4) Raspberry Pi Pico의 USB케이블을 해제하고 RPi 2B의 GPIO 8개 핀을 아래 규칙에 맞게 연결합니다.

 

GPIO - Pico 핀 연결 예
GPIO - Pico 핀 연결 규격

 

★ 중요 사항 :

RPi2 GPIO의 5V와 Pico의 VSYS를 직접 연결해서는 안되고, `1N5819` 다이오드와 같인 5V-3.3V Voltage Level Shifter 를 이용해 연결해 전류의 역률를 막아 주어야 합니다.

 

원 개발자는 [RPi 2 5V] - [1N5819 다이오드] - [Pico GP39 VSYS] 를 가급적 연결해야 제어 대상 시스템이 재부팅 되는 순간에도 Pico에 전원 공급이 유지되어 HID 인식을 잃는 경우가 없을 것이라고 권고하지만, 연결 없이도 HID 에뮬레이션은 가능할 것이라 말합니다.  즉, 만약 Level Shifter가 없다면, VSYS 연결 자체를 하지 않도록 해야 합니다.

 

Level Shiter (1N58169 다이오드)를 구해 브레드보드를 통해 VSYS 핀을 연결하는 것이 키보드/마우스를 에뮬레이션 하는데 안정적이라고 설명을 하고 있으나, 아직 Level Shiter가 준비되지 않아 GP39(VSYS)핀 연결을 제외 했습니다.

 

(왼쪽) Raspberry Pi 2B GPIO 핀 배열 / (오른쪽) Raspberry Pi Pico GPIO 핀 배열

 

* 실제 핀 연결 사진

 

 

더보기

※ 참고 :

Pi Pico에 발이 달려있는 제품을 구매한 이유는~

원래 Pico 제품은 납땜을 할 수 있도록 아래 왼쪽과 같은 모양을 하고 있지만, 납땜을 하기 위한 도구(납, 납땜용 인두기, 거치대, 연기 흡입기... 등) 을 가지고 있지 않아 납땜을 보류하고 GPIO핀 연결로만 제작을 해 보고자 Pico GPIO 포트에 핀이 달려 있는 제품(아래 오른쪽)을 구매하고, 곁들여서 점퍼선 또한 Female-Female(암-암) 로 구입하여 핀 연결을 했습니다.  (납땜이 어렵거나 번거롭다면... 이 방법을 추천 드립니다.)

 


 

Pico의 핀 들이 뾰족하기도 하고 약해서 자칫 휘거나 부러질 수도 있기에 브레드보드에 쫌 더 깔끔하게 만드는 작업을 추가 진행 했습니다. 

그 결과 아래와 같은 모양으로 완성 되었습니다.

 

브레드보드에 Pico를 장착하고 RPi 케이스 옆면에 부착한 최종 완성품

 

(5) Raspberry Pi Pico와 제어 대상 서버(PC)를 "micro-USB to USB-A" 케이블로 서로 연결하면 Pi Pico로 에뮬레이션한 HID 신호를 제어 대상 서버(PC)에 전달 할 수 있게 됩니다.

 

(6) PiKVM OS용 Micro SD 메모리를 RPi 2B에 삽입 후 부팅하고 아래의 각 파일에 설정을 추가합니다. (설명 링크)

 

  • /boot/config.txt
dtoverlay=spi0-1cs

 

  • /etc/kvmd/override.yaml (옵션 : PiKVM V2, V3 버전 에서만 적용 / V1 은 필요하지 않음.)
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

 

※ 참고 : PiKVM HAT 과 전용 케이스...

더보기

※ 참고 : PiKVM HAT 과 전용 케이스를 구매하여 PiKVM V3 모델을 패키징 하는데에는 (Raspberry Pi 4B 를 제외 하고) Amazone 에서 배송비를 포함하여 약 $100.00 의 추가 비용이 들었습니다.

 

패키징 비용이 증가하기는 하지만 여러 장점들 덕에 가장 추천하는 방법 입니다.

◎ 호스트 컴퓨터에 ATX 전원 제어를 PiKVM 에서 100% 할 수 있습니다. (아래 5.의 방법으로 부팅이 안되는 경우가 있음)

  HAT 만으로 HID에뮬레이션, 비디오 캡처를 모두 처리해 주므로 패키징 완성도가 높고 물리적 손상 염려가 적습니다.

  소프트웨어적인 별도의 설정이 적어 편리합니다.

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) 화면에 표시되는 링크를 클릭해서 승인을 합니다.  또한 인증서 경고가 나타나지 않도록 "Tailscale Admin console" 에서 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의 BIOS 환경을 확인한 화면 예

5. 대상 호스트를 원격 부팅 할 수 있도록 설정 합니다.

  방법 1 : Wake On Lan 설정을 /etc/kvmd/override.yaml 파일에 아래의 형식으로 추가 합니다.

 

kvmd:
    wol:
        mac: ff:ff:ff:ff:ff:ff

 

○ 방법 2 : Intel AMT 기능을 활성화 합니다.

 

다행히도 대상 PC가 Intel AMT를 지원하는 네트워크 컨트롤러를 사용하고 있어 이를 이용해 원격 전원 관리를 할 수 있다고 판단했습니다.  Intel AMT 기능 활성화 방법에 대해서는 인터넷 검색을 해 보시기 바라며, 간략하게는 (BIOS에서 활성화 / Intel ME Configuration (F9키) 진입 / 관리자(admin) 패스워드 지정) 을 하면 됩니다.

 

(넋두리... 약 15년 전(?) 부터인가?  노트북을 새로 구매 할 때 마다 윈도우를 설치하면, 꼭 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

"node node_modules/meshcentrl" 실행 결과 화면

 

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에 비하면 비용을 확실히 아낀 샘이죠!
  • ATX 보드를 제어하고 전용 케이스로 패키징을 하도록 구현하는 것은 매우 깔끔하고 모든 것이 가능한 시스템을 만드는 방법 이지만, 이 마저도 비용을 아끼고자 하다면 WOL 이나 Intel AMT를 활용하는 것이 가능합니다.
  • Tailscale VPN으로 장소에 구애받지 않고 원격 접속이 가능하도록 구성이 가능 한 것 또한 매우 매력적인 구성 입니다.