最近新入一台 mini 主机,底层系统安装 PVE,通过安装虚拟机来做到软路由、NAS、日常办公 PC 等等 ALL IN ONE。
日常办公 PC 当然由 Win10 担当,并在 PVE 里实现将唯一的核显直通给 Win10,且通过物理显示端口(如 HDMI、DP 等)输出到显示器上。
众所周知,PVE 里做核显的直通还是很麻烦的,在此做个记录与大家分享。
本文仅以自己的硬件情况记录过程和配置,其他情况因缺少硬件和实操经验,就不多说了,以防误导大家。
一、环境
- 核显:UHD Graphics 630
- PVE 版本:6.1-7
- 虚拟系统:Win10
二、启动硬件直通
在此之前,首先确认 CPU 是支持 VT-D
1. 修改 /etc/default/grub
修改 GRUB_CMDLINE_LINUX_DEFAULT 为:
quiet intel_iommu=on pcie_acs_override=downstream video=efifb:off,vesafb:off
2. 修改 /etc/modules
增加直通相关模块:
vfio vfio_iommu_type1 vfio_pci vfio_virqfd
3. 更新引导
update-grub
4. 修改 /etc/modprobe.d/pve-blacklist.conf
增加驱动黑名单,如该文件没有,则创建。
blacklist nvidiafb blacklist snd_hda_intel blacklist snd_hda_codec_hdmi blacklist i915
5. 绑定核显到 vfio 模块
查看核显以及声卡的供应商和设备 ID:
lspci -n | grep -E "0300|0403"
得到输出:
00:02.0 0300: 8086:3e98 (rev 02) 00:1f.3 0403: 8086:a348 (rev 10)
其中“8086:3e98”和“8086:a348”分别就是核显和声卡的供应商 ID和设备 ID,注意,这里每个人会有不同,请根据自己实际的输出来做接下来的绑定操作。
把它们绑定到 vifo 模块:
echo "options vfio-pci ids=8086:5a85,8086:5a98" > /etc/modprobe.d/vfio.conf
6. 更新配置信息
执行以下命令更新配置信息:
update-initramfs -u
最后重启 PVE 物理机。如果操作成功,重启后,显示器的内容会卡在启动过程中最后显示的两行代码那里。
三、创建虚拟机并安装 Win10
1. 创建虚拟机
通过 PVE 的引导来创建虚拟机:
记住 VM ID,之后配置会用到。
OS 选择 Win10。
系统相关选项均先保持默认,即显卡为默认、BIOS 为 SeaBIOS、机器为 i440fx。
之后的几个 TAB 内容按需选择即可。
创建完成虚拟机后,先不要开机。为虚拟机添加 PCI 设备,并选取显卡,不要勾选“主GPU”:
然后,开启虚拟机,正常安装 Win10 并进入系统。
2. 安装驱动
这里主要是安装 VirtIO 和核显驱动,其中 VirtIO 驱动需要自行下载并加载到虚拟机中安装,可在下面的链接中获取:
https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/
显卡驱动我安装的 19 年版本的驱动(26.20.100.7212),20 年的新版驱动反而可能导致设备叹号。
安装好驱动后,关机。
四、设置核显直通,并通过物理显示端口输出
1. 将之前添加的 PCI 显卡从虚拟机的硬件中删除
2. 编辑虚拟机配置文件
进入 PVE 的 Shell 控制台,编辑配置文件:
nano /etc/pve/qemu-server/105.conf
其中“105”代表创建虚拟机时分配的 VM ID。增加以下行:
- 第一行:args: -device vfio-pci,host=00:02.0,addr=0x18,x-igd-opregion=on
- 倒数第二行:vga: std
打开虚拟机,此时应该能实现 VNC 和显示器双输出。后面怎么玩,就看大家自己发挥啦。