vdi-cloud/MEMORY.md

18 KiB
Raw Blame History

继续开发前必读

完整对话总结在:D:\DAIMA\vdi-cloud\PROJECT_CONTEXT.md

2026-11-03 U 盘真实设备透传 POC

  • 用户明确要求 Windows 枚举真实 USB。已开发 Rust terminal/usb-monitor(标准库),usbredir+受限SSH隧道+PVE QMP usb-redir;盒子不调用PVE API。
  • Kingston 0951:1666 / USB序列号408D5C1653D4E44179789251,物理3-1(USB2/480M);Windows正常枚举USB Mass Storage / Kingston USBSTOR,KINGSTON F:、FAT32、Removable、Healthy。
  • 独立VDI_USB_TEST_20261103-173342目录新增1MiB文件并复制回VM,三份SHA一致;用户安全弹出后真实拔插,17:34:43断开、17:34:53重连,F:恢复且文件SHA一致。原文件未改,测试目录保留。
  • 仅固定VID/PID/serial纯存储,拒绝键鼠/复合设备/本地挂载/holder/swap;udev只禁止这只盘本地自动挂载。最初口报-71,换口后成功,不是软件修好了原口。
  • 盒子vdi-usb-monitor.service、PVE vdi-usb-tunnel-100.service active/enabled;QMP端点vdi_usb_box_100/vdi_usb_redir_100仅运行时,VM/PVE重启需管理员重新attach。未验收开机恢复/多用户生产能力。
  • 盒子备份~/vdi-terminal/backups/usb-device-20261103-172709;PVE密钥/etc/vdi-usb-poc/vm100,回环40001经SSH。未装Windows驱动、开测试签名、重启或改GPU/串流;Moonlight PID46934保留,GTX965M错误0。
  • 详见docs/usb-device-poc-20261103.md及evidence/usb-device-20261103;工具deploy-usb-device-poc.py、usb-device-qmp.py、test-usb-device-poc.ps1。

2026-11-03 Windows保留单个2K主屏(最新)

  • 用户明确授权:不影响2K才能改,否则不动。现场VDD已变DISPLAY4,原主屏2560×1440@60;Basic DISPLAY1另扩展2K64,NV DISPLAY2原本无活动输出。
  • 已只停用Basic桌面输出,VDD成为唯一活动主屏,保持2K60;未禁用/卸载任何显卡、未重启。原Moonlight PID46934/2K45继续,截图正常;GPU错误0,Sunshine重建h264_nvenc,编码10%。
  • 新工具set-single-vdi-display.ps1、run-single-vdi-display.py支持Query/Apply/Restore,有2K60主屏前置条件、XML布局备份、读回失败恢复、设备身份校验;临时任务已删除。备份C:\ProgramData\VDI\single-display-20261103\before.xml。
  • 布局已按当前用户保存,但未重启/重登验收;设备管理器仍有适配器,不能说卸载设备或保证设置界面不列未连接输出。详见docs/single-display-20261103.md及对应evidence。

2026-11-03 独立光标受控原型

  • 已实测Windows真实箭头/文字/左右缩放/忙碌静态形状导出和盒子X11本地显示,热点正确,隐藏全透明;短暂停Moonlight小于0.5秒,本地指针仍移动,已恢复SIGCONT。
  • 最后完整轮32/32跨区点击正确,归一化坐标最大差1px;10项边界测试通过,0.8秒辅助状态租约到期退出/SDL资源归还通过。未测物理输入到屏幕延迟。
  • 这是脚本形状回放和受控Sunshine全局N快捷键交接,不是自动形状同步,不是生产独立光标;没有替换正常Moonlight/Sunshine二进制。正式须改双方控制通道、帧边界ACK/租约与SDL生命周期,并适配Weston。
  • 首两轮辅助连接退出后XFixes图像不可用,修正为XFixes临时隐藏下成对切Moonlight本地C快捷键,让SDL重新设置其拥有的隐藏指针;第三轮完整通过。静止画面N切换旧箭头留旧帧也已实测,不能靠快捷键直接上线。
  • 已停删VDICursorPOC,正常PID31694/2K45/原SHA保留,VDD2K60、GPU错误0/NVENC编码11%、显示守护active;最后本地透明1×1,正常Windows单个白色远程箭头。未重启/改ROM/VFIO/主题。
  • 详见docs/independent-cursor-feasibility-20261103.md及对应evidence。新增cursor-poc工具仅实验,不自动启动;verify-cursor-poc-box.py点击仅可用于临时Windows测试窗口。

