PVE 安装 Windows 11 + Intel SR-IOV 显卡直通 —— 实战总结

本文基于一次完整的实操记录整理,涵盖从 Windows 镜像选择、PVE 虚拟机创建、系统安装,到 Intel iGPU SR-IOV 显卡直通配置,以及宿主机稳定性排查的全过程。记录了踩过的坑和解决方案,供后续参考。


目录

  1. Windows 镜像选择
  2. PVE 环境准备
  3. 创建 Windows 11 虚拟机
  4. 安装 Windows 11
  5. 系统初始化配置
  6. Intel SR-IOV 显卡直通
  7. 宿主机稳定性问题排查
  8. 多 VF 并发崩溃问题
  9. 经验总结与建议

1. Windows 镜像选择

镜像方案对比

方案 体积 兼容性 更新支持 适合场景
Win11 原版 ~6 GB ✅ 最好 ✅ 完整 完整功能
LTSC 2024 IoT ~5 GB ✅ 好 ✅ 到 2034 长期稳定
Tiny11 标准版 ~5.5 GB ✅ 好 ✅ 保留 推荐:轻量日用
Tiny11 Core ~3 GB ⚠️ 较差 ❌ 无 极限省资源
X-Lite 系列 ~2-4 GB ⚠️ 看版本 ⚠️ 看作者 不推荐生产

推荐方案:Tiny11 标准版

  • 保留 Windows Update、Defender、msiserver(.msi 能正常安装)
  • 砍掉 Edge、Cortana、OneDrive、Teams 等膨胀组件
  • 跳过 TPM/Secure Boot 检查内置
  • 默认保留”我没有 internet”按钮,绕过微软账号登录

可信下载来源

https://archive.org/details/tiny11_25H2
  • 文件名:tiny11_25H2_Nov25.iso(包含 2025 年 11 月安全更新)
  • 大小约 5.3 GB,区分 x64 / ARM,PVE 用 x64
  • 下载后务必核对 SHA256(archive.org 页面有公布)

不推荐的镜像

  • X-Lite 26H1:版本号不是微软官方正式版,基于 Insider build
  • Tiny11 Core:砍掉 Update/Defender/WinSxS,.msi 装不上,语言包装不了
  • pixeldrain / 网盘随机来源:无法验证,风险高

2. PVE 环境准备

上传 ISO 到 PVE

# 从 Mac 上传 Windows ISO
scp /Users/VanJay/Downloads/tiny11_25H2_Nov25.iso \
  root@192.168.18.18:/var/lib/vz/template/iso/tiny11_25H2_Nov25.iso

# 下载 VirtIO 驱动(在 PVE 上执行)
cd /var/lib/vz/template/iso/
wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso

# 验证文件
ls -lh /var/lib/vz/template/iso/

查看 PVE 资源

pvesm status          # 查看存储
ip link show | grep vmbr  # 查看网桥
qm list               # 查看已有 VM

3. 创建 Windows 11 虚拟机

创建命令(推荐配置)

qm create 101 \
  --name Win11-tiny \
  --ostype win11 \
  --machine q35 \
  --bios ovmf \
  --efidisk0 local-lvm:1,efitype=4m,pre-enrolled-keys=1 \
  --tpmstate0 local-lvm:1,version=v2.0 \
  --cpu host,hidden=1,flags=+pcid \
  --cores 4 \
  --sockets 1 \
  --memory 8192 \
  --balloon 0 \
  --net0 virtio,bridge=vmbr0,firewall=1 \
  --scsihw virtio-scsi-single \
  --scsi0 local-lvm:100,discard=on,iothread=1,ssd=1,cache=none \
  --ide0 local:iso/virtio-win.iso,media=cdrom \
  --ide2 local:iso/tiny11_25H2_Nov25.iso,media=cdrom \
  --boot order='ide2;scsi0;ide0' \
  --agent enabled=1 \
  --vga std \
  --tablet 1

关键参数说明

参数 说明
--machine q35 Win11 必须用 q35
--bios ovmf Win11 必须用 UEFI
--tpmstate0 Win11 需要 TPM 2.0
--cpu host,hidden=1 hidden=1 隐藏虚拟化特征,避免驱动拒绝加载
--balloon 0 GPU 直通时必须关闭内存气球
--vga std 安装阶段先用模拟显卡,装好后再切直通
discard=on,ssd=1 SSD 必开,自动 TRIM

