vdi-cloud/PROJECT_CONTEXT.md

14 KiB
Raw Blame History

数字员工 VDI 云终端项目上下文

这是本项目后续继续开发时的必读上下文。所有实现必须优先以项目经理提供的正式文档和会议纪要为准;文档未明确的地方只能标记为待确认/待调研,不能擅自定版。

本文件整理自截至 2026-10-23 的完整开发对话。

1. 项目目标

项目是“云-管-端” VDI 云桌面方案:

RK3528 云终端
  -> 终端接入程序
  -> 自研管理平台 API
  -> Proxmox VE 管理的虚拟机
  -> Windows / Ubuntu / 麒麟 / 后续安卓桌面

终端侧最终职责:

  • 开机进入 Kiosk/首配登录页;
  • WiFi/有线联网;
  • 终端注册、心跳、配置下发、日志上报;
  • 连接远程桌面;
  • 显示远程画面并传递键盘、鼠标、U 盘等外设;
  • 断线重连;
  • 独立 Monitor 看门狗;
  • A/B OTA;
  • 后续使用 VPU/DRM 硬件解码与零拷贝显示。

项目经理新增方向:RDP 可能不适合 GPU/CAD/3D 高质量低延迟串流,周一需要调研 RDP 与 Moonlight。Moonlight 只作为待调研/待验证的协议方向,不能在未验证前替换 RDP 或擅自确定端口、认证字段、嵌入方式。

2. 权威需求来源

  1. E:\Desktop\数字员工\VDI云终端产品方案-定版摘要(1).docx
    • 产品定版 v2.1。
    • 规定 RK3528 终端、2K 默认/4K 上限、FreeRDP 3、GStreamer + mppvideodec、Proxmox/KVM/VFIO、GPU 算力池、管理平台等。
  2. E:\Desktop\数字员工\VDI云桌面软件开发方案(1).docx
    • 软件开发 v1.0。
    • 规定 monorepo、终端/云端/控制台技术栈、20 项需求追踪矩阵、测试层次、M1-M4 里程碑。
  3. E:\Documents\xwechat_files\wxid_q6y4us6kip0g22_aa63\msg\file\2026-10\export_1792654201375.docx
    • 会议纪要。
    • 规定当前优先:先拿盒子、终端基础连接、Proxmox 逻辑/API、2K/4K/发热/网络验证、Monitor、OTA 后置;张帅协助 P100 GPU 验证。
  4. 会议纪要图片:项目技术要点思维导图。

核心纪律:如果代码实现与上述文档不一致,先指出偏差并等待确认;不能以“更快”或“更方便”为理由改用未定版技术栈。

3. 正式技术选型与边界

正式开发方案 2.1/2.2 节:

vdi-cloud/
├─ terminal/
│  ├─ meta-vdi/        # Yocto:BSP/内核/设备树/U-Boot/Kiosk/Agent 配方
│  ├─ kiosk-shell/     # Weston + 全屏 Qt 壳
│  ├─ freerdp-rk/      # FreeRDP 3 fork + MPP/VPU 硬解补丁
│  ├─ vdt-agent/       # Rust:注册/心跳/命令/日志
│  ├─ ota-updater/     # Rust:manifest/签名/A-B/回滚
│  └─ usb-monitor/     # Rust:udev/挂载/重定向策略
├─ platform/           # Go 云端服务
├─ console/            # Vue3 + TS + Element Plus
├─ deploy/             # compose/Helm/离线包
├─ docs/               # OpenAPI/MQTT/DB schema
└─ tools/              # 烧录/压测/CI

终端技术栈定版:

  • Kiosk 壳:C/C++ + Qt,目标显示环境 Weston/Wayland;
  • FreeRDP 插件:C/C++;
  • Agent/OTA/USB:Rust;
  • 协议主线:FreeRDP 3;SPICE 备用;自研 H.265 over QUIC 只作为后续预留;
  • 云端:Go;
  • 前端:Vue3 + TypeScript + Element Plus;
  • 数据库:PostgreSQL + VictoriaMetrics;
  • 通信:HTTPS + MQTT;
  • 云端底座:Proxmox VE + KVM/QEMU + VFIO;
  • GPU:NVIDIA CUDA、华为 CANN 等按卡型池化;终端不安装 GPU 计算组件。