2026-11-03 GPU修复后联调与45帧落地

  • 用户确认运维修复结束,授权的鼠标优化任务已恢复。现场复核GTX965M错误码0、vBIOS84.04.2b.00.13、 Sunshine实际h264_nvenc、NVENC会话1;正常重连后编码占用18%。本轮未改ROM/VFIO、未重启任何机器。
  • 修正的测试源实测约59.4~59.8FPS;2K30实渲染29.83FPS;2K60接收58.82但只渲染46.11, 客户端等待队列7.54ms,GPU89~95%/800MHz。原长队列渲染仍46且排队36ms;nearest实验42;VSync24,均未采用。
  • 已落地Windows VDD2560x1440@60、正常kiosk票据45FPS;短测实渲染44.22/队列1.30ms, 约两分半持续动态会话43.14/队列1.55ms/网络实际丢帧0。不能称稳定2K60或零延迟。
  • Windows活动VDD变为DISPLAY3,动态查找;登录脚本tools/set-2k-display.ps1默认60、支持RefreshRate30。 已备份/部署并手动运行原VDISet2KDisplay任务,独立Query确认60Hz;未通过重启验收登录触发。 Windows原脚本/任务XML:C:\ProgramData\VDI\backups\display-refresh-20261103-142920。
  • tools/set-terminal-fps.py支持30/45/60、原子写入和备份;当前30票据备份 ~/vdi-terminal/backups/fps-20261103-143333-297521/desktops.json。正常流程重新连接PID31694实际fps45。
  • 正常二进制仍35de7b...afa00f,RKMPP/DRM PRIME/EGL、最新帧队列、无VSync/无pacing,第三补丁不开。 nearest实验保留terminal/moonlight/experiments/0004-vdi-egl-exact-size-sampling.patch,已撤回正常源码且不进构建器。
  • Windows临时基准任务已停止并删除,256次交替点击记录全部位置正确;用户原应用保留,恢复正常Windows串流。 显示守护active,2560x1440输出正常。独立光标尚未实现;稳定2K60需继续验证更低开销呈现路径。
  • 详细对照、限制与回退见docs/2k60-validation-20261103.md,证据docs/evidence/2k60-20261103/。

2026-11-03 午后鼠标进一步优化(历史,已恢复联调)

  • 用户要求制定计划并执行;随后明确运维正在修复GPU Code43。Windows多次被外部qmshutdown/qmstart, 本轮已停止Windows配置/串流测试,不能与运维并发改VM;没有发出VM/宿主/显卡重启指令。
  • 新增0003-vdi-input-priority.patch:帧前连续输入最多32条/2ms,保留焦点/窗口/退出等边界; VDI_INPUT_PRIORITY=1才启用;VDI_INPUT_TIMING=1才记录SDL派发年龄及主线程render调用统计。 已在盒子编译,普通/ASAN测试通过。实际EGL使用独立PacerRender线程,主线程render样本0,未证明新调度收益。
  • 默认客户端已恢复本轮前哈希35de7b1a4ade583823b23b5f2e012307f6d0a3848c8eb97bd6d4de9660afa00f; 候选另存moonlight.input-priority-20261103,哈希ef0707ed2053f15ad6f62a33a79ac360237b27f307777c79b379b105fabfe3a2。 正常wrapper未改用候选,新调度未默认启用;没有添加本地/透明光标。
  • VDD30Hz已查明,临时2K60应用/读回成功;但旧WinForms基准源本身约32FPS,2K30/60初测不能证明性能提升。 本地基准脚本已修正定时器量化,待运维结束再部署;VDD模式未持久化,原登录2K30脚本没改。
  • 新增set-vdi-display-mode.ps1、run-mouse-display-probe.py、bench-mouse-stream.sh和移动注入工具。 现场测试串流已清理;Windows基准窗口随关机退出,VDIInputLatencyBench登记无自动触发器, 运维结束后先用run-input-latency-bench.py stop清理,再Query VDD/必要时Restore,再做新版源配对测试。
  • 独立光标完成源码核实与交接设计,尚未实现;Sunshine全局toggle不足以可靠回退,需要双方协议/帧边界交接。 计划/实际结果见docs/mouse-optimization-plan-20261103.md、docs/mouse-optimization-execution-20261103.md; 后续设计见docs/independent-cursor-design-20261103.md。不能宣传本轮达到2K60或鼠标到屏幕1ms。

