PiKVM - 基于树莓派的开源经济型IP-KVM, 用于管理服务器或个人PC机
無論操作系统的運作狀況如何或是否安裝了操作系统 , 您可以修復任何软件上問題 , 調整 BIOS , 甚至使用虛擬 CD-ROM 或u盘重裝系統
DIY 成本取決於所需的功能 , 即使最貴的版本也比商用 IP-KVM 便宜
文章目錄
系統 Arch Linux ARM Read-only 模式
具備一些 Linux 使用經驗 , 可以玩的順手
給有興趣的一些指南
一篇文章講的有限 , 還是去看看 PiKVM 官方指南
声明
不限於使用官方推薦配件 , 包含使用 Copycat 產品
所以去官方支援頻道尋求支援 , 可能會被告知不支援其他廠家的產品詢問
若堅持完全原創 build
建議購买官方出品 PiKVM V3 Hat , PiKVM V4 Mini , PiKVM V4 Plus
硬件選擇
基於 PiKVM 官網釋出的
DIY PiKVM V2 Instructions 挑選相容配件
使用基於 Raspberry Pi 4B
支援有线网络及 TypeC 能直接 OTG 輸出鍵鼠訊號給到主機
不會使用 USB 擷取卡方案 : 延遲過於高 , 且占用 SBC 所剩無幾的 USB PORT
基础版
- Raspberry Pi 4B 2GB ×1( 可選擇記憶體更大的款式,但意義不大 )
- Raspberry Pi 小鋁片散熱器 ×1 套 ( 4B 用的是 4 個的樣子 )
- MicroSD ×1 ( 至少 16GB , Class 10 的卡 )
- Raspberry Pi 4B 官方變壓器 5V3A ×1
- HDMI to CSI 轉接板 ( 基於 TC358743XBG 关鍵字 微雪 HDMI to CSI , Geekworm C779 , Blicube C780 , Geekworm C790 , Geekworm X630 , Geekworm X1300 )
- USB TypeC 電-USB 分離板 / Type-C 一分二同時充電-OTG 接頭組 ×1
- USB TypeC-TypeC 线 ×1 ( 连接 TypeC 電-USB 分離板至 PiKVM , 使用一分二线的可以跳過 )
- USB TypeA-TypeC 线 ×1 ( 连接接 PiKVM 到电脑,长度視距离 )
- HDMI 线 ×1 ( 长度視 PiKVM 至被控电脑距离 )
基础 Pro 版
基础版 加 1 套 USB ATX Ctrl
- USB ATX Ctrl 小板 ×1 ( 可控制电脑开关机)
- USB TypeA - TypeC ×1 ( 长度視 PiKVM 至被控电脑距离, 连接 USB ATX Ctrl 小板用 )
多被控端版
基础版
加 1 套相容的 KVM Switch
基础版 第 8,9 項
8. USB TypeA-TypeC 线 ×1 ( 连接接 PiKVM 到电脑,长度視距离 )
9. HDMI 线 ×1 ( 长度視 PiKVM 至被控电脑距离 )
從直连电脑變成连接至 PiKVM 至 KVM SWITCH
建議縮短长度,线材整理收納是個問題
- BLIKVM HDMI XH-HK4401 切换器 KVM ×1 ( 我這裡選擇 Copycat 方案 4 port , 便宜 , 方便购买, 且帮你調整好 )
- HDMI 线 ×4 ( 第 1 項內有对应线材,长度不足,再額外购买)
- USB Type A -Type B ×4 ( 连接电脑至 KVM SWITCH , 第 1 項內有对应线材,长度不足,再額外购买)
- USB Type A - MicroB ( KVM SWITCH 控制线 , 连接至 PiKVM )
多被控端 Pro 版
基础版
加 1 套相容的 KVM Switch
加 4 套 USB ATX Ctrl
基础版 第 8,9 項
8. USB TypeA-TypeC 线 ×1 ( 连接接 PiKVM 到电脑,长度視距离 )
9. HDMI 线 ×1 ( 长度視 PiKVM 至被控电脑距离 )
從直连电脑變成连接至 PiKVM 至 KVM SWITCH
建議縮短长度,线材整理收納是個問題
- BLIKVM HDMI XH-HK4401切换器 KVM ×1 ( 我這裡選擇 Copycat 方案 4 port , 便宜 , 方便购买,且帮你調整好 )
- HDMI 线 ×4 ( 第 1 項內有对应线材,长度不足,再額外购买)
- USB Type A - Type B ×4 ( 连接电脑至 KVM SWITCH , 第 1 項內有对应线材,长度不足,再額外购买)
- USB Type A - MicroB ( KVM SWITCH 控制线 , 连接至 PiKVM )
- USB ATX Ctrl 小板 ×4 ( 可控制电脑开关机)
- USB TypeA - TypeC ×4 ( PiKVM 至被控电脑距离 , 连接 USB ATX Ctrl 小板用 )
- USB TypeA HUB ( 连接第 6 項 多個 USB TypeA 到樹梅派 , USB Port 可能會有不足的情況 )
增加額外功能
風扇
加強散熱可以加風扇
HDMI OUT 還出的
有需要 HDMI OUT 還出 , 可外接螢幕
將原本 HDMI to CSI 轉接板
替換成 Geekworm X1301 ( 帶 HDMI OUT 還出功能 ) 驗證過 Raspberry Pi 4B 可用
Pro 版的 USB ATX Ctrl 小板
production 資料夾裡的 gerber.zip 去到 JLCPCB,PCBWay 或 其他板廠
選項選好下單結帳就會有空板寄出來
PCB 空板長這樣