开发方案 3.2 对 kiosk-shell 的明确要求:

  • 技术:Weston(Wayland)+ 全屏 Qt 壳进程;
  • 状态机:BOOT -> CONFIG -> CONNECTING -> SESSION -> RECONNECT -> ERROR;
  • 首配页:SN 绑定、WiFi 扫码、服务器地址;
  • 状态条:网络、会话、OTA 进度;
  • FreeRDP:以 libfreerdp3 API 内嵌,不拉起外部进程;
  • 全局热键:Ctrl+Alt+Shift+M 呼出管理菜单。

当前实现是在现有 Armbian 的 LightDM + Xorg 环境中先完成 Qt/Kiosk POC;这不是对正式 Weston 选型的替代。Weston/DRM 必须继续验证。

4. 盒子与联调环境

盒子

  • 型号:RK3528 PRO DDR4;
  • OS:Armbian v25.05 rolling,Ubuntu Noble 用户空间;
  • Kernel:6.1.115-vendor-rk35xx;
  • 架构:aarch64;
  • 内存:约 3.83 GB;
  • 存储:约 29 GB;
  • IP:192.168.1.188;
  • SSH:ssh armbian@192.168.1.188;
  • 图形:LightDM + Xorg,当前不是 Wayland;
  • 显示器:HDMI-1 1920x1440 @ 75Hz,没有 2560x1440 EDID 模式;
  • DRM:/dev/dri/card0、card1、renderD128、renderD129;
  • 权限:用户已在 video、render 组;
  • 温度:空载约 53°C;
  • WiFi:wlan0,SSID YXTech,信号约 -47 dBm,协商约 200 Mbit/s,实测无丢包/重传;
  • 设备节点:/dev/mpp_service、/dev/rga 存在;
  • OpenGL:Mali450,Mesa 25.0.7;Xorg 日志显示 modesetting + glamor initialized。

已安装环境

  • gcc/g++ 13;
  • make、cmake 3.28、ninja、pkg-config、git;
  • Qt5 5.15.13(Core/Gui/Widgets/Wayland 包);
  • Weston 13.0.0;
  • freerdp3-dev 3.32.1;
  • freerdp3-x11,实际命令:xfreerdp3;
  • freerdp3-wayland,实际命令:wlfreerdp3,但当前没有 Wayland 会话;
  • mesa-utils;
  • xdotool(测试用);
  • 当前未确认 mppvideodec,Ubuntu 官方源没有 Rockchip MPP GStreamer 插件。

apt 源

旧 /etc/apt/sources.list 中普通 Ubuntu 源会造成 ARM64 404,已备份为 sources.list.bak 并注释。有效配置在 /etc/apt/sources.list.d/ubuntu.sources,使用 TUNA 的 ubuntu-ports。

不要执行:

  • sudo apt upgrade:曾显示约 298 个包待升级,当前不要整体升级;
  • do-release-upgrade:不要升级系统版本;
  • 不要在盒子上安装 Proxmox,盒子是 ARM64 终端,不是 Proxmox 主机。

本机已经给盒子安装了 SSH 公钥(注释 zcode-dev),可以免密远程执行:

ssh armbian@192.168.1.188

SSH 中执行图形命令要带:

export DISPLAY=:0
export XAUTHORITY=/home/armbian/.Xauthority

5. Proxmox/Windows 联调环境

  • Proxmox VE:9.2.2;
  • 节点:starhe;
  • VM:101,名称 win10-gongchang01;
  • Windows:Windows 10 22H2 专业版;
  • VM IP:192.168.1.70;
  • RDP:TCP 3389;
  • 用户:test1;
  • 当前 POC 允许空密码登录,正式环境不能使用空密码。

边界:终端最终不应直接调用 Proxmox API。最终关系是:

终端 -> 自研管理平台 API -> Proxmox API -> 虚拟机
终端 -> 管理平台返回的桌面连接地址/网关 -> RDP 或其他协议

6. 已完成工作

6.1 网络与远程桌面基础验证