磁盘扩容

# 关机后扩容(只能增大,不能缩小)
qm shutdown 101
qm resize 101 scsi0 100G

# Windows 内扩展分区(PowerShell)
$max = (Get-PartitionSupportedSize -DriveLetter C).SizeMax
Resize-Partition -DriveLetter C -Size $max

删除重建

qm stop 101
qm destroy 101 --purge --destroy-unreferenced-disks 1

4. 安装 Windows 11

浏览器进入 noVNC 控制台

https://192.168.18.18:8006

关键步骤:加载 VirtIO SCSI 驱动

安装到”选择安装位置”时,磁盘列表为空是正常的,需要手动加载驱动:

  1. 点击 Load driver / 加载驱动程序
  2. Browse → 选择 virtio-win 光驱
  3. 路径:vioscsiw11amd64 → OK
  4. 选择 Red Hat VirtIO SCSI controller → Next
  5. 看到硬盘出现后,顺便加载网卡和 Balloon 驱动:
    • 网卡:NetKVM\w11\amd64
    • 内存气球:Balloon\w11\amd64

OOBE 阶段(Tiny11)

  • 出现联网界面时,点击 **”I don’t have internet”**(绕过微软账号)
  • 创建本地账号,填写用户名和密码
  • 隐私设置全部选 No/Off

noVNC 粘贴技巧

控制台左侧有一个拉手按钮,展开后有剪贴板图标,粘贴内容到文本框,再在 VM 内 Ctrl+V


5. 系统初始化配置

安装 VirtIO 驱动(进系统后)

virtio-win 光驱 → virtio-win-gt-x64.msi    # 一键装齐所有驱动
virtio-win 光驱 → guest-agent\qemu-ga-x86_64.msi  # QEMU Guest Agent

开启 RDP(PowerShell 管理员)

# 创建用户
net user VanJay 657879 /add
net localgroup Administrators VanJay /add
net localgroup "Remote Desktop Users" VanJay /add

# 开启 RDP
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -Name "fDenyTSConnections" -Value 0
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name "UserAuthentication" -Value 1
Enable-NetFirewallRule -DisplayGroup "Remote Desktop"
Set-Service TermService -StartupType Automatic
Start-Service TermService

安装中文语言包

# 启动 Update 相关服务
Set-Service -Name wuauserv -StartupType Manual; Start-Service wuauserv
Set-Service -Name BITS -StartupType Manual; Start-Service BITS

# 安装中文
Install-Language -Language zh-CN
Set-SystemPreferredUILanguage -Language zh-CN
Set-WinUILanguageOverride -Language zh-CN
Set-WinUserLanguageList -LanguageList zh-CN, en-US -Force
Set-Culture -CultureInfo zh-CN
Set-WinHomeLocation -GeoId 45
Set-WinSystemLocale -SystemLocale zh-CN

# 重启生效
Restart-Computer -Force

Windows 激活(massgrave)

irm https://get.activated.win | iex
# 选 1 (HWID) → 永久激活,绑定硬件指纹

验证:

slmgr /xpr
# 显示 "Windows is permanently activated."

卸载安装光驱

qm set 101 --ide0 none,media=cdrom
qm set 101 --ide2 none,media=cdrom
qm set 101 --boot order='scsi0'

6. Intel SR-IOV 显卡直通

前提条件

  • PVE 宿主机已安装 i915-sriov-dkms
  • BIOS 开启:VT-d、SR-IOV Support、Above 4G Decoding、IOMMU Preboot Behavior
  • GRUB 启动参数包含 intel_iommu=on

验证 SR-IOV 状态

# 查看 VF 是否创建
ls /dev/dri/by-path/
# 期望:看到 pci-0000:00:02.0 到 02.7

# 查看 VF 驱动绑定
lspci -nnk -s 00:02

GRUB 参数(推荐)

# /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on i915.enable_guc=3 i915.max_vfs=7 module_blacklist=xe"
  • intel_iommu=on:启用 IOMMU
  • i915.enable_guc=3:启用 GUC + HuC
  • i915.max_vfs=7:创建 7 个 VF
  • module_blacklist=xe:屏蔽新的 Xe 驱动,用 i915

