共计 2562 个字符,预计需要花费 7 分钟才能阅读完成。
前言
当 NAS 机器身处离我几百公里的老家,总是会担心不小心某个操作导致机器不能启动,而且还不清楚是什么原因导致的,可能需要进入修复模式进行某些操作。
所以考虑能不能通过另外一台稳定运行的的机器远程操作,可以看见屏幕又可以使用鼠标键盘,就好像机器就在身边。通过网络可以进行远程排查,同时还可以进行 bios 级别的操作。
了解到向日葵控控 A2,当时价格是 400 多,现在已经涨价到 700 多,确实有点贵。后面又了解到 pikvm,于是当时就买好了一些设备,比如 hdmi 采集卡,usb 公对公线等等。由于当时 pikvm 搭建比较复杂和其他原因,所以就放弃了。
近日,又看见 one-kvm 项目,该项目基于 pikvm 二次开发,可以使用 docker 搭建并配置了本地化,属实是眼前一亮。最终也是功夫不负有心人,成功搭建属于自己的 ipkvm 设备了。
硬件
- 斐讯 N1 盒子
- HDMI 采集卡(需要带延长线的,否则会导致另外一个 usb 口空间被占用)
- HDMI 传输线
- USB 公对公线(用于模拟鼠标键盘,需要设备支持 OTG,否则需要 USB CH340+CH9329)
- U 盘(用于重装系统)
OTG 与 CH9329 区别说明
OTG HID:大多数 ARM CPU 支持 USB OTG 接口,该接口可以配置为 USB Host 或 USB Device 模式。在 Linux 下,它能够充当虚拟 HID 设备(如键盘、鼠标等)。此外,OTG 还支持虚拟存储驱动器(MSD)、虚拟 USB 网卡等功能。
CH9329 HID:这是一款串口转 USB HID 的芯片,在计算机上表现为标准的 USB 输入设备。它适用于 X86 架构机器,因为它们通常不支持 USB OTG。
一、安装 armbian 系统
1. 下载系统镜像
去 github 下载 armbian 的 Jammy 版本系统镜像,N1 盒子下载包含如图所示关键词的镜像即可。
其他的机器可能要下载对应的镜像,关于镜像命名可以了解一下,以下是 gpt 的回复。
镜像名称:Armbian_25.05.0_amlogic_s905d_jammy_6.1.137_server_2025.05.05.img.gz
字段 | 含义 |
---|---|
Armbian | 基于 Armbian 系统 |
25.05.0 | Armbian 项目版本号(第 25 年 05 月发布,第 0 次小更新) |
amlogic_s905d | 针对 Amlogic S905D 芯片的定制构建(DTB 和启动适配) |
jammy | 基于 Ubuntu 22.04 LTS(代号 Jammy Jellyfish) |
6.1.137 | Linux 内核版本为 6.1.137(LTS 内核) |
server | 无桌面的最小化版本 |
2025.05.05 | 镜像构建时间(2025 年 5 月 5 日) |
.img.gz | .img 是裸磁盘镜像,.gz 是压缩格式(需解压) |
最主要是查看机器的芯片,再下载对应的镜像。
2. 镜像写入 U 盘
下载写入工具 rufus。
选择好设备,以及镜像,然后点击开始。
3. 开始重装
将 U 盘插入 N1,默认使用 U 盘启动系统,这里首先会提示安装系统,比如创建用户、设置密码等操作,过程略。
安装系统完成后,使用 armbian-install
命令将镜像写入 eMMC,后面选项根据机器类型选择,比如 N1 选择 101,系统格式选择 ext4 格式。
完成后输入 poweroff
关闭系统,拔掉 U 盘。
二、安装 one-kvm
1. 修改 dts
这一步骤的操作是为了将 USB 控制器的模式从主机模式切换为外设模式,否则不能使用鼠标键盘控制其他主机。
反编译 dts 文件:
dtc -I dtb -O dts -o n1.dts /boot/dtb/amlogic/meson-gxl-s905d-phicomm-n1.dtb
修改 dts 文件,vim n1.dts
将 USB 设备的 dr_mode 从 "host" 改为 "peripheral"。
编译修改后的 dts 文件:
dtc -I dts -O dtb -o n1.dtb n1.dts
将编译好的 dtb 文件移动至 /boot/dtb/amlogic/
目录下。
mv n1.dtb /boot/dtb/amlogic/
vim /boot/uEnv.txt
修改 uEnv.txt 文件使用 n1.dtb
。
2. 安装 docker
切换 apt 源:
sudo armbian-apt
```
安装 docker:
sudo apt update
sudo apt install docker.io
3. 安装 one-kvm
直接运行:
docker run -d \
--name kvmd \
--privileged \
--network host \
-v /lib/modules:/lib/modules:ro \
-v /dev:/dev \
-v /sys/kernel/config:/sys/kernel/config \
-e OTG=1 \
-e NOMSD=0 \
-e VIDEONUM=1 \
-e USERNAME=admin \
-e PASSWORD=admin \
--restart unless-stopped \
dockerpull.pw/silentwind0/kvmd
compose 运行:
services:
kvmd:
image: dockerpull.pw/silentwind0/kvmd
container_name: kvmd
privileged: true
network_mode: host
#ports:
#- "8080:8080"
#- "4430:4430"
#- "5900:5900"
#- "623:623"
volumes:
- /lib/modules:/lib/modules:ro
- /dev:/dev
- /sys/kernel/config:/sys/kernel/config
environment:
- OTG=1
- NOMSD=0
# 双公头线插入usb0即靠近hdmi接口,采集器插入usb1即外侧
- VIDEONUM=1
- USERNAME=admin
- PASSWORD=admin
restart: unless-stopped
4. 插入外设
如果 usb 插入顺序和下图不同,那么可能用上面的启动方式无法运行。
5. 访问 kvm
访问 kvm 的地址为 https://ip:4430
,默认用户名和密码为 admin
。
效果如下:
6. 配置异地组网或内网穿透
搭建完成以后,肯定就是需要让外网能够访问到 one-kvm 了,过程略。
参考文档:
参考视频: