PVE 安装 Windows 11 + Intel SR-IOV 显卡直通 —— 实战总结
本文基于一次完整的实操记录整理,涵盖从 Windows 镜像选择、PVE 虚拟机创建、系统安装,到 Intel iGPU SR-IOV 显卡直通配置,以及宿主机稳定性排查的全过程。记录了踩过的坑和解决方案,供后续参考。
目录
- Windows 镜像选择
- PVE 环境准备
- 创建 Windows 11 虚拟机
- 安装 Windows 11
- 系统初始化配置
- Intel SR-IOV 显卡直通
- 宿主机稳定性问题排查
- 多 VF 并发崩溃问题
- 经验总结与建议
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 驱动
安装到”选择安装位置”时,磁盘列表为空是正常的,需要手动加载驱动:
- 点击 Load driver / 加载驱动程序
- Browse → 选择 virtio-win 光驱
- 路径:
vioscsi→w11→amd64→ OK - 选择 Red Hat VirtIO SCSI controller → Next
- 看到硬盘出现后,顺便加载网卡和 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:启用 IOMMUi915.enable_guc=3:启用 GUC + HuCi915.max_vfs=7:创建 7 个 VFmodule_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
根因分析
- NVMe 固件兼容性问题:
nvme nvme0: missing or invalid SUBNQN field— 固件不规范nvme nvme0: using unchecked data buffer— 内核被迫用不安全 DMA 模式
- Samsung 980 历史过热:
Thermal T2 Trans Count: 4008(历史数据,当前温度正常) - 内核版本与 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
后续可以尝试的方向
- 更新妖板 BIOS:厂商可能发布过修复 SR-IOV 兼容性的更新
- 换标准主板:小主机平台(N100/8505 等)对 SR-IOV 兼容性更好
- 等待 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或更高编号的 VFx-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