再依照 如下 BOM 买元件
Footprint | Quantity | Mouser# | Description |
---|---|---|---|
D3 | 1 | 645-599-0411-127F | Red,HDD LED |
D4 | 1 | 645-599-0480-127F | Green,Power LED |
J1 | 1 | 538-10-89-4082 | 2 X 04P PIN |
K1, K2 | 2 | 769-AQW210EHA | AQW210EHA |
R5,R6 | 2 | 667-ERA-8ARB333V | 33k |
R1,R2,R3,R4,R7,R8 | 6 | 667-ERA-8AEB561V | 560R |
SW1,SW2 | 2 | 688-SKHWAPA010 | POWER,RESET |
RZ1 | 1 | RP2040-ZERO | |
杜邦线 母 - 母 | 8 | 杜邦线 母 - 母 |
RP2040-ZERO 去淘寶 / 蝦皮 / 電子材料店 买就好
" 杜邦线 母 - 母 " 连接主機板 前面板
其餘零件我選擇 Mouser / Digikey 正規廠商
淘寶买過 Remark 仿品和保存不佳的不敢了
LCSC 立創商城是可以看看, 但不一定都會有对应的元件
烙鐵焊接 , 成品如下
Flux 沒清乾淨就拍照 , 看起來有點髒 , 也焊的不怎麼樣湊合看

硬件安裝
Raspberry Pi 4B 散熱器貼一貼
在接上 HDMI to CSI 轉接板
然後螺絲桐柱固定好
USB TypeC 電-USB 分離板
PWR 端连接 Raspberry Pi 4B 官方變壓器
USB 端连接电脑或 KVM
自己發揮一下
附图給參考
PiKVM Pro 连接图

PiKVM Pro 4Port 连接图

软件安裝
准备相关存档
PiKVM Flash OS
取得官方釋出鏡象存档 跳至
DIY PiKVM V2 Platform > Raspberry Pi 4 > For HDMI-CSI bridge
下載儲存備用
Raspberry 官方推出的 RPi Imager
將鏡象寫入至存储TF卡的软件
根據自己的平台選擇安裝檔
鏡象寫入至存储TF卡
安装RPi Imager , 應該不用教啦
开啟 RPi Imager

Raspberry Pi Device 下拉選擇 NO FILTERING