sysfs.conf 自动创建 VF

# /etc/sysfs.conf
devices/pci0000:00/0000:00:02.0/sriov_numvfs = 7

VM 配置(切换到直通模式)

# 安装完系统、开好 RDP 之后执行
qm shutdown 101
qm set 101 --hostpci0 0000:00:02.3,pcie=1  # 不要用 02.2(被 vgaarb 识别为 VGA)
qm set 101 --vga none
qm start 101

注意vga: none 后 noVNC 控制台黑屏是正常现象,通过 RDP 远程访问。

安装 Intel 显卡驱动(在 VM 内)

https://www.intel.com/content/www/us/en/download/785597/intel-arc-iris-xe-graphics-windows.html

下载 Intel Arc & Iris Xe Graphics Driver,双击安装,重启。

IOMMU 组验证

for dev in 0000:00:02.0 0000:00:02.1 0000:00:02.2 0000:00:02.3; do
    group=$(readlink /sys/bus/pci/devices/$dev/iommu_group | xargs basename)
    echo "$dev: group $group"
done
# 期望:每个 VF 都在独立的 IOMMU group

7. 宿主机稳定性问题排查

问题现象

PVE 宿主机在高 I/O 负载下(特别是 VM 启动/GPU 直通 DMA 操作时)出现 hung_task,SSH 断连,宿主机卡死需要强制重启。

排查过程

# 查看 hung_task
dmesg | grep -iE "nvme|hung_task|i/o error" | tail -30

# 查看 NVMe 健康状态
apt install -y nvme-cli
nvme smart-log /dev/nvme0
nvme smart-log /dev/nvme1

根因分析

  1. NVMe 固件兼容性问题
    • nvme nvme0: missing or invalid SUBNQN field — 固件不规范
    • nvme nvme0: using unchecked data buffer — 内核被迫用不安全 DMA 模式
  2. Samsung 980 历史过热Thermal T2 Trans Count: 4008(历史数据,当前温度正常)
  3. 内核版本与 i915 SR-IOV DKMS 兼容性:7.0.2 内核在某些操作下比 6.17 更容易触发 hung_task

修复措施

# 1. NVMe 调度器改为 none
echo none > /sys/block/nvme0n1/queue/scheduler
echo none > /sys/block/nvme1n1/queue/scheduler

# 永久生效
cat > /etc/udev/rules.d/60-nvme-scheduler.rules << 'EOF'
ACTION=="add|change", KERNEL=="nvme[0-9]n[0-9]", ATTR{queue/scheduler}="none"
EOF

# 2. 禁用 NVMe 省电模式(防止热节流导致 I/O 超时)
# /etc/default/grub 添加:
# nvme_core.default_ps_max_latency_us=0 pcie_aspm=off

# 3. 更新 GRUB
update-grub

8. 多 VF 并发崩溃问题

问题现象

两个 VM 同时直通不同 VF 时,宿主机直接重启(无 kernel panic 日志,属于硬件级崩溃)。

排查过程

VF1 FLR × 3  ← VM 100 (DSM) 启动
VF3 FLR × 1  ← VM 101 (Win11) 启动
→ 宿主机立即重启

尝试过的方向

方案 结果
降低 max_vfs 到 3 ❌ 仍然崩溃
添加 iommu=pt 参数 ❌ 仍然崩溃
去掉 pcie=1 参数 ❌ 仍然崩溃
Block VF(udev rules) ❌ 时机太晚,i915 已初始化 VF
systemd service 绑定 vfio-pci ❌ i915 在 service 前已初始化 VF
切换到 6.17 内核 ❌ i915-sriov-dkms 需要额外编译
参考旧机器配置复刻 ❌ 仍然崩溃

根本原因定位

pci 0000:00:02.x: DMAR: Skip IOMMU disabling for graphics

妖板(非标准主板)BIOS 对 iGPU 的 IOMMU 处理有特殊行为,第二个 VF FLR 触发时产生硬件级异常。旧机器(小主机,标准 AMI BIOS)同款 CPU 可以同时跑 3 个直通 VM,证明是主板 BIOS 兼容性问题,而非 CPU 或软件问题。

