参考手册
适用对象:实施工程师、开发人员 · 技术参考与速查
这页是什么
这页是技术速查表,不是操作指南。当你需要知道"哪个端口干什么""配置文件在哪""版本变了什么"时,直接来这里查。
端口与数据流
端口清单
| 端口 | 协议 | 方向 | 用途 |
8006 | HTTPS | 管理端 → PVE | PVE Web 管理界面与 API |
8790 | TCP | 终端 → 教师端 | 终端注册、心跳、WebSocket 通信 |
SPICE | TCP | 终端 → PVE VM | 桌面画面传输。集中上课:61200 + 终端编号;自由选课:61000 + VMID |
ff02::1 | UDP 多播 | 教师端 → 局域网 | IPv6 链路本地宣告(每 30 秒) |
核心数据流
1. 终端发现与注册
教师端启动
└─ communication_module 每 30s 向 ff02::1 发空 UDP
终端上电
└─ discover_teacher() 后台线程启动
├─ 读缓存 .terminal_config(如有)
├─ IPv6 多播 ping ff02::1(Win10 不回包,正常)
├─ 查邻居表 ip -6 neigh
├─ TCP 探测教师端 8790 端口
└─ 连接成功 → 发注册请求(含 MAC)
└─ 教师端分配 terminal_id + 计算 IP
└─ 终端写入 .terminal_config(flush+fsync)
└─ 注册完成,进入心跳循环
2. 上课流程
教师端点「开始上课」
└─ 选择模板 VM
└─ 批量链式克隆(PVE API)
└─ 每台 VM 绑定对应终端 MAC
└─ 批量 start VM
└─ 终端收到桌面就绪信号
└─ SPICE 连接 PVE VM
└─ 终端屏幕显示 Windows 启动过程
└─ VM 内 Guest 程序启动
└─ guest-service 向教师端发 Guest 心跳
3. 下课流程
教师端点「结束下课」
└─ 批量 stop VM(PVE API)
└─ 终端 SPICE 断开,屏幕关闭
└─ VM 差异盘回收
└── 课堂环境清除,下节课重新克隆
4. 心跳与状态
终端心跳(终端 → 教师端)
├─ 协议:TCP 8790
├─ 内容:MAC + terminal_id + 终端状态
└─ 超时:教师端 60s 未收到 → 标记离线
Guest 心跳(VM 内部 → 教师端)
├─ 协议:通过 SPICE 通道或独立 TCP
├─ 内容:VM 内部状态
└─ 超时:60s 未收到 → Guest 状态过期
SPICE 连接状态(PVE API)
└─ 教师端轮询 PVE ss 输出判断桌面是否接入
五维度独立原则:终端在线 ≠ VM 运行 ≠ SPICE 接入 ≠ Guest 活跃 ≠ VM 存在。详见 终端详情页。
配置文件位置与字段
终端侧
| 文件 | 位置 | 关键字段 |
.terminal_config |
/home/vdi/.terminal_config |
[system] version、auto_start、config_version、follow_shutdown
[terminal] terminal_id
[teacher_ip] teacher_ip(IPv4)、teacher_ip6(链路本地)
[network] ip、mask、gateway、dns
[pve] pve_ip、pve_user、pve_password、pve_node、vmid_base
[Parameters] 旧版兼容段
[display] resolution
|
| 终端程序目录 |
/home/vdi/ |
terminal_student.py / .elf:主程序
discover_teacher.py:发现模块
terminal_heartbeat.py:心跳模块
terminal_ws_manager.py:WebSocket 管理
terminal_launcher_v1_5_006.py:启动器
|
教师端侧
| 文件 | 位置 | 说明 |
| 教师端源码 |
C:\teacher\ |
Python 源码目录 |
| 教师端产物 |
C:\teacher\dist\ |
打包后的 exe 目录 |
| 系统 DB |
教师端数据目录 |
SQLite,存储终端映射、课堂状态、历史记录 |
PVE 侧
| 文件 | 位置 | 说明 |
| 网络配置 |
/etc/network/interfaces |
vmbr0 网桥配置 |
| VM 配置 |
/etc/pve/qemu-server/<VMID>.conf |
每台 VM 的 CPU/内存/网络/磁盘配置 |
| PVE 鉴权 |
PVE Web 界面 → Datacenter → Users |
教师端填 root 即可,系统自动补全 @pam 后缀 |
教师端 GUI 不能 kill
communication_module.py(后端)可以 kill + spawn 保活。但 teacher_lite(教师端 GUI)不能 kill——它是用户正在查看的桌面窗口,没有自动拉起机制。推送后只做 py_compile,由用户手动重启。
版本历史与变更
终端程序版本
| 版本 | 关键变更 |
| v1.5.043(当前) | Bug-48 SPICE 断开恢复 + Ctrl+Shift+F12 热键、Bug-51 PVE 连接池修复、Bug-47 重连倒计时 |
| v1.5.042 | Bug-25 广播风暴修复(组播门控)、Bug-26 课程刷新改 WS 推送 |
| v1.5.040 | 课程卡片 UI 改造(Smart Carousel + 高清图标)、Bug-14/15/18 图标路径/升级/密码修复 |
| v1.5.039 | 心跳分流五维度独立、IP/MAC/status 分离、场景三 flush+fsync 修复 |
| v1.5.038 | 场景二/场景三流程完善、Guest 三阶段模型确立 |
| v1.5.006 | terminal_launcher 启动器版本(仍在用) |
教师端版本
| 版本 | 关键变更 |
| v1.5.043(当前) | Bug-48 v2 热键恢复(AutoRecoveryStatus/SpiceDisconnected/RejoinRequest)、Bug-51 PVE 连接池 http:// + pool 60 + 断开阈值 3→1、Bug-47 重连补推 class_start |
| v1.5.042 | Bug-25 广播风暴(组播门控 + 冷却 300s + 3次/小时上限)、Bug-26 WS 推送替代轮询、Bug-31 心跳分流(Guest 不覆盖终端状态) |
| v1.5.040 | 自由选课课程卡片、Bug-21 MAC 表联机获取、Bug-22 配置版本同步 |
| d40 后 | 心跳分流改造、五维度状态独立、场景三 renumber_execute 两阶段确认制 |
| v038 | 场景二 confirm_replace 流程 |
关键设计决策记录
| 决策 | 时间 | 原因 |
| SPICE 热键恢复 | Bug-48 (v1.5.043) | Ctrl+Shift+F12 双按钮:重新连接(本地快速重连)/ 重新上课(通知教师端重克隆)。热键走 Openbox XGrabKey WM 级快捷键,全屏桌面挡不住 |
| Guest 三阶段模型 | 2026-06-19 | 60 台 VM 同时启动时,每台用模板机预落的本地 mac_table 自查绑定,不依赖教师端实时下发,避免上课瞬间 60 路请求冲击 |
| 两阶段确认制 | 场景三 PRD | 重新排号分两阶段:终端暂存 intent → 教师端 execute 确认后才执行。取消可丢弃暂存,断电重启自动继续 |
| 五维度状态独立 | Bug-31 | 终端在线 ≠ VM 运行 ≠ SPICE 接入 ≠ Guest 活跃 ≠ VM 存在。每个维度独立数据源、独立过期时间 |
| 广播风暴免疫 | Bug-25 (v1.5.042) | 组播门控:冷启动例外 120s 间隔 + 300s 冷却 + 3次/小时上限。60 台 0 广播风暴 |
| 教师端主导架构 | PRD §4.0 | 克隆 VM、写 MAC、写 SPICE 端口、启动 VM 全部由教师端统一完成,终端只负责连接 |
| 终端 IP 静态分配 | 架构设计 | 非 DHCP,教师端注册时计算 terminal_start_ip + (tid - start_number) |
PVE 官方文档索引
云课堂基于 Proxmox VE 构建。以下 PVE 官方文档在部署和运维中会频繁引用:
引用原则
本文档站引用 PVE 官方文档时只给链接和"什么时候看",不搬运内容。PVE 文档权威性以官方为准。
机器角色速查
| 机器 | 角色 | 说明 |
| 教师机 | 教师端运行 | 普通 Windows 电脑,运行 teacher_lite + communication_module |
| PVE 服务器 | 虚拟化底座 | Proxmox VE,运行所有 VM,提供 SPICE 桌面 |
| 学生终端 | 瘦客户机 | Debian Linux,运行终端 ELF 程序,连接 SPICE 桌面 |
| 模板机 | 母盘制作 | 制作 Windows 模板的参考 VM,含 Guest 程序 |