2026-11-03 显示器关开修复(优先于下文旧状态)

  • 关屏再开后画面变矮:盒子回退1920x1440@75(4:3),Moonlight 16:9视频上下黑边; MATE monitors.xml仍存旧4:3布局,原启动脚本只设置一次2K。
  • 已部署vdi-display-guard用户服务(active/enabled)和幂等启动恢复,保留297MHz定制2K时序; 2秒检查、异常稳定2秒后恢复;断开不强设、失败退避、命令超时、单实例锁,正常不反复切换。 修正当前GWR/0x2708显示器旧保存布局。仅部署tools/deploy_display_guard.sh,不重启串流。
  • 9个场景测试通过,CTest 3/3;两次主动回退均约14秒恢复,Moonlight PID66385和boot ID不变。 用户真实关屏再开确认自动全屏;10:03:19断开、10:03:31正确2K模式,10:04现场2560x1440。
  • 备份~/vdi-terminal/backups/display-guard-20261103-095920/;详情/回退见 docs/display-resume-fix-20261103.md。此修复仅限当前Xorg单HDMI 2K POC,未做隔夜老化。

2026-11-03 鼠标/点击跳转优化(优先于下文旧状态)

  • Moonlight私有客户端新增两个补丁:鼠标合并不跨点击/键盘/窗口边界,绝对鼠标按钮封住前一位置批次; 低延迟非pacing队列可丢弃等待帧保留最新帧,wrapper默认VDI_LATEST_FRAME=1。保持单白色Windows光标。
  • 现场32次交替点击:旧客户端30/32正确(第1、13错位),补丁32/32正确;native输入测试1000轮和ASAN通过。 配对串流补丁队列2.14ms/呈现6.12ms,原3.39ms/6.84ms;帧率约28.4/28.1,受网络/软件编码波动,不能称零延迟。
  • Windows保留DragFullWindows=1、MouseTrails=0;已在test交互会话将MinAnimate从1改0、菜单400改100ms,读回通过, 原值备份在test的LocalAppData/VDI;临时执行/测试任务已清理。
  • 用户确认蓝框在盒子登录/选择页:QFrame:hover错误匹配QLabel。移除蓝色悬停框和登录焦点蓝框,限定卡片对象样式, 局部编译CTest3/3,部署新版kiosk;悬停截图亮蓝像素8302→0。UI/wrapper备份input-rendering-20261103-114542。 详情见docs/input-rendering-optimization-20261103.md和terminal/moonlight/README.md。

2026-11-02 最新实测(优先于下文旧状态)

  • 2026-11-02晚:已在用户目录完成MPP+FFmpeg-Rockchip+Moonlight6.2.0私有构建, 实际2K串流选中h264_rkmpp/drm_prime与EGL/GLES呈现,非仅FFmpeg样本测试。 2K20 smooth会话平均呈现18.97FPS、解码10.53ms、呈现2.54ms;2K30 low-latency 呈现23.46FPS、解码9.11ms、队列2.39ms、呈现5.41ms。服务端仍Code43/libx264。 2K30 smooth队列31.95ms,VSync开/帧步调关也有28.93ms,故该盒子选低延迟档。 原始日志和限制见 docs/rendering-execution-20261102.md。 通过 ~/.config/vdi-terminal/render.conf 显式选择私有wrapper+hardware,系统客户端不覆盖; Windows桌面票据改30FPS,原20FPS文件备份为desktops.before-rkmpp-20261102.json。 构建脚本 tools/build-rkmpp-client.sh 修Qt5 optional、EGL探测缓存与旧对象不重编; kiosk就绪判断兼容RKMPP独立测试解码器日志,CTest 2/2通过。 鼠标MouseTrails=0、DragFullWindows=1;现场仍有VDIApplyTransparentCursor刷新参数任务, 先前“任务已删除”的记录不准确,本轮未改变光标配置;截图单白光标正常。 不能把23FPS、硬解接通解释为GPU已恢复、2K60或端到端零延迟。
  • 已部署真实2K:盒子HDMI 2560x1440约60Hz、Windows VDD 2560x1440@30、Moonlight 2560x1440@20/30Mbps。
  • RK3528旧PHY拒绝EDID的241.70MHz,实测用297MHz固定时钟和扩展消隐成功: 297.00 2560 2608 2640 2720 1440 1443 1448 1820 +HSync -VSync;盒子重启已验证,link Good。
  • Windows VDD版本11.30.4.434,生效XML在 C:\VirtualDisplayDriver\vdd_settings.xml。 登录任务VDISet2KDisplay动态定位Virtual Display Driver(不能写死DISPLAY编号),脚本在 C:\ProgramData\VDI\set-2k-display.ps1,仓库副本 tools/set-2k-display.ps1;VM重启后执行成功。
  • 鼠标保留白色Windows远程光标,已删除本地黑色光标自动开启和透明光标任务;GLES2、关闭MATE合成器保留。
  • GPU并非稳定完成:运维曾打通582.78/NVENC,连续动画可发送59FPS;但本次VM重启后Code43复发, nvidia-smi失败、Sunshine当前实际为libx264软件编码。客户机重启设备/隔离VDD/VM停启均无效; 无效VDIRecoverNvidia任务已删除。未改宿主VFIO模块、未重启宿主。ROM为gtx965m-pci.rom。
  • NVENC正常时2K20实测19.67FPS、网络丢帧0%、抖动丢帧0.94%;这些数据不能作为当前软编性能保证。
  • 详细最新状态见 docs/moonlight-kiosk-20261028.md 的“当前现场(2026-11-02 15:45)”。

