网教网

搜索
查看: 144|回复: 20

DIY 一个运维神器 Open IP-KVM

[复制链接]

2

主题

5

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2022-11-28 11:53:17 | 显示全部楼层 |阅读模式
引言

对技术爱好者来说,家里有几台不接外设,用作服务器的电脑是很常见的。当这些机器出现问题时,运维十分不便。
IPMI 技术可以解决这个问题,但此功能一般只有服务器主板才支持。
也有一些商业化的盒子可以解决这个问题,比如某葵的控控A2。
这篇文章提供一个自己实现 IP-KVM 的方案。
总体硬件投入 ~ 170 RMB。
什么是 IP-KVM,和软件远程桌面有什么不同?
KVM = Keyboard Video Mouse
IP-KVM 即 KVM over IP, 此类设备可以将目标机器的视频输出通过网络串流到客户端,并将客户端的操作同步回目标机器,实现一个硬件版本的远程桌面效果。
软件远程桌面需要目标机器有正常的 OS 和网络连接,并且预先配置好。在运维场景下,这个条件比较苛刻。
KVM 方案是带外的,所以可以用来设置 BIOS,安装系统等更底层的场景。
代码仓库

方案

1.如何采集视频输出

使用 HDMI-USB 视频采集卡获取信号, 通过 MJPG-Streamer 推流
2.如何模拟键盘,鼠标操作

使用串口控制支持模拟 HID 设备的单片机,单片机通过 USB 连接到目标设备
3.客户端

使用浏览器作为远控客户端
4.架构图




系统架构

硬件选型

1. 运行平台

这里采用一个 运行 Linux 的低功耗电脑 (SBC) 作为 IP-KVM 软件的运行平台。
常见的有树莓派或海鲜市场的某讯 N1。



某讯 N1



Raspberry Pi 4 Model B

如果使用 N1,需要刷入 Armbian,还需要一个 USB-TTL 的串口适配器(PL2303HX)。
这里给出 N1 相关的一些教程。

  • exciting frog:在斐讯N1盒子上刷入Linux系统代替树莓派做小型服务器
  • lryong:Armbian 配置 WIFI 教程
如果树莓派比较老,是不带 WIFI 的型号,还需准备一个 USB 网卡。
2. 单片机键鼠模拟

模拟 HID 采用 Arduino Leonardo,有成熟的库和实例代码。



Arduino Leonardo

3. HDMI 采集

HDMI-USB 采集卡市面上基本都是基于 MS2109 芯片的方案,支持最高 4K 30FPS 输入和 1080P 30FPS 输出。



HDMI-USB 采集卡

注意需要选择支持 M-JPEG 输出的采集卡,可以免去视频编码流程直接串流,这样对于 Linux 板子基本没有性能要求。
这里我走过一些弯路:
一开始选择采用常见的直播推流方案,即采集卡用 YUV 输出,FFmpeg 进行H.264编码,使用 FLV 封装 RMTP 推流到远端。 结果是性能和延迟都很爆炸,完全不可用。
软件实现

代码结构
open-ip-kvm
    │
    ├─public
    │      app.mjs
    │      index.html
    │      kb.mjs
    │      mouse.mjs
    │      style.css
    │      ws.mjs
    │   
    │   
    ├─server
    │      config.json
    │      index.js
    │      mjpg-streamer.js
    │      serial.js
    │
    └─virt-hid-arduino
            device-info.txt
            virt-hid-arduino.ino1. IP-KVM 软件

使用 Node 编写,主要功能

  • 提供静态 HTML 资源
  • 浏览器通过 Websocket 将用户的鼠标,键盘指令发给 Node 服务,Node服务通过串口转发到 Leonardo
2. 浏览器客户端

主要功能

  • 显示 MJPEG 视频流
  • 采集键鼠操作并通过 Websocket 发送
  • 简单的 UI 交互
值得一提的有

  • PointerLock API 的使用
  • 与单片机交互的二进制协议是在前端实现的,分为 KB_EVT,MOUSE_EVT 和 KEY_SEQUENCE_EVT 三种事件

    • 前两者是定长的,代表捕获的键鼠事件,包括 KeyDown, KeyUp, MouseDown, MouseUp 等子类型
    • KEY_SEQUENCE_EVT 是 ASCII 字符序列,会按照顺序逐个执行对应按键按下-抬起的动作,用于 Remote Paste

3. Arduino Leonardo HID 模拟

参考官方库即可,主要的问题在于实现一个相对鲁棒的二进制协议。
详见 Repo 的 virt-hid-arduino/virt-hid-arduino.ino
成本汇总

项目参考价格
某讯 N180,之前40入手
Arduino Leonardo45
HDMI-USB 采集卡30
USB-TTL 转换器15
总计170
测试效果

使用时只需要将 SBC 供电,并且将 HDMI 线和 Leonardo 的 USB 插到目标机器,就可以通过浏览器控制了。
实测键盘延迟完全不可感,鼠标略有延迟,但可以正常使用。



远程控制一台 Windows 机器

基本达成设计目标。
Update 10/30   v1.0.0版本


  • 重构了 Client
  • UI 更新, 添加状态指示器和帮助
  • 新功能:远程快速输入 ASCII 字符流 - Remote Paste



帮助



Remote Paste

Update 11/01

回复里不少人在讨论为什么不直接用 pikvm,大概有几个原因
1. pi及其配件的溢价比较多
早些年我也玩过 pi,转接板风扇壳子一套搞下来,都和商业方案差不多价格了
2. 我想要一个通用方案
可以跑在 x86/arm 的各种设备上,包括但不限于电视盒子/intel 电脑棒/软路由/淘汰的笔记本。
3. DIY 的目的就是过程
可以学到很多东西,另一方面这个项目的代码我比较注意可读性,所以各位可以根据需求去定制。

大哥你玩摇滚,你玩它有啥用啊

Update 11/20

有评论提到了可能以直接用 Linux SBC 的 OTG 来模拟 HID 设备,从而省去 Arduino。
研究了一下,这个方向是可行的,但是只有部分硬件支持 USB Device Mode。尤其是树莓派,只有较新的 Raspberry Pi Zero, Zero W, A, A+ 和 4 支持。
所以使用 Arduino 来模拟是一个更为通用的方案。
回复

使用道具 举报

0

主题

6

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2022-11-28 11:53:22 | 显示全部楼层
linux似乎有个functionfs,可以用otg接口模拟鼠标键盘,这样的话就不用再外接开发板了
回复

使用道具 举报

1

主题

3

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2022-11-28 11:53:28 | 显示全部楼层
写得很好 下次帮我修一下
回复

使用道具 举报

1

主题

5

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2022-11-28 11:53:39 | 显示全部楼层
vga in
回复

使用道具 举报

1

主题

2

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 2022-11-28 11:54:37 | 显示全部楼层
vga用转接头或者换个VGA采集卡就可以了,用法不变
回复

使用道具 举报

0

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2022-11-28 11:55:25 | 显示全部楼层
开源了吗,发下仓库地址[赞同]
回复

使用道具 举报

2

主题

7

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2022-11-28 11:56:00 | 显示全部楼层
文章开头就有
回复

使用道具 举报

0

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2022-11-28 11:56:24 | 显示全部楼层
pi-kvm有现成的。
回复

使用道具 举报

1

主题

4

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2022-11-28 11:56:58 | 显示全部楼层
鼠标延迟可能是30fps刷新造成的?
回复

使用道具 举报

1

主题

4

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2022-11-28 11:57:08 | 显示全部楼层
usb采集卡会引入接近100ms的延迟,这是主要部分
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表