PVE 9.0 全盘映射 Win 系统盘、直通数据盘以及核显虚拟化教程【直通篇】
前言

在《基础篇》中,我们已经讲解了如何安装和优化 PVE 系统。接下来,自然就是创建虚拟机的环节。而在虚拟机的使用中,硬件直通无疑是绕不开的重要主题。
对于 NAS 来说,直通硬盘可以避免数据盘被虚拟化隔离,即便 PVE 或者虚拟机崩溃后,数据也不会丢失;对于影音程序而言,直通核显可以启用硬件转码,大幅提升视频处理性能;对于计算任务,直通独显则可以直接利用显卡算力;对于 OpenWRT 这类路由系统,直通网卡可以显著提升网络传输效率与稳定性。
总的来说,硬件直通就是让虚拟机像物理机一样绕开 PVE 直接使用硬件,既能充分发挥硬件性能也可以保障数据安全。
下面我将用一台 Windows 虚拟机完整的演示一遍两种直通硬盘的方式以及 7 代 Intel 核显的虚拟化。
创建虚拟机
首先创建一台 Windows 虚拟机,操作系统选择 Windows,版本按照实际情况选择

大部分 Windows 系统盘应该都是 UEFI 引导的,因此 “系统” 这里的 BIOS 选择 OVMF (UEFI),如果是 Windows 11 的话还要勾选 “添加 TPM”

由于我们要直通系统盘,所以这里的磁盘直接删除。

来到 “网络” 后,模型选择 RTL8139,虽然是百兆网卡,性能很差,但是兼容性比较好,能连上网再说。

其他没有提到选项全部保持默认就好了,等后面跑通后再来优化。
硬盘直通
硬盘直通主要分为 映射直通 和 控制器直通 两种方式:
映射直通:可以方便地将单块硬盘直通给虚拟机,同时宿主机仍可访问该硬盘。性能略有损耗,适合直通 Windows 系统盘或单块数据盘使用。
控制器直通:将整个硬盘控制器直通给虚拟机,连接在该控制器上的所有硬盘都会被直通,虚拟机可以直接读取硬盘的 SMART 信息。这种方式适合将所有数据盘直通给 NAS 或 Windows。
映射直通
通过全盘映射一块装有 Windows 的硬盘,可以让 Windows 系统在 PVE 下以虚拟机的形式开机。如果你也想映射 Windows 系统盘,建议提前做好以下操作:将 Windows 修改为本地用户,并移除 PIN。
(否则虚拟机启动会提示 “由于此设备上的安全设置已更改,你的 PIN 码不再可用”, 导致无法进入系统)
警告
我的 Windows 单独安装在一块 NVMe 盘上,理论上可以直通 NVMe 控制器给虚拟机作为系统盘,但实际测试下来虚拟机开机会蓝屏,不清楚是什么原因,最终还是只能通过全盘映射的方式启动。

通过以下命令查看一下硬盘的 ID,并将需要直通的硬盘记录下来
ls /dev/disk/by-id
再执行以下命令映射硬盘
# 100 为虚拟机 ID
# -sata0 为第一块 SATA 硬盘,PVE 支持设置 sata0-sata5,一共 6 块盘
# /dev/disk/by-id/xxxxxxxxxxxxxxx 为刚才记录的硬盘 ID
qm set 100 -sata0 /dev/disk/by-id/nvme-INTEL_SSDPEKKW128G7_BTPY6501148D128A

返回 PVE 中,你就能在虚拟机的 “硬件” 里看到 “硬盘 (sata0)” 了,这就说明硬盘已经全盘映射成功了。

接着来到 “选项” 中,找到 “引导顺序”,勾选刚刚添加的 sata0,并将其拖到最上面。

完成以上步骤后,启动虚拟机,不出意外的话,你应该就能成功进到 Windows 了!

控制器直通
危险
如果你的 PVE 系统盘安装在 SATA 硬盘上(包括 M.2 接口的 SATA 协议盘)并且主板只有一个 SATA 控制器。
直通整个 SATA 控制器会把 PVE 系统盘一起直通给虚拟机,导致 PVE 无法正常工作。
同理,如果你的 PVE 系统盘安装在 NVMe 硬盘上,并且另一块 NVMe 硬盘与 PVE 系统盘主控相同共用一个 NVMe 控制器。
直通这个 NVMe 控制器同样会把 PVE 系统盘一起直通给虚拟机,也会导致 PVE 无法正常工作。
总而言之,就是注意别把 PVE 系统盘直通了!
控制器直通比较简单,在 PVE 的 Web UI 上就可以完成,来到 “硬件” 点击 “添加”,找到 “PCI 设备”

弹出的选项框中,选择原始设备,可以看到 SATA controller
这个就是 SATA 控制器
而下方的 SSD 600P Series
就是刚才那块装有 Windows 的 NVMe 硬盘
最底下的 NVMe Optane Memory Series
则是 PVE 系统盘,千万不能直通!

如果不知道哪一项对应哪一块 NVMe 盘的,可以通过以下两条命令确定每块 NVMe 硬盘对应的 ID
lsblk
ls -la /sys/dev/block/|grep -v loop |grep -v dm

GVT-g 核显虚拟化
提示
我的 CPU 是 G4560,核显为 HD610,属于 7 代 U,通过 GVT-g 实现核显虚拟化,6 - 10 代的 U 可以参考本文
11 代及以上的 U 请自行搜索 SR-IOV 核显虚拟化
正常情况下,核显只能直通给一台虚拟机,而通过核显虚拟化后,可以将核显同时分配给多台虚拟机,比较常见的就是同时分配给 Windows 和 NAS。
修改 GRUB
在 /etc/default/grub
配置中加上 intel_iommu=on iommu=pt i915.enable_gvt=1
intel_iommu=on
启用了 Intel IOMMUiommu=pt
启用了 “pass-through” 模式i915.enable_gvt=1
则是启用了 Intel GVT-g,也就是核显虚拟化。
# If you change this file or any /etc/default/grub.d/*.cfg file,
# run 'update-grub' afterwards to update /boot/grub/grub.cfg.
# For full documentation of the options in these files, see:
# info -f grub -n 'Simple configuration'
GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`( . /etc/os-release && echo ${NAME} )`
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt i915.enable_gvt=1"
GRUB_CMDLINE_LINUX=""
然后运行以下命令更新 grub
update-grub
添加内核模块
编辑 /etc/modules
,添加上虚拟化和直通相关的模块,确保系统在启动时自动启用它们。
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
kvmgt
然后运行以下命令使其立即生效
update-initramfs -u -k all
检查 GVT-g 是否成功启用
完成以上步骤后,重启 PVE

接着运行以下命令,如果能看到类似 i915-GVTg_V5_4 i915-GVTg_V5_8
的输出就代表 GVT-g 成功启用了。
ls /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types
分配 vGPU
在虚拟机的 “硬件” 界面添加 vGPU,首先在 “原始设备” 中找到自己的核显型号

然后在 MDev 类型中,选择其中一个就完成了 vGPU 的分配

此时,启动 Windows 虚拟机,在设备管理器和任务管理器中就能看到核显已经被正确识别了。

优化虚拟机设置
在创建虚拟机时,为了提高成功率,选择的都是兼容性比较好的选项,如果你已经成功直通并点亮虚拟机,可以修改部分虚拟机的配置提高运行效率。
- 处理器设置为
host
- 机型选择
q35
- 网络设备选择
E1000E
提示
如果还想进一步优化性能,可以将系统盘映射成 SCSI,网卡选择 VirtIO,但这些选项在 Windows 下需要额外安装驱动,感兴趣的可以自行搜索一下。