当前状态

  • 项目目录:D:\DAIMA\vdi-cloud
  • 终端盒子:RK3528 PRO DDR4,Armbian Ubuntu Noble,aarch64,IP 192.168.1.188
  • 当前图形:LightDM + Xorg;正式文档要求 Weston + Wayland + Qt,当前只是 POC
  • Proxmox:9.2.2 节点 starhe。VM 100 win10-test 192.168.1.70(Sunshine/Moonlight 云桌面); VM 101 kylin-test 192.168.1.71(test1)、VM 102 ubuntu-test 192.168.1.72(test2), 密码均 yx66668888,SSH 可登、图形会话在跑,尚未装 Sunshine,暂不能串流
  • kiosk-shell(Qt/C++):开机直进桌面列表(2026-10-30 起,设备 SN 即用户自动登录, 登录页代码保留待平台正式认证接入)→ 选择桌面 → Moonlight 会话;RDP 代码已于 2026-10-29 全部删除(git 历史可查),Moonlight 是唯一会话通道,无 freerdp 构建依赖
  • 新增退出三层与会话过场层:Ctrl+Alt+Shift+Q 退串流回列表;列表页"退出登录"; 登录页无退出按钮(退出终端只在管理菜单);点连接有全屏过场层,首帧后淡出。 详见 docs/moonlight-kiosk-20261028.md 2026-10-29 下午节
  • 代码位置:terminal/kiosk-shell
  • 远程安装路径:~/vdi-terminal/bin/(kiosk-shell、vdi-kiosk-monitor、vdi-moonlight)

GPU 直通进行中(2026-10-30 下午,见 moonlight-kiosk 文档当日追加节)

  • 宿主侧已就绪:nouveau 已黑名单、GPU 在 vfio-pci、IOMMU 组 2(root port+GPU)
  • 关键坑:vfio 清零 Subsystem ID(必须 x-pci-sub-vendor-id/device-id 注入 1558:6557); 移动卡 vBIOS 需 sysfs 抽取(/usr/share/kvm/gtx965m.rom);NVIDIA 安装器在 SYSTEM 会话 挂起(用 7zr 解包 + pnputil);582.78 绑定后 D3D 全灭已换 566.36(D3D 待验证)
  • 当前 VM 100 未挂 GPU:另一并行会话在改配置(hv_vendor_id 方案),本会话已停手避撞, 两个会话不要同时改 VM 100 配置!
  • Sunshine 配对 2026.914 改为"Web UI 批准式":moonlight pair --pin NNNN + GET /api/csrf-token + POST /api/pin {pairing_id,pin};Web 凭据由环境管理员保管; 删 sunshine_state.json = 全部失配;盒子 Moonlight 配置目录缓存旧 uniqueid 会卡死配对

必须遵守

  • 所有实现严格参考用户提供的两个正式 Word 和会议纪要;文档未确定的技术只能标记待调研,不得擅自定版。
  • 终端先做,后接自研管理平台 API;终端不直接调用 Proxmox API。
  • 正式状态机:BOOT -> CONFIG -> CONNECTING -> SESSION -> RECONNECT -> ERROR
  • 正式 Kiosk 选型:Weston + Wayland + Qt;会话通道统一 Moonlight(RDP 已删,勿在代码里复活协议分支)。
  • /cert:ignore、空密码仅限局域网 POC。
  • 项目经理新增待调研:RDP 是否适合 GPU/CAD/3D;研究 Moonlight/Sunshine,但不要在调研前删除 RDP、确定 Moonlight 参数或定版双协议。

