通过 One-KVM 实现 BIOS 级远程控制
一、简介
BIOS 级远程控制(即 KVM over IP)能够让您在 BIOS 阶段就远程查看与操作被控主机,就像直接在被控主机前面操作键盘、鼠标、显示器一样。One-KVM 是一个开源项目,专门用于在类似“玩客云”(公版插拔式小型 Linux 主机)之类的嵌入式设备上搭建 KVM over IP。得益于 One-KVM,您无需昂贵的硬件 KVM 设备,就能通过浏览器实时查看被控主机的屏幕,并在 BIOS、操作系统安装、故障排查等场景下随时远程操控。
本文将重点介绍如何检测 USB Device Controller (UDC)、优先通过 Docker 部署 One-KVM,并在无法容器化时使用镜像刷写,搭建完整的 BIOS 级远程控制环境,详细说明所需的硬件连接方式、网络访问配置、BIOS 设置等关键环节。
二、硬件与软件准备
1. 硬件部分
-
玩客云(Warp Station / 或其他类似的嵌入式主机,例如魔百盒CM311-1A)
-
具有 USB OTG 口与 USB Host 口,支持加载 USB Gadget 内核模块。
-
已刷入 Linux 系统,能够安装 Docker,并可通过镜像或直接刷写方式部署 One-KVM。
-
-
公对公 USB 数据线(USB A–A)
-
用于将玩客云模拟出来的 USB 键盘/鼠标信号,直连到被控主机的 USB 接口。
-
要求线材质量可靠,确保 USB 接口能够正常传输键鼠 HID 协议。
-
-
USB 视频采集卡(HDMI to USB)
-
用于将被控主机的 HDMI 输出实时采集并传输给玩客云。
-
常见型号示例(京东购买链接):
【京东】腾飞 TENGFEI Switch 视频采集卡 1080P60HZ HDMI 采集器 4K 输入,USB 直插款
-
型号如 MS2109、MS2130 等均可,要求能接收 HDMI 信号后以 UVC(USB Video Class)标准输出。
-
-
采集卡连接示意:
被控主机 HDMI OUT ──(HDMI线)──▶ USB 采集卡 (HDMI IN) USB 采集卡 (USB A) ──(USB线)──▶ 玩客云 USB HOST
-
-
网络环境(局域网)
-
一台支持 DHCP 或固定 IP 的路由器,确保玩客云和操控端(浏览器所在电脑)在同一局域网。
-
建议使用千兆网络,以确保视频帧率与带宽性能最佳。
-
-
另一台操控端电脑(或笔记本)
-
在该电脑的浏览器中访问玩客云的 Web 控制界面,实时查看、操作被控主机。
-
2. 软件部分
-
One-KVM 官方 Docker 镜像或整合包
-
推荐优先使用 Docker 部署,以便持续更新与管理。如果内核未暴露 UDC,则需采用“方式二:镜像直刷”。
-
Docker 与依赖
-
如果计划使用 Docker 部署,则需预装
docker.io
、git
等。 -
确保 Docker 版本高于 20.10,且系统支持
--privileged
模式。
-
-
刷机工具
-
如需采用镜像直刷方式,可使用以下工具将
.img
文件写入 TF 卡或 eMMC:-
BalenaEtcher(跨平台,支持
.img
直接刷入 SD 卡)。 -
dd 命令(Linux/macOS),如:
sudo dd if=One-KVM-usb-image.img of=/dev/sdX bs=4M status=progress && sync
-
STM32CubeProgrammer / 官方烧写工具(若玩客云需通过串口或专用接口刷写)。
-
-
-
浏览器
-
建议使用最新版 Chrome/Firefox/Edge,启用 WebSocket 与 WebRTC 支持,以获得更流畅的 KVM 视频预览和输入响应。
-
三、One-KVM 系统部署与刷写
在本节中,首先解释如何判断是否可使用 Docker 模式,如果满足条件优先使用 Docker 部署;否则采用镜像直刷方式。
1. 检查 UDC(USB Device Controller)
-
登录到玩客云系统
-
通过串口或在当前系统中使用 SSH 登录,执行:
ls /sys/class/udc
-
-
判断结果(实测玩客云刷的hinas不行,魔百盒刷armbian可以)
-
如果输出为空,说明当前内核未暴露任何 UDC 设备给用户态,此时无法使用 Docker 部署,必须采用“方式二:镜像直刷”。
-
如果输出不为空(例如看到
musb-hdrc.0.auto
或xhci-hcd.0.auto
等名称),说明可以通过容器化方式部署 One-KVM,并且 Docker 容器能够访问 UDC,从而模拟 USB HID Gadget。
-
1.1 UDC 目录为空 → 必须使用镜像直刷方式
-
参照“方式二:镜像直刷”步骤(见下文 2.2)进行刷机。
-
镜像直刷方式会使 One-KVM 在系统根环境中运行,加载必要模块(
g_hid
、uvcvideo
、v4l2loopback
等),无需 Docker。
1.2 UDC 目录不为空 → 优先使用 Docker 部署
如果 ls /sys/class/udc
确认存在可用的 UDC 设备,请按照以下步骤通过 Docker 部署 One-KVM:
-
安装 Docker 与依赖
sudo apt-get update sudo apt-get install -y docker.io git sudo systemctl enable docker sudo systemctl start docker
-
获取 One-KVM 仓库并进入 Docker 目录
git clone https://github.com/mofeng-git/One-KVM.git cd One-KVM/docker
-
仓库中包含 Dockerfile 及部署脚本,可根据需求定制。
-
-
构建并运行容器
-
修改
docker-compose.yml
或run.sh
,确保映射主机关键设备:version: '3' services: kvmd: image: silentwind0/kvmd container_name: kvmd privileged: true environment: - OTG=1 volumes: - /lib/modules:/lib/modules:ro - /dev:/dev - /sys/kernel/config:/sys/kernel/config ports: - "8080:8080" - "4430:4430" - "5900:5900" - "623:623"
-
或使用 Docker CLI:
sudo docker run --name kvmd -itd --privileged=true \ -v /lib/modules:/lib/modules:ro -v /dev:/dev \ -v /sys/kernel/config:/sys/kernel/config -e OTG=1 \ -p 8080:8080 -p 4430:4430 -p 5900:5900 -p 623:623 \ silentwind0/kvmd
-
-
验证 USB Gadget 模块加载
-
执行:
docker exec -it one-kvm bash ls /sys/class/udc lsmod | grep g_hid lsmod | grep uvcvideo
-
如果
/sys/class/udc
依旧可见,并且模块已加载成功(g_hid
、uvcvideo
),则表明容器化部署正常。
-
-
启动 KVM 服务
-
在容器内执行:
cd /opt/one-kvm ./start_kvm.sh
-
确保控制台输出无 “Can't find any UDC” 错误。
-
-
浏览器访问与测试
-
打开浏览器,访问(直接系统安装的默认80端口):
https://<玩客云_IP>
-
首次登录默认
admin / admin
,进入 Web KVM,确认可以看到被控主机的屏幕(/dev/video0)并传递键鼠 HID。
-
注意:并非所有玩客云型号都能在容器内为 USB Gadget 驱动提供完整访问。即使
/sys/class/udc
有内容,也应实际测试后再决定是否继续采用 Docker 模式。如出现“g_hid”或“uvcvideo”模块加载失败,请切换为镜像直刷方式。
修改默认端口号
打开并编辑
/etc/kvmd/override.yaml
,在kvmd:
下新增或修改nginx.https.port
:kvmd: nginx: https: port: 4430
(这会把 HTTPS 监听端口改为 4430。)
重新加载并重启 kvmd 服务和重启电脑:
systemctl daemon-reload systemctl restart kvmd reboot
2. 镜像直刷方式(方式二)
如果 UDC 目录为空或 Docker 模式部署失败,需要使用“镜像直刷”将 One-KVM 系统镜像直接写入玩客云。
2.1 下载 One-KVM 整合包镜像
-
打开浏览器,访问 One-KVM 仓库:
https://github.com/mofeng-git/One-KVM
-
在“Releases”页面中,下载最新的
One-KVM-*-playker.img.gz
或者.img
格式固件包。-
例如:
One-KVM-playker.img.gz
(假设此版本已集成玩客云特定驱动)。
-
2.2 刷入镜像
根据玩客云型号和存储位置,选择以下两种方式之一进行刷写:
2.2.1 TF 卡 / SD 卡刷写(适用于支持外接 SD 卡的型号)
-
解压镜像
gzip -d One-KVM-playker.img.gz # 解压得到 One-KVM-playker.img
-
插入 TF 卡到电脑读卡器
-
使用 BalenaEtcher
-
打开 BalenaEtcher,选择刚才解压的
.img
文件作为“映像”,选择 TF 卡对应设备,点击“Flash”一键刷入。
-
-
等待写入与校验完成
-
完成后安全弹出 TF 卡,将 TF 卡插回玩客云。
-
-
启动玩客云
-
设备通电,引导时会自动从 TF 卡启动 One-KVM 系统。初次启动需等待约 1–2 分钟,直到指示灯或串口日志提示系统就绪。
-
2.2.2 eMMC 直刷(适用于无外接 SD 卡的型号)
-
通过 USB 串口刷写
-
使用串口线(如 TTL USB 转串口)连接到玩客云刷机接口,安装对应驱动(Windows 下为 CH340/CP210x 驱动)。
-
-
进入刷机模式
-
按住“刷机”按键(或短接指定引脚)同时插上电源,即可进入刷机等待状态。
-
-
使用官方刷写工具
-
例如 STM32CubeProgrammer 或厂商提供的烧写工具,选择 One-KVM
.img
文件,目标设备选择 eMMC(或内部存储),点击“开始烧写”。
-
-
等待进度完成
-
约需 2–3 分钟,直到工具提示写入成功。然后断电重启即可进入 One-KVM 系统。
-
注意:不同厂商定制的玩客云硬件可能存在细微差异,具体以设备官方刷机文档为准。刷写时确保断开其他外设,以免误选其他存储设备。
四、网络访问与基础配置
1. 启动与 IP 获取
-
通电启动 One-KVM 系统
-
如果是镜像直刷方式,直接通电启动;如果是 Docker 方式,确保容器已启动并运行。
-
-
查看 IP 地址
-
在玩客云上执行:
ip addr show eth0
-
查看
inet
所示的 IP(如192.168.31.86/24
)。如果 DHCP 分配失败,可在/etc/network/interfaces
或使用nmcli
手工配置静态 IP。
-
-
局域网扫描(可选)
-
如果不方便登录,亦可通过局域网扫描工具(例如 Fing、Advanced IP Scanner)查找设备名为
One-KVM
或 MAC 前缀为02:42:ac
的设备。
-
2. 浏览器访问 Web 管理界面
-
输入地址
-
在同一局域网内的操控端电脑上,打开浏览器,输入:
https://<玩客云_IP>/
-
Docker 模式通常映射到 8443 端口;镜像直刷可能映射到 443 或 6080,取决于配置。
-
-
例如:
https://192.168.31.86/
或https://192.168.31.86:8443/
-
-
忽略证书警告
-
淘宝自签名证书,浏览器会提示不受信任,选择“高级”→“继续访问此网站(不安全)”。
-
-
登录默认账号
-
默认账号密码:
用户名:admin 密码:admin
-
登录后建议立即在“系统设置”中修改管理员密码。
-
3. 主要功能模块
-
Web KVM(远程控制):可通过浏览器实时查看被控主机画面,并发送键鼠输入。
-
系统设置:配置网络参数、修改密码、上传新的固件镜像、查看系统日志等。
-
固件升级:支持上传新的 One-KVM 镜像进行在线升级,保留用户配置。
五、硬件连接与 BIOS 级远程控制
1. 硬件拓扑示意
┌─────────────────────────┐
│ 被控主机 A │
│ (台式机/服务器/笔记本) │
│ │
HDMI 输出 ────(HDMI线)──▶ USB 采集卡 (MS2109/MS2130)──(USB A 线)──▶ 玩客云 USB HOST 口
│
│
公对公 USB A–A 线 │
└──▶ 玩客云 USB OTG 口 (模拟键盘/鼠标)
┌─────────────────────────┐
│ 玩客云 B │
│ (已部署 One-KVM) │
│ IP:192.168.31.86 │
│ │
└─────────────────────────┘
┌─────────────────────────┐
│ 操控端电脑 C │
│ (浏览器访问) │
│ IP:192.168.31.xx │
└─────────────────────────┘
说明:
-
USB 视频采集卡
-
负责采集被控主机 A 的 HDMI 输出,并通过 UVC(USB Video Class)将视频流传输给玩客云 B。
-
采集卡的 USB 端必须插入玩客云的 USB Host(母口)上,被系统识别为
/dev/video0
。
-
-
公对公 USB A–A 数据线
-
将玩客云 B 模拟出的键盘/鼠标信号注入被控主机 A 的 USB 主机口。
-
在 One-KVM 系统内,此口会被注册为 HID Gadget,使得被控主机 A 识别为一个标准的 USB 键盘与鼠标。
-
-
网络连通
-
玩客云 B 必须连接到局域网,以便操控端 C 访问;被控主机 A 可与玩客云同网段,提高系统安装与调试效率。
-
BIOS 级控制的关键数据(键鼠输入、视频帧)通过本地 USB 连接完成,网络延迟只影响画面刷新。
-
2. 连接步骤与 BIOS 设置
-
准备所有线材与设备
-
确保电源稳定,可使用不间断电源(UPS)以防断电造成设备损坏。
-
被控主机 A 处于关机状态时进行硬件接线,避免热插拔风险。
-
-
连接 HDMI 采集
-
将被控主机 A 的 HDMI 输出插上一根 HDMI 线,另一端插入 USB 视频采集卡的 HDMI In。
-
将采集卡的 USB A 插头插入玩客云 B 的 USB Host 端口;系统应自动识别为
/dev/video0
。
-
-
连接 USB 键鼠模拟
-
将公对公 USB A–A 线的一端插入玩客云 B 标记为 USB OTG 或 Device 的端口,另一端插入被控主机 A 的 USB 主机口。
-
在被控主机 BIOS/UEFI 中,确保“USB Keyboard Support”或“USB Legacy Support”处于开启状态,否则 BIOS 阶段将无法识别 HID Gadget。
-
-
启动流程
-
启动玩客云 B 并确保 One-KVM 系统/容器已就绪;打开操控端 C 的浏览器,访问 One-KVM Web KVM 界面,并点击“Launch KVM”。
-
在 KVM 界面出现“Waiting for video stream…”时,按下被控主机 A 的电源键,系统进入 BIOS 启动流程;浏览器中即可实时看到 BIOS 界面。
-
-
测试远程操控
-
在 KVM 窗口中单击,以获得焦点,然后使用键盘与鼠标操作 BIOS,例如导航到“Boot”菜单、更改启动顺序、在 BIOS 中保存退出。
-
若需要远程安装系统,可在 BIOS 中选择 U 盘启动,此时操控端可远程完成安装流程,包括选择分区、输入命令等。
-
检测One-KVM和远程机关机开机是否正常,通电开机是否正常
-
boot启动顺序必须把远程启动系统放第一项,或者删除启动项,
3.禁用 启动项 USB Mass Storage(“Linux File-CD Gadget”)
1. SSH 登录到玩客云
用 SSH 连接到玩客云(Armbian):
ssh root@<玩客云_IP>
确保你已经切换到
root
用户,或者使用sudo
提升执行权限。2. 验证 mass_storage 是否被禁用
登录玩客云,执行:
ls /sys/kernel/config/usb_gadget/kvmd/functions
如果输出仅包含以下几项,说明 mass_storage 才被正确禁用:
ecm.usb0 hid.usb0 hid.usb1
mass_storage.usb0
。 如果仍看到mass_storage.usb0
,请检查override.yaml
是否缩进或拼写有误,然后重复第 2 步至第 4 步。3. 重新加载并重启 kvmd 服务
sudo systemctl daemon-reload sudo systemctl restart kvmd
此时 kvmd 会根据新的
override.yaml
重新在 ConfigFS 下(/sys/kernel/config/usb_gadget/kvmd
)构建 Gadget。如果此时 mass_storage 已被禁用,你会看到/sys/kernel/config/usb_gadget/kvmd/functions
目录下只有 HID + ECM 三路功能,而不再有mass_storage.usb0
。但有时候单重启 kvmd 并不会立刻删除已有的 ConfigFS 目录,需要再进行一次整机重启。4. 重启玩客云主机(必须)
为了确保 ConfigFS 中的旧 Gadget 被彻底移除,并且 kvmd 能用新配置重新挂载,你需要重启整台玩客云:
sudo reboot
等待系统完全启动(一般约 30–60 秒)。
5. 编辑
/etc/kvmd/override.yaml
先备份旧的配置(推荐):
cp /etc/kvmd/override.yaml /etc/kvmd/override.yaml.bak
用你喜欢的编辑器打开
override.yaml
:vim /etc/kvmd/override.yaml
找到文件中与
msd:
相关的部分,形如:msd: type: otg remount_cmd: /bin/true msd_path: /var/lib/kvmd/msd normalfiles_path: NormalFiles normalfiles_size: 256
将
type: otg
改为type: disabled
,其余字段保留(也可以直接删除不再需要的行,但此处推荐只改动type
)。最终效果类似:msd: type: disabled remount_cmd: /bin/true msd_path: /var/lib/kvmd/msd normalfiles_path: NormalFiles normalfiles_size: 256
type: disabled
会告诉 kvmd 不要再创建 mass_storage 功能。- 其余字段可以保留,以便日后需要时恢复。
确认文件其余部分保持原样(不要误改其它段落的缩进或关键词),然后保存并退出:
-
六、软件层面细节与优化
1. Docker 模式下的 UDC 判断与部署
-
检查 UDC(USB Device Controller)
-
执行:
ls /sys/class/udc
-
如果输出为空,则说明当前内核未暴露 UDC,无法使用 Docker 模式,需采用镜像直刷。
-
如果输出不为空(例如
musb-hdrc.0.auto
或xhci-hcd.0.auto
),则可使用 Docker 部署。
-
-
Docker 部署步骤
-
已在第三节“1.2 UDC 目录不为空 → 优先使用 Docker 部署”中详细说明相关步骤,此处不再重复。
-
2. 解决 Docker 模式下 RuntimeError: Can't find any UDC
如果尝试使用 Docker 部署 One-KVM 时,出现如下错误:
RuntimeError: Can't find any UDC
且确认 ls /sys/class/udc
输出为空,说明 Docker 容器无法访问到主机的 UDC,导致 USB Gadget 驱动无法创建。此时,务必放弃 Docker 模式,使用镜像直刷方式以保证内核模块直接加载。
3. One-KVM 内部关键组件
-
uvc-gadget 驱动(v4l2loopback + gadgetfs)
-
将采集到的 USB 摄像头流(/dev/video0)通过 v4l2loopback 转发给 KVM Web 端。
-
-
g_hid 驱动
-
通过 USB OTG 将玩客云模拟成一个标准的 USB 键盘/鼠标设备,注入到被控主机。
-
-
WebSocket 与 WebRTC
-
KVM 视频通过 WebSocket/WebRTC 推送到浏览器,确保实时性与低延迟。
-
-
后台守护程序(如
kvm-service
)-
负责协调视频流、音频(可选)、键鼠输入,并与前端 Web 界面进行交互。
-
在镜像直刷方式中,上述所有内核模块与用户态程序都已预装并自动启动,普通用户无需额外配置。
4. 网络优化建议
-
固定 IP
-
为玩客云分配一个局域网固定 IP,便于快速访问与自动化脚本。
-
-
带宽与延迟
-
如果局域网带宽有限(如 100Mbps),建议将 KVM 视频分辨率调低,例如降为 720×576,以减少传输延迟。
-
-
访问加密
-
One-KVM 默认使用 HTTPS(自签名)传输视频流,已具备基本加密。若需要内部信任链,亦可上传自定义证书。
-
七、BIOS 级远程控制实战演示
下面以一个典型场景举例,说明如何在 BIOS 阶段进行远程控制:
-
接通所有线缆并确认在线
-
确保 USB 视频采集卡、USB A–A 键鼠线按之前方式接好;玩客云 B 已启动并分配 IP。
-
-
打开操控端 C 浏览器,访问 One-KVM
-
输入
https://192.168.31.86[:8443]/
,跳过证书报错,登录后台。
-
-
进入“Web KVM”界面
-
点击“Launch KVM”按钮,等待几秒钟,KVM 界面载入,出现“Waiting for video stream…”的提示。
-
-
开机被控主机 A
-
此时按下电源键,被控主机 A 进入 BIOS 启动流程。
-
在 KVM 界面中,能实时看到 BIOS 界面(可能有 1–2 秒延迟)。如果没有图像,请先确认采集卡是否被 One-KVM 识别为
/dev/video0
。
-
-
在 BIOS 里进行设置
-
在 KVM 窗口中点击一次以获取焦点,然后使用键盘方向键、Enter、Esc 即可导航 BIOS 菜单。例如,将 U 盘设为第一启动项,按 F10 保存并退出。
-
-
测试系统安装/维护
-
可在 BIOS 中选择使用 U 盘启动,此时系统会引导到安装程序。远程操控端即可完成系统安装,包括分区、输入安装命令等。
-
如果系统崩溃或需要远程调试,也可进入紧急修复模式,观察启动日志并执行必要的命令。
-
注意:在上述操作过程中,如果出现画面卡顿或按键响应延迟,可尝试:
在 One-KVM 设置中适当调低分辨率和帧率(如 720p, 15fps)。
确保 USB A–A 线质量良好,无反向供电或接触不良。
在 BIOS 设置里,确保“USB Legacy Support”和“USB 2.0 Controller”已开启。
八、常见问题与注意事项
-
浏览器无法加载 KVM 界面 / 视频黑屏
-
检查浏览器是否允许 WebSocket 和 HTTPS 端口(如 6080、8443)通过。
-
SSH 登录到玩客云,确认 KVM 服务和采集卡识别:
ps aux | grep kvm-service # 确认 kvm-service 是否在运行 ls /dev/video* # 确认是否存在 /dev/video0
-
如果
/dev/video0
不存在,尝试加载模块:modprobe uvcvideo modprobe v4l2loopback
-
检查 USB 供电:部分 USB 采集卡需要较大功率,若供电不足,可以通过带电源的 USB 集线器供电。
-
-
被控主机 A BIOS 阶段无法识别键盘输入
-
确认被控主机 BIOS 中“USB Legacy Support”或“USB Keyboard Support”已开启。
-
在玩客云上执行:
dmesg | grep g_hid
如果没有看到
g_hid gadget initialized
,说明 USB OTG Gadget 未正常创建,检查公对公 USB A–A 连接是否插对口(Host 端与 Device 端)。
-
-
采集卡延迟 / 丢帧
-
尝试更换高质量 HDMI 线缆与 USB 线。
-
在 One-KVM 设置里将分辨率由 1080p 降至 720p,帧率由 30fps 降至 15fps,以提高稳定性。
-
-
BIOS 更新与兼容性
-
某些服务器主板对 HID Gadget 兼容性较差,可能在 BIOS 层面无法识别。可尝试升级主板 BIOS 版本并重试。
-
-
安全建议
-
初次登录 One-KVM 后,请立即修改管理员密码。
-
建议在路由器或防火墙中为 One-KVM 限制可信 IP,让非授权网络无法访问控制界面。
-
定期关注 One-KVM 官方仓库更新日志,及时升级以修复潜在漏洞。
-
九、总结
通过本文的步骤,您可以在“玩客云”设备上轻松搭建 One-KVM,实现对被控主机的BIOS 级远程控制:
-
优先检查 UDC 并尝试 Docker 部署,如无 UDC 再使用镜像直刷。
-
硬件连接关键点:USB 视频采集卡采集 HDMI,公对公 USB A–A 线提供键鼠 HID;确保 BIOS 中已启用 USB Legacy Support。
-
网络访问:通过浏览器访问
https://<玩客云_IP>[:8443]/
,登录 One-KVM,进入 Web KVM 即可实时操控 BIOS 和系统安装流程。 -
常见问题:主要集中在 USB 兼容性、采集卡驱动、网络延迟等方面,可通过加载内核模块、调低分辨率、优化线缆等方式解决。
本文作者: 永生
本文链接: https://yys.zone/detail/?id=430
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
评论列表 (0 条评论)