最终方案

只给一个 VM 直通 GPU,另一个不直通

# DSM 保留直通
qm config 100  # hostpci0: 0000:00:02.1

# Win11 取消直通,通过 RDP 使用
qm set 101 --delete hostpci0
qm set 101 --vga std

后续可以尝试的方向

  1. 更新妖板 BIOS:厂商可能发布过修复 SR-IOV 兼容性的更新
  2. 换标准主板:小主机平台(N100/8505 等)对 SR-IOV 兼容性更好
  3. 等待 i915-sriov-dkms 更新:后续版本可能改进 VF 初始化时序

9. 经验总结与建议

Windows 镜像

  • 首选 Tiny11 标准版,从 archive.org NTDEV 官方页面下载,不要用随机网盘来源
  • Tiny11 Core 不适合生产,激进精简导致 .msi 安装失败、语言包装不上
  • X-Lite 系列要谨慎,26H1 版本号不是微软官方正式版;来源要从官网 windowsxlite.com 跳转

PVE 虚拟机配置

  • 安装阶段用模拟显卡--vga std),装好系统、开好 RDP 后再切 GPU 直通
  • GPU 直通必须关 balloon--balloon 0),否则内存不固定会出问题
  • cpu: host,hidden=1 比单纯 host 更稳定,避免驱动检测到 hypervisor
  • VirtIO SCSI 驱动是安装时最容易忘的一步,看不到磁盘就是缺这个

SR-IOV 直通

  • 02.2 这个 VF 在 Alder Lake 上被 vgaarb 识别为 VGA controller,会导致 QEMU 初始化卡死,直通时选用 02.3 或更高编号的 VF
  • x-vga=1 不适合 SR-IOV VF,VF 没有独立 VGA BIOS,加了这个参数会卡死
  • 多 VF 并发直通的稳定性强依赖主板 BIOS,标准 AMI BIOS 的小主机兼容性明显优于定制主板

系统稳定性

  • NVMe 省电模式是很多 PVE hung_task 的根本原因,加 nvme_core.default_ps_max_latency_us=0 可显著改善
  • NVMe 调度器设为 none,跳过 Linux 层调度,减少 I/O 延迟
  • Samsung 980(无 DRAM 缓存 HMB 盘)在持续高负载下有过热风险,建议加散热片
  • PWRON After Power Loss 改为 Always On,服务器断电后自动开机

BIOS 必须确认的选项

选项 要求
VT-d Enabled
VT-x / VMX Enabled
SR-IOV Support Enabled
Above 4G Decoding Enabled
IOMMU Preboot Behavior Enable IOMMU during boot
CSM Disabled
Secure Boot Disabled
DVMT Pre-Allocated 64M 或以上
PWRON After Power Loss Always On

附录:常用命令速查

# VM 管理
qm list                          # 列出所有 VM
qm start/stop/shutdown <vmid>    # 启动/停止/关机
qm status <vmid>                 # 查看状态
qm config <vmid>                 # 查看配置
qm set <vmid> --<key> <value>    # 修改配置
qm destroy <vmid> --purge --destroy-unreferenced-disks 1  # 删除 VM
qm resize <vmid> scsi0 100G      # 扩容磁盘
qm guest cmd <vmid> ping         # 测试 qemu-ga

# SR-IOV 相关
ls /dev/dri/by-path/             # 查看 VF 列表
lspci -nnk -s 00:02              # 查看 iGPU 及 VF 驱动
cat /sys/module/i915/parameters/max_vfs  # 查看当前 VF 数量

# 内核管理
proxmox-boot-tool kernel list    # 查看可用内核
proxmox-boot-tool kernel pin <version>  # 固定启动内核
uname -r                         # 查看当前内核版本

# NVMe 状态
nvme list                        # 列出 NVMe 设备
nvme smart-log /dev/nvme0        # 查看健康状态
cat /sys/block/nvme0n1/queue/scheduler  # 查看调度器

# 日志查看
dmesg | grep -iE "hung_task|nvme|i915" | tail -30
journalctl -k -b -1 | tail -50  # 上次启动的内核日志
journalctl -k -b -1 | grep -iE "FLR|panic|BUG" | tail -30