已知关键结论

  • WiFi:约 -47 dBm,协商约 200 Mbps,零丢包/重传;卷帘问题不能简单归因于 WiFi。
  • HDMI 当前原生:1920x1440@75Hz(10-23 记录);2026-10-28 实测盒子系统已是 1920x1080@60Hz, 与 Sunshine 侧虚拟显示器一致,串流 1:1 无缩放。以现场 xrandr 为准。
  • /dev/mpp_service、/dev/rga 存在,但 mppvideodec GStreamer 插件未确认;Weston/DRM 零拷贝待验证。
  • FreeRDP 3:gdi_init 必须在 PostConnect;NLA 空密码传 strdup("");BGRX32 需转换为 Qt RGB;/gfx 是能力组合语义。
  • Moonlight/Sunshine(2026-10-28 实测):Windows 防火墙挡 ICMP,ping 不通不代表不通, 可达性判断必须用 TCP 探测;moonlight-qt 的 app id 会随服务端重装失效, 命令行要用应用名 Desktop;RK3528 上 --video-decoder auto 会选到不可用的 h264_v4l2m2m,必须显式 software。
  • 21.6 FPS 上限根因(2026-10-29 修正):不是 x264 编码算力——ultrafast 前后帧率分毫不差, 串流中 VM CPU 仅 0.5%、sunshine 累计 14 秒 CPU/3 分钟会话,鼠标运动也不变; 真正瓶颈在虚拟显示/捕获节奏(MttVDD 呈现 + Desktop Duplication 脏帧 + QEMU 显示栈, VM CPU 型号 QEMU Virtual CPU version 2.5+ 未透传宿主 AVX2)。 根治 = GPU 直通(NVENC + 真实显示栈);备选 = VirtIO-GPU / cpu=host 排除 QEMU 显示栈因素。 客户端解码 10~15 ms、网络丢包 0%、延迟 3 ms,链路健康。

Web 控制台(2026-10-28 方案确认)

  • console/ 是管理员 Web 管理控制台,不是 RK3528 盒子的用户登录页。
  • 正式技术栈:Vue3 + Vite + TypeScript 严格模式 + Element Plus;后端通过 api-gateway,JWT + RBAC。
  • 页面:仪表盘、终端管理、桌面管理、用户与绑定、GPU 池、监控、OTA、审计日志。
  • 角色:超级管理员、运维、只读。
  • 终端产品流程仍应是 kiosk-shell 登录/首配 -> 桌面列表 -> 获取短期连接票据 -> RDP/Moonlight 会话; 当前开机直连 Moonlight 仅是串流技术验证,不是最终产品登录流程。
  • 开发策略:先做功能骨架、Mock API、OpenAPI 契约、RBAC 与 E2E;项目经理 UI 稿到后替换视觉层。
  • 完整方案:docs/web-console-mvp-plan-20261028.md。

尚未完成

  • 服务端 GPU 直通:GPU 为 CLEVO 准系统上的 GM204M/965M(10de:13d9,宿主被 nouveau 占用需解绑); IOMMU 已启用(组 2 = root port 00:01.0 + GPU 01:00.0,整组直通);VM 内需装 R580 legacy 驱动。 操作单与 GPU 看板见 docs/gpu-passthrough-20261030.md,看板 http://192.168.1.51:8090/(systemd 自启)
  • RK3528 VPU 硬解(h264_v4l2m2m 等缺可用设备,需 MPP FFmpeg 补丁或 V4L2 request 驱动)
  • 2K 分辨率链路验证(虚拟显示器 + 盒子显示模式需同步调整)
  • Weston/DRM/mppvideodec
  • 后端 API 注册、配置、MQTT 心跳(Moonlight 路径目前是本地静态配置)
  • 终端音频出音现场确认
  • 协议最终选型定版(RDP / Moonlight / 双协议,需实测数据 + 产品方案共同确认)
  • 监控与运维脚本、OTA、USB 重定向等终端其余能力

先读 PROJECT_CONTEXT.md,再查看 git status,不要丢弃未提交改动。