完整部署手册
这份文档和快速入门的区别
30 分钟快速部署是为了验证系统可用性。这份手册是正式生产环境的完整部署指南,覆盖 60 台规模的所有配置细节。
硬件清单与选型
60 座位机房参考配置
| 设备 | 数量 | 配置要求 | 参考价格 |
|---|---|---|---|
| 服务器 | 1 台 | 16 核+ CPU / 128GB+ 内存 / SSD 或 NVMe 存储 | 约 3-5 万 |
| 千兆交换机 | 1-2 台 | 48 口千兆管理型交换机 | 约 2000 元 |
| 教师电脑 | 1 台 | 普通 Windows 10/11 电脑 | 已有即可 |
| 学生终端(瘦客户机) | 60 台 | 2 核 / 2GB / 8GB / Debian Linux | 约 1000 元/台 |
60 座位总投入参考区间:约 10-12 万元。相比传统 60 台高配 PC 机房(约 30 万),节省 60% 以上。
价格说明
60 座位价格为参考区间,实际按规模、教室数量和现有设备情况报价。价格只公开总价和节省比例,不公开单台终端单价。
服务器选型建议
- CPU:核心数 ≥ 终端数 / 4。60 台终端建议 16 物理核以上(如 AMD Ryzen 9 7950X 16 核 32 线程)
- 内存:每 VM 分配 2GB,60 台需 120GB+ 系统开销,建议 128GB 起
- 存储:SSD 必须。链式克隆(共享底包,只记录差异,60 台同时启动也很快)依赖存储 IOPS,HDD 会导致启动慢。NVMe 最佳,SATA SSD 可用
- 网络:千兆电口,连接 vmbr0 网桥
PVE 安装与配置
安装 Proxmox VE
- 从 清华镜像 下载 PVE ISO
- 制作 U 盘启动盘(Rufus / dd / Ventoy)
- 服务器从 U 盘启动,按向导安装
- 管理网口设置静态 IP(如
192.168.10.251),这是教师端和终端访问 PVE API 的地址 - 安装完成后浏览器访问
https://服务器IP:8006
PVE 安装的详细步骤、磁盘分区、网络配置请参考 PVE 官方文档。
云课堂特有的 PVE 配置
1. 创建网桥 vmbr0
安装 PVE 时默认会创建 vmbr0。确认它的配置:
# /etc/network/interfaces
auto vmbr0
iface vmbr0 inet static
address 192.168.10.251/24
bridge-ports enp1s0
bridge-stp off
bridge-fd 0
2. 配置 SPICE 协议(让远程桌面不卡的关键技术)支持
云课堂使用 SPICE 协议传输桌面。确认 PVE 已安装 SPICE 相关组件(PVE 8.x 默认已集成)。
3. 性能调优(可选)
60 台规模建议根据物理核数调整 pveproxy 和 pvedaemon 的 worker 数量:
# 查看 PVE 源码默认值
grep -r 'max_workers' /usr/share/perl5/PVE/Service/
# 保守调优规则:
# ≤2 核 → 3 workers
# ≤4 核 → 4 workers
# ≤8 核 → 6 workers
# 9+ 核 → 8 workers(16 核服务器推荐值)
# 检测失败 → 回退到 4 workers
不要超过 1.5-2 倍物理核数
Worker 数量过高会引发 CPU 争抢,反而降低性能。当前 16 核服务器推荐值为 8。
网络规划
单机方案(最常见)
所有设备接同一交换机,同一网段。这是 90% 学校的部署方式。
服务器 (192.168.10.251)
|
交换机 (192.168.10.x/24)
|--- 教师电脑 (DHCP 或固定 IP)
|--- 终端 T01 (192.168.10.101,教师端分配)
|--- 终端 T02 (192.168.10.102)
|--- ...
|--- 终端 T60 (192.168.10.160)
IP 分配规则
终端 IP 不是 DHCP,是教师端注册时静态计算下发:
终端 IP = terminal_start_ip + (terminal_id - start_number)
示例:
terminal_start_ip = 192.168.10.101
start_number = 1
T01 → 192.168.10.101 + (1-1) = 192.168.10.101
T02 → 192.168.10.101 + (2-1) = 192.168.10.102
T60 → 192.168.10.101 + (60-1) = 192.168.10.160
注意 IP 段冲突
terminal_start_ip 和 vm_start_ip(VM 内部 IP)是两个不同的段。终端本机 IP 给终端用,VM 内部 IP 仅供 PVE 校验。
IPv6 链路本地通信
教师端和终端之间的发现和心跳走 IPv6 链路本地地址(fe80::),不需要额外配置 IPv6。教师端启动后每 30 秒向 ff02::1 发空 UDP 宣告。
如果终端无法发现教师端,参考 IPv6 discover 故障排查。
多微机室部署要求(重要)
多个机房严禁接入同一二层网络(同一交换机 / 同网段广播域)。终端通过扫描网络来发现教师端,PXE 部署也依赖网段内广播——两个机房混在同二层会发生:
- 终端连错教师端(开机扫到隔壁教师机就锁死,编号被隔壁机房占用)
- PXE 部署串机房:A 机房部署期间,B 机房的裸机/重启机可能被 A 的 PXE 服务器抢答,整盘被误装成 A 机房的镜像
- 广播/唤醒指令串到隔壁机房,教师端互相看到对方的"幽灵终端"
三种合规做法任选其一:
| 方案 | 做法 | 适用 |
|---|---|---|
| 一、分开部署 | 两个机房不在同一时间开启教师端和 PXE 服务器(部署是广播敏感操作,错峰使用) | 无法改网络的存量机房 |
| 二、VLAN 隔离 | 每个机房划分独立 VLAN + 独立网段 | 交换机可控的标案机房(推荐) |
| 三、小路由器隔离 | 每个机房放置一台小路由器接入学校网络,机房内网与学校内网隔离(路由器 WAN 接校内,LAN 为机房自有网段) | 要求与校内网隔离的场景 |
Windows 模板镜像制作
模板是所有学生桌面的基础镜像。模板做好一次,后续克隆都基于它。
制作步骤
- 在 PVE 创建新 VM(编号建议 9000-9999 范围作为模板编号)
- 分配配置:4 核 / 4GB 内存 / 40-60GB 磁盘
- 挂载 Windows ISO + virtio 驱动(让虚拟机跑得更快的专用驱动) ISO
- 开机安装 Windows(推荐 Win10 LTSC 或 Win11 LTSC)
- 安装 virtio 驱动:网卡、磁盘、显卡、气球
- 安装 SPICE Guest Tools(让远程桌面更流畅的辅助程序)
- 配置 USB 重定向支持(spice usbredir)
- 关闭:Windows 自动更新、休眠、屏幕保护、防火墙(测试环境)
- 安装课程软件
- 关机,在 PVE 中转为模板(Convert to Template)
首页不要写 Windows 版本号
对外页面只写"Windows 桌面"。具体版本号在系统组成页或部署文档里写。不同学校可能用 Win7/Win10/Win11。
教师端安装与配置
安装
- 从 下载中心 获取教师端安装包
- 解压到 Windows 电脑任意目录(免安装)
- 主要文件:
communication_module.exe:后端,负责终端注册、心跳、PVE 控制、IPv6 宣告teacher_lite.exe:前端界面,老师日常使用
初始配置
首次打开教师端,在设置中配置以下参数:
| 参数 | 说明 | 示例 |
|---|---|---|
| PVE 服务器 IP | PVE 管理地址 | 192.168.10.251 |
| PVE 用户名 | PVE 管理用户名 | root |
| PVE 密码 | PVE root 密码 | — |
| 模板 VM 编号 | PVE 中的模板 VM ID | 9000 |
| 终端起始 IP | 终端本机 IP 段起始 | 192.168.10.101 |
| VM 起始 IP | VM 内部 IP 段起始 | 192.168.10.201 |
| 终端起始编号 | 编号从几开始 | 1 |
用户名只填 root
不需要手动加 @pam 后缀。系统在下发配置给终端时,会自动检查并补全 @pam 后缀(见 communication_module.py L117-119)。
启动顺序
- 先启动
communication_module.exe(后端) - 等后端日志显示 "listening" 后,再启动
teacher_lite.exe(前端)
终端程序部署
单台终端部署
- 瘦客户机安装 Debian Linux
- 配置网络为 systemd-networkd(不要用 ifupdown)
- 将终端程序文件放到
/home/vdi/:terminal_student.py(主程序)discover_teacher.py(发现模块)terminal_heartbeat.py(心跳模块)terminal_ws_manager.py(WebSocket 管理)terminal_launcher_v1_5_006.py(启动器)
- 配置
terminal_launcher为开机自启 - 接上网线,上电
批量克隆终端
60 台终端不建议逐台装。推荐做法:
- 装好 1 台完整终端(含所有程序和配置)
- 用 Clonezilla 或 dd 做磁盘镜像
- 批量克隆到其他 59 台
- 注意:克隆后的终端必须自己发现教师端注册,不能手动写 terminal_id
克隆后不要手动配 IP 或 terminal_id
终端上电后会自己 discover 教师端、注册、获取编号和 IP。手动写
teacher_ip6、手动 TCP connect、手动改 .terminal_config 都属于违规操作。
Guest 程序部署
Guest 程序运行在 VM 内部(Windows 或 Linux Guest),负责 Guest 级别的初始化、心跳和与教师端的联动。
部署方式
- 直接放入 Windows 模板镜像中,克隆时自动携带
- 包含:
guest-init-cli(初始化工具)和guest-service(常驻服务)
Guest 初始化流程
- VM 从模板克隆并首次启动
guest-init-cli执行:读取 VM 分配的终端编号、配置网络(如有需要)guest-service启动:向教师端发 Guest 心跳(60 秒过期)- 教师端收到 Guest 心跳后,标记此 VM 的 Guest 状态为"活跃"
Guest 心跳 vs 终端心跳
终端心跳在终端本机跑(Debian),告诉教师端"我在线"。Guest 心跳在 VM 内部跑,告诉教师端"VM 里的服务正常"。这是两条独立的链路。
部署完成验证清单
| 检查项 | 预期结果 | ✓ |
|---|---|---|
| PVE 版本 | 8.x 正常运行 | □ |
| vmbr0 网桥 | UP,IP 正确 | □ |
| 模板 VM 9000 | 已转为 Template | □ |
| 教师端后端 | communication_module 日志有 listening + announce | □ |
| 教师端界面 | teacher_lite 显示正常 | □ |
| 终端自动发现 | 60 台全部自动注册,分配编号 | □ |
| 开始上课 | VM 批量克隆启动,终端显示 Windows 桌面 | □ |
| USB 透传 | 终端插 U 盘,VM 内可见 | □ |
| 结束下课 | VM 批量回收,终端回到待机 | □ |
| 自由选课 | 切模板后重新上课,桌面正确切换 | □ |