已完成:

  • 盒子 WiFi 联通;
  • Windows 10 VM 可达;
  • 手工命令 xfreerdp3 成功显示 Windows 10 桌面;
  • 键盘鼠标可操作;
  • 退出全屏最可靠方式:从 SSH 执行 pkill -f xfreerdp3;
  • 当前 X11 环境下不要直接在 SSH 无 DISPLAY 会话中启动 GUI。

6.2 monorepo

项目已在:

D:\DAIMA\vdi-cloud

已初始化 git。最近已提交:

589cde4 feat(kiosk-shell): FreeRDP 3 内嵌客户端跑通,登录页可进入远程桌面
419630f feat(kiosk-shell): 首版登录页与状态机骨架

当前 git 在日报暂停开发时有未提交改动,主要是 Monitor、心跳、网络显示修复等。不要丢弃这些改动。

6.3 kiosk-shell

位置:D:\DAIMA\vdi-cloud\terminal\kiosk-shell

已实现:

  • Qt5 全屏登录页;
  • 深色 UI;
  • SN 显示;
  • 服务器地址、账号、密码、显示分辨率;
  • 记住连接参数;
  • 本地配置文件:~/.config/vdi-terminal/client.conf;
  • 状态机:BOOT/CONFIG/CONNECTING/SESSION/RECONNECT/ERROR;
  • Ctrl+Alt+Shift+M 管理菜单;
  • RDP 会话状态;
  • 连接断开后重连状态;
  • 主进程心跳文件设计:/tmp/vdi-kiosk.heartbeat;
  • CMake + Ninja 原生 ARM64 编译通过过多次。

当前盒子上的实际运行路径:

~/vdi-terminal/bin/kiosk-shell

配置示例:

version=1
sn=...
deviceKey=
server=192.168.1.70
username=test1
password=
wifiSsid=
wifiPassword=
resolution=1920x1440
remember=1

6.4 libfreerdp3 内嵌

已实现 rdp_session.cpp/h,不拉起外部 xfreerdp3 进程:

freerdp_new()
freerdp_context_new_ex()
freerdp_connect()
FreeRDP 3 AuthenticateEx
GDI primary buffer
Qt QImage/QLabel 显示

已实测修复的坑:

  1. gdi_init 必须放在 PostConnect 中;连接前调用会在 gdi_init_ex 段错误;
  2. 不能依赖扩展 ContextSize 保存自定义指针,gdi_init_ex 可能重新分配 context 导致段错误;当前使用按 freerdp* 的静态注册表和 RdpgfxClientContext.custom;
  3. NLA 认证回调空密码必须传 strdup(""),不能传 nullptr,否则出现 SEC_E_NO_CREDENTIALS;
  4. FreeRDP 3 设置键使用 FreeRDP_ServerHostname、FreeRDP_Username、FreeRDP_DesktopWidth 等,不要照抄 FreeRDP 2.x 键名;
  5. PIXEL_FORMAT_BGRX32 是 B/G/R/X 四字节布局,Qt 显示前需要 BGR -> RGB 转换;
  6. /gfx 命令行是能力组合语义,不能把 AVC420/AVC444 当作单个值使用。实测可解析形式包括 progressive|RFX|AVC420|AVC444。

重要:当前 POC 已成功显示 Windows 10 的真实远程桌面画面,颜色正确,进程保持运行。这是目前最重要的实测成果。

详细说明在:

D:\DAIMA\vdi-cloud\docs\freerdp3-embedding-notes.md

6.5 显示问题

曾出现“从上到下卷帘式渲染”。目前确认:

  • WiFi 信号/速率/丢包不是主要原因;
  • 显示器原生是 1920x1440,而曾请求 2560x1440,存在缩放;
  • X11/MATE/FreeRDP CPU 侧渲染路径性能有限;
  • 正式文档要求 Weston + DRM plane + GStreamer mppvideodec 零拷贝,这正是后续方向;
  • 该问题按用户要求暂时不阻断当前 GUI/登录页主线,后续处理。

注意:此前对“X11 无 glamor 硬件合成”的判断不准确,Xorg 日志实际显示 glamor X acceleration enabled on Mali450;后续不要继续引用这个错误结论。正确表述是:当前路径仍未达到目标流畅度,具体瓶颈需要后续基准测试确认。

