DIY PiKVM 搭建採買及採坑
PiKVM - Raspberry Pi 開放且便宜的 , 有助於遠端管理伺服器或工作站
無論作業系統的運作狀況如何或是否安裝了作業系統 , 您可以修復任何軟體上問題 , 調整 BIOS , 甚至使用虛擬 CD-ROM 或隨身碟重裝系統
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
將鏡象寫入至記憶卡的軟體
根據自己的平台選擇安裝檔
鏡象寫入至記憶卡
安裝 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 通訊埠轉發 ( 必需 Must 強密碼和 2FA 驗證 , 否則就被 Try 到死 )
- Tailscale VPN ( 使用者可以自由移除加入網路的裝置 )
- Cloudflare Tunnels ( 一開頭聲明處寫著屬於社群提出的 , 非 PiKVM 官方解決方案 )
較推薦的解法用 tailscale VPN 組建虛擬內網
由於非必須我就放參考網站
原則上是沒有不同
PiKVM 官方 Tailscale 設定
Tailscale 官方文件教學 PiKVM 設定
更新系統
由於 PiKVM 官方會修復 bug 和新增功能
以及 Linux 也會更新相關系統組件及安全性修復
更新指令如下
# pikvm-update
更新完會自動重開機
後話
建議給 PiKVM 專案贊助點錢
讓這個項目繼續下去 , 這樣大家才能繼續動手 DIY 享受便宜的 IP-KVM
我也在想辦法畫盒子收納PiKVM
相關來源
pikvm docs
usb-atx-ctrl
pikvm-usb-atx-ctrl
dln2-dkms
arch linux arm mirror list