"請選擇需要寫入的操作系統"下拉選擇 Use custom
再選擇剛剛官網下載來的鏡象
"儲存卡"點進去 , 選擇你的 MicroSD 裝置
等待燒錄完成提示
USB-ATX-CTRL Firmware 如何燒入
用 USB 线將 RP2040 连接电脑
先按下 RESET 再按下 BOOT
先鬆 RESET 再鬆 BOOT 就可以進去燒錄模式
firmware 內的 dln2.uf2 拖進去
燒錄就完畢
設定
插電开機
去 router 看新上线 PiKVM 的 IP
然後瀏覽器开啟該 IP , 確認一下是否為 PiKVM
預設使用者是帳號 admin , 密碼 admin , 沒有 2FA 驗證
確定是該 IP 後那就可以开啟 PuTTY , teraterm 等,但不限於可 ssh 软件
或使用 windows 終端機輸入
ssh root@IP
用超級使用者 root , 預設密碼是 root

以下內容會用到 linux 文字編輯器 nano ( 要用 vim 編輯也不是問題 , 同理 )
務必先去了解快捷鍵使用可解決一些操作問題
再來由於系統是 Read-only 模式 , 更改設定前
必須先下 rw 指令啟用 Read-Write
結束修改 ro 指令恢復 Read-only
修改 root 和 admin 密碼
!! 务必请修改密码 !!
打密碼不會顯示這很正常
# rw
# passwd root
# kvmd-htpasswd set admin
# ro
!! 务必请修改密码 !!
改變鏡象站來源
连國外鏡象站太慢
縮短系統更新花費的時間
下載速度快一點,穩定一點
# nano /etc/pacman.d/mirrorlist
將原本的改成
Server = http://tw2.mirror.archlinuxarm.org/$arch/$repo
# ro
更多地區的 Arch Linux Arm 鏡象站
鎖定預設分辨率在 1080P
鎖定分辨率我建議啟用
我手上一張 GT1030 進系統能 1080P 甚至更高
進 Bios 一开始還卡在 720P
顯示卡識別到把分辨率切到 1080P
但 PiKVM 識別不到畫面就卡死
# rw
# kvmd-edidconf --import-preset=v2.1080p-by-default
# ro
# reboot
USB ATX CTRL ,配置 override.yaml 及修改 web.css 介面樣式
USB ATX CTRL
需要先安裝相关依賴
# rw
# git clone https://github.com/zappanaut/dln2-dkms
# pacman -S dkms
# cd dln2-dkms
# ./install.sh
# reboot
進入這個目錄,你會看到插上去的裝置
# rw
# cd /dev/gpio-by-serial/
# ls
我建議可以先 1 次 1 片
把序號記錄下來,等一下會用到
配置 override.yaml
# cd /etc/kvmd/
# nano override.yaml
貼入下方
再依照 Port 將上面得到的序號
取代進去 SN0,SN1,SN2,SN3
kvmd:
gpio:
drivers:
hk:
type: xh_hk4401
protocol: 2
device: /dev/ttyUSB0
atx_port0:
type: gpio
device: /dev/gpio-by-serial/SN0
atx_port1:
type: gpio
device: /dev/gpio-by-serial/SN1
atx_port2:
type: gpio
device: /dev/gpio-by-serial/SN2
atx_port3:
type: gpio
device: /dev/gpio-by-serial/SN3
scheme:
ch0_led:
driver: hk
pin: 0
mode: input
ch0_button:
driver: hk
pin: 0
mode: output
switch: false
atx0_reset_button:
driver: atx_port0
pin: 7
mode: output
switch: false
pulse:
delay: 0.2
atx0_power_button:
driver: atx_port0
pin: 8
mode: output
switch: false
pulse:
delay: 0.5
max_delay: 1.0
atx0_power_button_long:
driver: atx_port0
pin: 8
mode: output
switch: false
pulse:
delay: 2.5
min-delay: 2.0
max_delay: 3.0
atx0_power_led:
driver: atx_port0
pin: 14
mode: input
atx0_hdd_led:
driver: atx_port0
pin: 15
mode: input
ch1_led:
driver: hk
pin: 1
mode: input
ch1_button:
driver: hk
pin: 1
mode: output
switch: false
atx1_reset_button:
driver: atx_port1
pin: 7
mode: output
switch: false
pulse:
delay: 0.2
atx1_power_button:
driver: atx_port1
pin: 8
mode: output
switch: false
pulse:
delay: 0.5
max_delay: 1.0
atx1_power_button_long:
driver: atx_port1
pin: 8
mode: output
switch: false
pulse:
delay: 2.5
min-delay: 2.0
max_delay: 3.0
atx1_power_led:
driver: atx_port1
pin: 14
mode: input
atx1_hdd_led:
driver: atx_port1
pin: 15
mode: input
ch2_led:
driver: hk
pin: 2
mode: input
ch2_button:
driver: hk
pin: 2
mode: output
switch: false
atx2_reset_button:
driver: atx_port2
pin: 7
mode: output
switch: false
pulse:
delay: 0.2
atx2_power_button:
driver: atx_port2
pin: 8
mode: output
switch: false
pulse:
delay: 0.5
max_delay: 1.0
atx2_power_button_long:
driver: atx_port2
pin: 8
mode: output
switch: false
pulse:
delay: 2.5
min-delay: 2.0
max_delay: 3.0
atx2_power_led:
driver: atx_port2
pin: 14
mode: input
atx2_hdd_led:
driver: atx_port2
pin: 15
mode: input
ch3_led:
driver: hk
pin: 3
mode: input
ch3_button:
driver: hk
pin: 3
mode: output
switch: false
atx3_reset_button:
driver: atx_port3
pin: 7
mode: output
switch: false
pulse:
delay: 0.2
atx3_power_button:
driver: atx_port3
pin: 8
mode: output
switch: false
pulse:
delay: 0.5
max_delay: 1.0
atx3_power_button_long:
driver: atx_port3
pin: 8
mode: output
switch: false
pulse:
delay: 2.5
min-delay: 2.0
max_delay: 3.0
atx3_power_led:
driver: atx_port3
pin: 14
mode: input
atx3_hdd_led:
driver: atx_port3
pin: 15
mode: input
view:
header:
title: '<img class="led-gray" src="/share/svg/kvm.svg" title=""><span>KVM & ATX</span>'
table:
- [
"#",
'#<div class="pos-rel"><span class="pos-abs-middle">KVM-Switch</span></div>',
'#<span class="padding-x-1">NAME</span>',
"#PWR",
"#HDD",
"# ",
'#<div class="pos-rel"><span class="pos-abs-middle">ATX Power and Reset</span></div>',
]
- [
"ch0_led|red",
"ch0_button||Port 1",
'#<span class="x-name">ch0</span>',
"atx0_power_led|green",
"atx0_hdd_led|yellow",
"#",
"atx0_power_button|confirm|Power <sup><i>short</i></sup>",
"atx0_power_button_long|confirm|Power <sup><i>long</i></sup>",
"atx0_reset_button|confirm|Reset",
]
- [
"ch1_led|red",
"ch1_button||Port 2",
'#<span class="x-name">ch1</span>',
"atx1_power_led|green",
"atx1_hdd_led|yellow",
"#",
"atx1_power_button|confirm|Power <sup><i>short</i></sup>",
"atx1_power_button_long|confirm|Power <sup><i>long</i></sup>",
"atx1_reset_button|confirm|Reset",
]
- [
"ch2_led|red",
"ch2_button||Port 3",
'#<span class="x-name">ch2</span>',
"atx2_power_led|green",
"atx2_hdd_led|yellow",
"#",
"atx2_power_button|confirm|Power <sup><i>short</i></sup>",
"atx2_power_button_long|confirm|Power <sup><i>long</i></sup>",
"atx2_reset_button|confirm|Reset",
]
- [
"ch3_led|red",
"ch3_button||Port 4",
'#<span class="x-name">ch3</span>',
"atx3_power_led|green",
"atx3_hdd_led|yellow",
"#",
"atx3_power_button|confirm|Power <sup><i>short</i></sup>",
"atx3_power_button_long|confirm|Power <sup><i>long</i></sup>",
"atx3_reset_button|confirm|Reset",
]
修改 web.css
更改同目錄下的 web.css
# nano web.css
img[id$="_power_led"] {
content: url("/share/svg/led-atx-power.svg");
}
img[id$="_hdd_led"] {
content: url("/share/svg/led-atx-hdd.svg");
}
button[id$="_power_button"]::before,
button[id$="_power_button_long"]::before {
mask: url("/share/svg/led-atx-power.svg");
-webkit-mask: url("/share/svg/led-atx-power.svg");
width: 0.9rem;
height: 0.9rem;
margin-right: 0.33rem;
margin-left: 0.1rem;
margin-bottom: -0.1rem;
}
button[id$="_reset_button"]::before {
mask: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3e %3cpath stroke='black' stroke-linecap='square' stroke-width='.5' d='M12 2A10 10 0 1 1 2 12h2a8 8 0 1 0 1.38-4.5H8v2H2v-6h2V6a9.98 9.98 0 0 1 8-4z'/%3e %3c/svg%3e");
-webkit-mask: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3e %3cpath stroke='black' stroke-linecap='square' stroke-width='.5' d='M12 2A10 10 0 1 1 2 12h2a8 8 0 1 0 1.38-4.5H8v2H2v-6h2V6a9.98 9.98 0 0 1 8-4z'/%3e %3c/svg%3e");
width: 1rem;
height: 1rem;
margin-right: 0.25rem;
margin-left: 0.08rem;
margin-bottom: -0.16rem;
}
button[id$="_power_button"]::before,
button[id$="_power_button_long"]::before,
button[id$="_reset_button"]::before {
content: "";
background-color: var(--cs-control-default-fg);
mask-size: contain;
-webkit-mask-size: contain;
display: inline-block;
vertical-align: baseline;
}
button[id$="_power_button"]:hover::before,
button[id$="_power_button_long"]:hover::before,
button[id$="_reset_button"]:hover::before {
background-color: var(--cs-control-hovered-fg);
}
.pos-abs-middle {
position: absolute;
transform: translateY(-50%);
}
.pos-rel {
position: relative;
}
/* for the positioning of the "LEDs" */
table.kv tr {
position: relative;
}
button[id$="_kvm_button"]::before {
content: "";
display: inline-table;
margin-right: 0.33rem;
width: 1.5rem; /* space for the button */
}
/* move "led" inside button */
img[id$="_port_active_led"] {
content: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' shape-rendering='optimizeQuality' viewBox='0 0 64 64'%3e %3ccircle cx='32' cy='32' r='20' fill='none' stroke='black' stroke-width='4'/%3e %3ccircle cx='32' cy='32' r='10' fill='black'/%3e %3c/svg%3e");
pointer-events: none;
position: absolute;
top: 50%;
transform: translateY(-50%);
z-index: 10;
left: 0.8rem;
}
.padding-x-1 {
padding-left: 1rem;
padding-right: 0.5rem;
}
.x-name {
padding-left: 1rem;
padding-right: 0.5rem;
font-size: 16px;
font-weight: bold;
}
存檔,重啟
# ro
# reboot
远程访问
PiKVM Docs 給出三種
- Port forwarding 端口转发 如 FRP ( 必需 强密码和 2FA验证 , 否则有安全风险 )
- Tailscale VPN ( 使用者可以自由移除加入网络的裝置 )
- Cloudflare Tunnels ( 一开頭声明處寫著屬於社群提出的 , 非 PiKVM 官方解決方案 )
較推薦的解法用 tailscale VPN 进行内网穿透
由於非必須我就放參考網站
原則上是沒有不同
PiKVM 官方 Tailscale 設定
Tailscale 官方文件教學 PiKVM 設定
更新系統
由於 PiKVM 官方會修復 bug 和新增功能
以及 Linux 也會更新相关系統組件及安全性修復
更新指令如下
# pikvm-update
更新完會自動重开機
写在最后
建议多给PiKVM 项目Star或者赞助
讓這個項目繼續下去 , 這樣大家才能繼續動手 DIY 享受便宜的 IP-KVM
相关來源
pikvm docs
usb-atx-ctrl
pikvm-usb-atx-ctrl
dln2-dkms
arch linux arm mirror list