7. 当前未完成/未验证

  1. 当前工作区最后一次编译 Monitor 的命令被取消,Monitor 代码尚未确认编译通过;
  2. Monitor 的主进程心跳机制尚未做真实“崩溃/假死/自动重启”测试;
  3. kiosk-shell 开机自启尚未配置;
  4. 网络状态显示修复(此前显示错误的 600)尚未确认最新二进制效果;
  5. 当前实现仍使用 X11 POC,正式方案要求 Weston/Wayland;
  6. 当前 RDP 会话使用 CPU GDI -> Qt 复制,尚未接 GStreamer/mppvideodec/VPU;
  7. mppvideodec 来源和可用性未确认;
  8. 终端注册、MQTT 心跳、配置下发、日志上报、OTA、USB 尚未接后端 API;
  9. 前端/后端管理平台尚未接入;
  10. GPU/P100 直通与 CUDA/CAD/3D 性能尚未完成;
  11. Moonlight/Sunshine 方向只是项目经理新增的周一调研项,未安装、未验证、未纳入代码定版。

8. 下一步建议(按优先级)

A. 收尾当前终端 POC

  1. 编译并验证 vdi-kiosk-monitor;
  2. 给 kiosk-shell 与 Monitor 做真实崩溃/假死重启测试;
  3. 配置当前开发盒子的用户级开机自启,开机直达登录页;
  4. 修复并验证网络状态显示;
  5. 保留当前能进入 Windows 10 的版本作为可回退基线。

B. 按项目经理新增方向做 GPU 协议调研

周一先验证,不先改代码定版:

P100 是否成功 PCIe 直通到 Windows 10 VM
  -> VM 内 nvidia-smi 是否正常
  -> CUDA/3D 应用能否使用 GPU
  -> Sunshine 是否能在 VM 内捕获/硬编码桌面
  -> RK3528 上是否有可用 Moonlight ARM64 客户端
  -> Moonlight 是否能调用 VPU 硬解
  -> RDP 与 Moonlight 的 CAD/3D/视频延迟、帧率、CPU、温度、带宽对比

可能的最终协议策略(只能在实测后决定):

普通办公 -> RDP
GPU/CAD/3D -> Moonlight

但也可能仍然统一使用 RDP;由测试结论决定。

如果确认需要双协议,代码结构应演进为:

DesktopSession 接口
├─ RdpSession        # 保留当前 libfreerdp3
└─ MoonlightSession  # 调研后再实现
SessionManager       # 根据 API 下发 protocol 选择实现

不要在调研前擅自确定 Moonlight 端口、认证字段、库、嵌入方式或把 RDP 删除。

C. 后续 API 对接

与后端确认:

  • /api/v1/terminal/register;
  • 配置拉取接口;
  • MQTT 心跳和命令格式;
  • 桌面连接信息字段;
  • 返回 VM 地址还是 RDP/Moonlight 网关地址;
  • 是否使用一次性票据;
  • GPU 桌面如何标记协议/资源池;
  • 终端不直接调用 Proxmox API。

9. 安全与工程注意事项

  • /cert:ignore 只能用于当前局域网 POC,正式版本必须证书校验;
  • 空密码只能用于当前测试 VM,正式环境必须禁用;
  • 不要把密码提交到 git;当前本地配置仅用于 POC;
  • 终端正式版本不要长期保存 Windows 密码,应使用管理平台/网关/短期凭据方案;
  • 不要执行 git reset --hard、删除用户已有改动或覆盖未审阅文件;
  • 不要把推测写成“已实现”;日报和项目状态要区分“已验证/已完成/待验证/待调研”。

10. 今日日报关联

日报模板:E:\Desktop\日报.txt。 已按 10 月 23 日实际情况填入并保存:

  • 终端硬件与系统基线;
  • 编译环境;
  • monorepo/kiosk-shell;
  • libfreerdp3 内嵌 RDP;
  • Windows 10 远程桌面实机验证;
  • 2K 显示异常初步定位;
  • 明日 Monitor/Weston/mppvideodec/API 待办;
  • AVC444、mppvideodec、Weston、API 契约风险。

如果继续写日报,必须以实际工具执行结果为准,不能把未编译或未实测项目写成完成。