5. 浴火重生:测试win vm玩都市天际线,天下游戏虚拟机

计划

核心目标:动态调度 OCuLink 4060,搾干游戏性能,完美兼容遗留 XP 资产

【2026-10-08 节奏重排】本计承接计1 移交的 V 段(Win VM 转换 / 点亮 / 验收),并纳入:
  1. 旧 win 镜像以 VM 方式启动(virt-v2v 转换 + 点亮)
  2. 调试外置显卡 4060 直通 VM,玩天际线2
  3. 验证残留的 win 物理分区(s500win,在盘1 盘尾)仍能作为物理系统正常工作

【GPU 动态调度与性能释放 (Win VM)】
  1. 物理连接:OCuLink 4060 冷机接好,严禁通电插拔

  2. 默认态(宿主独占):
     NixOS 启动时 nvidia 驱动接管 4060,780M 负责宿主显示
     4060 算力供 Docker 容器(Ollama 等)调用

  3. Hook 自动化(Libvirt Hook)——含设备存在性检查:
     ▶ Hook 脚本开头先检查 GPU 是否存在:
       if ! lspci -nn | grep -q "10de:2803"; then
           echo "GPU not found, skipping VFIO setup."
           exit 0
       fi

     ▶ 启动 Win VM 时(prepare/begin):
       a. 只暂停真正占用 GPU 的容器(如 Ollama),中间件不动
       b. 确保 4060 未被宿主机桌面占用
       c. 按顺序 rmmod nvidia_drm → nvidia_modeset → nvidia_uvm → nvidia
       d. modprobe vfio-pci
       e. Hugepages 启动时已预留,此处不动态分配
       f. 启动 VM,直连扩展坞显示器

     ▶ 关闭 Win VM 时(release/end):
       a. 解绑 vfio-pci
       b. 按顺序 modprobe nvidia_drm → nvidia_modeset → nvidia_uvm → nvidia
       c. 恢复被暂停的 Docker 容器
       d. Hugepages 保留给下次使用,不释放

  4. CPU 软亲和(不硬绑):
     Win VM 优先使用 4-14 号逻辑核
     宿主机 + Linux VM 使用 0-3 号核
     保留弹性,不硬性隔离

【无 4060 场景兼容】
  5. 内核参数 vfio-pci.ids=10de:2803 无害,设备缺失时静默忽略
  6. Hook 脚本通过 lspci 检测,设备不存在时跳过所有 GPU 切换
  7. 备用方案:为 Win VM 创建无 GPU 直通的配置(WinVM-NO-GPU.xml)
     4060 不在时,用此配置启动,VM 仍可办公网银,只是无游戏加速
  8. 双卡同时在宿主机时,选择输出不同线路的切换(双卡显示管理混乱,需进一步测试)

【VMware XP 虚拟机迁移重构】
  9. 格式转换:qemu-img convert -p -f vmdk -O qcow2 xp_legacy.vmdk xp_legacy.qcow2
 10. 防蓝屏创建:磁盘总线先用 IDE,网卡先用 e1000
 11. 驱动注入:挂载 virtio-win.iso,安装 qxldod/w7/x86 显卡驱动与 VirtIO 网卡驱动
 12. 终态切换:驱动就绪后切回 VirtIO
     若分辨率异常,退回 vga 或 cirrus 视频模型

【潜在问题与解决】
  蓝屏或无法启动     → 磁盘总线改回 IDE
  显示分辨率异常     → 视频模型从 qxl 换成 vga 或 cirrus
  鼠标错位           → 调整 virt-manager 的“缩放显示”或“鼠标集成”
  画面发黄           → 游戏中按 Tab → GameRendering → Custom passes → 取消 Tunnel Pass
  GPU 切换失败       → 检查显示管理器是否占用 DRM 节点
  无 4060 时 VM 启动失败 → 预期行为,改用无 GPU 直通的备用配置

执行清单

增加偷天换日挪过来的虚拟化支持

    • 动作:configuration.nix 里开启 libvirtd、virtiofsd、信任 virbr0;另外必须打开 OVMF(UEFI 虚拟机需要,对应 C3)
    • 复核:nixos-rebuild 成功;virsh net-list 里 default 为 active 且 autostart
    • 说明:本项必须在克隆入盘1 之前完成(克隆在计3),克隆过去的系统才能开箱具备运行 VM 的环境
    • 动作:environment.systemPackages 里加入 pkgs.virt-v2v 与 pkgs.virtio-win(virtio-win 提供注入用的驱动)
    • 复核:virt-v2v --version 有输出;pkgs.virtio-win 路径存在且里面有 virtio-win.iso 或 guest-tools
    • 动作:virsh net-start default 与 virsh net-autostart default
    • 复核:virsh net-list 里 default 为 active 且 autostart

