Vlab
远程教学云桌面

iBug @ USTC

2023 年 8 月 19 日
南京大学

目录

  1. 背景
  2. 第一代 Vlab
  3. 第二代 Vlab
  4. 技术分享
  5. 共享灵车
  6. 成果

背景

计算机实验的环境配置问题:

  • 学校机房开放时间有限,利用率低
  • 部分实验软件体积大、对配置要求高(如 Vivado)
  • 学生使用的系统环境不同,导致安装与使用时出现奇怪的问题
  • 部分实验环境安装时容易损坏(如双系统安装)

思考

能不能通过提供预先配置好实验环境的虚拟机来解决这个问题呢?

  • Linux 虚拟机还是 Windows 虚拟机?
  • 实验软件怎么配?
  • 给学生分配多少系统资源?主机需要多少硬件配置?
  • 单位支持:计算机实验教学中心

第一代 Vlab

  • 2019 年暑假搭建完成
    秋季学期小范围运营
  • 接入校园网,提供 VNC 连接
  • 打包虚拟机镜像预装 Vivado 方便实验

平台特点

  • 单台 E5 2630 v4 (2S),64 128 GB 内存,一些固态和机械
  • Ubuntu 18.04 + 3.10.0-957.el7🤔 + LXD snap
  • lxdbr0 ↔ USTCnet

  • 校园网接入:可以使用网络通选择出口或从校外连接
    • 也可以挂 Minecraft 服务器、Terraria 服务器、……
  • 虚拟机镜像:(Ubuntu 1 GB) + Xfce4 (2 GB) + Vivado (18 GB)
    • 好在单机有 ZFS 可以用
  • 用 Django 糊了个面板(@taoky),使用统一身份认证登录

总结经验

  • 一台母鸡超卖也卖不动多少啊
  • 避免将用户虚拟机直接连接在校园网上
    • 这样既不方便使用,也不安全
    • 机房 IP 早晚会不够用的(3× /24)
    • 开个 NAT
  • 提供桌面和命令行的统一登录接口,方便用户连接使用
  • 配备更多实验软件
  • 完善用户文档

第二代 Vlab

  • 2020 年寒假基本配置完成
    春季学期投入使用
  • 改进了第一代 Vlab 的许多不足点

基础设施

  • 采购:HPE MSA 1050,Gen10 节点 ×8, 251 交换机
  • Ubuntu ❌ Proxmox VE ✔
  • iSCSI 存储共享:LVM(no thin provisioning)
  • 网络:VXLAN、NAT 网关
  • 小修小补的 Django 面板
  • 超卖能力++++

年轻人的第一次卵路由实践

  • 基础功能:为虚拟机提供 NAT 上网
  • 基本操作:Debian LXC + 手搓 iproute2 + iptables(其实也没那么复杂)
  • DNS + 监控:AdGuard Home
  • 流量记录:-m conntrack --ctstate NEW -j NFLOG
    • 没有磁带,不宜全量镜像

稳定可靠的 LXC 镜像构建技术

  • Docker 提供 build environment,PVE 提供 base image
  • 基于 shell 脚本和 GitHub Actions 的自动化流程
    • add_file, add_package, run 等“指令”
    • 就差发明一个 Lxcfile DSL 了
  • Repository: USTC-vlab/labstrap

登录方式

不开放端口,各种协议都需要转发

VNC, SSH, and what?

SSH 统一登录

  • SSH 没有 Host header 怎么办:来点 PubkeyAuthentication
  • ssh -i vm-114514.pem [email protected]
  • 鉴权:就像 GitHub / GitLab 一样直接按公钥区分用户(VM)
    • Django 提供一个 pubkey → VM IP address 的接口
  • 后端:golang.org/x/crypto/ssh

SSH 统一登录

  • 恢复模式(LXC):ssh recovery@vlab.ustc.edu.cn
    • 后台转接到 pct enter <vmid>
  • 控制台模式(LXC):ssh console@vlab.ustc.edu.cn
    • 后台转接到 pct console <vmid>
  • 控制台模式(KVM):ssh serial@vlab.ustc.edu.cn
    • 后台转接到 qm serial <vmid>

VNC 统一登录

  • 请出神仙: pdlan
    • 逆向了 RealVNC,写了 10,000 行 C艹,到处 co_await,……
    • 顺带还实现了 TLS 加密
    • 顺带还实现了……
    • 外加一个 unix-domain socket 发送管理指令
  • 一起来大受震撼吧
  • 使用 VNC 软件连接:
    • 服务器:vlab.ustc.edu.cn(标准端口 5900/tcp)
    • 用户名:PB17000001:114514(用户名 + VM ID,如果用户有多个 VM 的话)

VNC 统一登录

  • 开源贡献:

RDP 统一登录

  • 咕咕咕了,Windows VM 支持还没搞定
  • RDP 一大坨非常起夜级的协议,不是很想逆向
  • 计划规格:loadbalanceinfo

浏览器登录

  • VNC:魔改版 noVNC
    • 没错,vncmux 顺带还实现了 WebSocket
  • SSH:Go → WASM
  • RDP:从入门到放弃

灵车时间

磁盘容量

  • 一个虚拟机镜像就已经 21 GB 了
  • +MATLAB, +Mathematica, +node_modules
  • 我们的存储阵列里就有 114514 份 Vivado

Bind mount!

  • local-lvm 开个新卷给 /opt/vlab
  • mp0: /opt/vlab,mp=/opt/vlab,ro=1
  • 易于维护:Rsync cron job

No... VNC?

Everything breaks if pushed too hard...

VG test 1723 metadata on /dev/sdc1 (521759 bytes) exceeds maximum metadata size (521472 bytes)
Failed to write VG test.

ibug.io/p/52

IOWait(%wa)午夜准时爆炸

替用户停掉了 man-db.timerapt-daily-upgrade.timer
logrotate.timer 补上了 RandomizedDelaySec=3h

其他灵异事件

  • 一运行备份,网卡就掉了 😦
    解决方法:两边开启 jumbo frame,MTU 拉到 9000 字节
  • 存储服务器的密码掉了
  • PVE HA 过于热情(+nofailback
  • Vivado 又双叒叕炸了
    1. LD_PRELOAD += libudev.so.1
    2. LD_PRELOAD += libdbus-glib-1.so.2

成果

学习资料

谢谢!

本页面的链接: ibug.io/p/59