V 段由计1 移交而来(原属「1. 偷天换日」的转换、点亮与验收),2026-10-08 迁入本计。前置:计2 已完成(盘1 分区)、计3 已完成(主机就绪)。

    • 动作:virt-v2v -i disk /path/to/WinVM.vhdx -o libvirt -of raw -os vms(一条命令完成转格式、注入 VirtIO 驱动、生成 libvirt 域定义;ext4 定案后“避免 COW 叠 COW”这个选 raw 的理由不再适用,格式选择另定)。待上机核:-o libvirt 是否接受 -of raw
    • 退路(若 -o libvirt 不接受 -of raw):改 -o local -of raw -os /s500data/vms 生成磁盘,再用 virsh define 注册域;再退一步是接受 qcow2
    • 复核:virt-v2v 退出无 error;virsh list --all 出现新域;池目录里出现转换后的磁盘文件
    • 注意:源是 UEFI + GPT,若该步报固件相关错误,先看 V2 要改的域 XML,不要回头重做镜像
    • 动作:virsh edit <域名>,在 os 段设 firmware 为 efi
    • 复核:域 XML 中 os firmware = efi
    • 理由:源是 UEFI 引导,转换默认输出可能不带 UEFI 固件设置,这一步不能省(对应 C3)
    • 动作:virsh start <域名>,用 virt-viewer 或 virsh console 观察开机
    • 复核:正常进入系统、不出现 0x7B;设备管理器里磁盘与网卡显示为 Red Hat VirtIO,无黄色感叹号
    • 动作:① 宿主:mount -t ntfs3 -o loop,ro /s500data/DCIMData/1爱好/旧中国老照片/photo-archive.img /mnt/photo,用图片浏览器浏览;② 第二处(经 virtiofs 映射进 VM 后):sudo mount -o loop,ro <VM 内路径>/photo-archive.img /mnt/photo 并浏览;③ Win VM:该目录共享进 VM 后,对 photo-archive.vhdx 用原生「附加 VHD」只读挂载,出现盘符即浏览
    • 理由:定案是双形态各自一等公民,三条路径都要成立——宿主走 raw(内建 loop),Win VM 走 VHDX(原生附加)。这就是「不折中」的验收口径
    • 复核:三处打开同一张 1800 年代照片,修改日期一致且不是 1970(Win 侧本来就是 1840 原生支持);Win 侧无需任何第三方工具即识别为 NTFS 卷
    • 注意:loop 挂载失败说明该目录的共享协议不是 virtiofs(9p 不支持 mmap,loop 必失败)——换共享协议,不是换方案;Win VM 侧若从共享路径附加 VHDX 被拒,改由宿主把该 VHDX 作为只读虚拟磁盘加进域定义(同样原生、零工具);全程只读(宿主 -o ro、域定义加 <readonly/>、Windows 勾 Read-only),两边同时可写挂同一份即双写损坏
    • 动作:Win VM 适配完成后按三种形态各跑鲁大师——(a) 虚拟显示(QXL / VirtIO-GPU,软件渲染)(b) 虚拟化的 780M (c) 4060 直通;与 P7 的两组裸机基线逐项并列成表
    • 理由:这是「损耗」唯一的量化口径——宿主调度显示、把整卡交给 Win,是这套架构的核心取舍,必须用同一工具量出来
    • 复核:三组结果与两组裸机基线并表;直通成功性另记三项——virsh dumpxml 里出现 hostdev、VM 设备管理器识别出正确型号、宿主侧 lspci -nnk 显示该卡已由 vfio-pci 接管
    • 注意:4060 走 eGPU 且掉链未结案,直通结果只作实验记录不作结论;直通前确认 IOMMU 分组干净(单卡独组),单卡直通会让宿主失去该卡输出,本机双 GPU 才可这样分
    • 结果(2026-10-18 完成):(a) 虚拟显示(QXL)四组——max2 678,989 / virtual 684,989 / max2half 641,625 / perf 836,546;(b) 虚拟化的 780M 判定不成立(核显无 vGPU 切分,只能整卡直通或放弃);(c) 4060 直通两组——模拟 NVMe 版 1,195,676(物理 70.0%)、virtio-blk 版 1,399,225(物理 81.9%,显卡 335,088 = 85.9%、处理器 718,298 = 87.0%、内存 97.3%、磁盘 157,228 = 52.9%)。直通三项证据齐:dumpxml 2 个 hostdev、客机设备管理器认到 NVIDIA GeForce RTX 4060 (8 GB)、宿主侧 01:00.0 / 01:00.1 均由 vfio-pci 接管。物理基线只拿到 1 组(2024-04-12,1,707,604),第二组仍缺。
    • 动作:按计划块第 3 条的 Libvirt Hook 流程启停 Win VM,实际进游戏跑一段
    • 复核:游戏中帧率可用、无花屏掉帧;关闭 VM 后 4060 回到宿主(nvidia-smi 可见)且被暂停的容器已恢复
    • 注意:Hook 里的设备存在性检查必不可少——4060 缺失时脚本要静默跳过,否则连 VM 都启不来
    • 结果(2026-10-18 完成):天际线2 实际进游戏,用户验收「游戏正常、挺流畅」;旁路采样 279 个样本(每 10 秒一次宿主侧 PCIe 链路),其中 203 次 16.0 GT/s ×4(Gen4)、69 次 2.5 GT/s(空闲省电降速)、7 次 5.0 GT/s(升速中间态)⇒ eGPU 带宽在负载下正常,显卡分不是被带宽压制。口径修正:本机不走 Libvirt Hook,「关闭 VM 后 4060 自动回宿主」不成立——关 VM 后卡仍绑在 vfio-pci,回宿主需 sudo gpu host 0 + 重启;容器(clash/mariadb 等)本就没用 GPU,Hook 那步本来也是空操作。
    • 动作:从固件菜单进旧 Win 物理系统(盘1 盘尾的 BWINEFI + s500win),实际使用一段时间
    • 复核:引导正常(计3 已验)、系统功能正常、盘符与激活状态正常;不因搬到盘尾而出现异常
    • 说明:与计3 M7 的区别 —— M7 只验「能引导进入」,本项验「搬移后仍可当日常系统用」

本计完成(2026-10-18):N3 / N4 / N6 / V1–V7 全部勾选。性能数据、两轮调优归因、踩坑清单与「不再做宿主侵入式优化」的裁定,见服务笔记「服务:kvm性能优化玩都市天际线2」(noteId wK8ClezMHQJh);原始截图与并表在 /s500data/kvm/win10-old/performance/20261017鲁大师测试/。