PVE8.2核显直通到Windows10
前言
前段时间搭建起了 All In One,在安装好PVE之后我开启了 SR-IOV ,用了一段时间之后发现直通给 Windwos10 可以正常使用,但是直通到 Linux 总是有些问题。而且后来了解到虚拟出来的显卡性能也会被平分,想了想我似乎也就 Windows 上需要用到显卡,所以这次,我打算不用SR-IOV来直通虚拟显卡,而是直接直通整个核显给 Windows10 并能连接HDMI输出画面和声音
提示
对于下面添加或者修改的每项配置,我发现网上都只是让加上,但是并没有说为什么要加,加上的作用是啥,我又是比较喜欢刨根问底的人,所以我问了问 chatgpt ,并将回答以折叠块的形式附在了每项修改的后面,不保证准确,如果错误,欢迎留言指出。
注意
不保证其它版本试用本教程,编写文章时的系统版本和内核版本为:
PVE版本:Proxmox VE 8.2.4 x86_64
内核版本:6.8.8-2-pve
1. PVE系统的配置
重要
经过我多次测试,对于我现在的系统,只需要调整下面两项即可完成核显直通,不需要修改其它配置文件
1.1 编辑 /etc/default/grub
文件:
找到下面这行:
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
将其修改成:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on initcall_blacklist=sysfb_init"
对于编辑 /etc/default/grub 的解释,来源于 chatgpt-4o,不保证准确性
在 /etc/default/grub
文件中修改 GRUB_CMDLINE_LINUX_DEFAULT
的目的是为内核启动添加特定的参数,以确保PCI设备直通(passthrough)功能正常工作并解决可能的兼容性问题。具体来说,修改:
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
为:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on initcall_blacklist=sysfb_init"
涉及添加两个内核参数:intel_iommu=on
和 initcall_blacklist=sysfb_init
。下面是这两个参数的详细解释:
1. intel_iommu=on
这个参数用于启用Intel的IOMMU(输入输出内存管理单元)功能。IOMMU是实现PCI设备直通的关键组件,它允许对设备的DMA(直接内存访问)进行隔离和重映射,从而确保安全和性能。
详细解释:
- IOMMU:输入输出内存管理单元,用于管理设备的内存访问。启用IOMMU后,可以将设备的内存访问重定向到特定的内存区域,这对于虚拟机中的设备直通是必须的。
- intel_iommu=on:显式启用Intel的IOMMU支持。如果不启用IOMMU,PCI设备直通功能将无法正常工作。
2. initcall_blacklist=sysfb_init
这个参数用于在内核初始化过程中禁用 sysfb_init
调用。sysfb_init
是系统帧缓冲初始化的一个部分,可能会与直通的显卡(如iGPU)产生冲突。
详细解释:
- sysfb_init:这是系统帧缓冲的初始化函数。在某些情况下,这个初始化过程可能会导致显卡资源被宿主操作系统占用,从而影响显卡直通到虚拟机。
- initcall_blacklist=sysfb_init:禁用
sysfb_init
调用,防止系统帧缓冲初始化过程占用直通显卡的资源,确保显卡可以顺利地直通到虚拟机。
更新GRUB配置
修改完 /etc/default/grub
文件后,需要更新GRUB配置以使更改生效。运行以下命令:
sudo update-grub
总结
将 /etc/default/grub
文件中的 GRUB_CMDLINE_LINUX_DEFAULT
修改为:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on initcall_blacklist=sysfb_init"
的作用是:
- 启用Intel IOMMU (
intel_iommu=on
):确保IOMMU功能开启,以支持PCI设备直通。 - 禁用系统帧缓冲初始化 (
initcall_blacklist=sysfb_init
):防止系统帧缓冲初始化过程占用显卡资源,确保显卡能够顺利直通到虚拟机。
这些参数调整是实现和优化PCI设备直通功能的必要步骤。
1.2 编辑或创建 /etc/modprobe.d/vfio.conf
文件,添加内容:
options vfio-pci ids=8086:46d1,8086:54c8
其中的 ids=
是显卡和声卡id,可以通过 lspci -nn
命令获取到
对于编辑 vfio.conf 的解释,来源于 chatgpt-4o,不保证准确性
在Proxmox VE (PVE) 环境中,编辑 /etc/modprobe.d/vfio.conf
文件并添加以下行:
options vfio-pci ids=8086:46d1,8086:54c8
是为了将指定的PCI设备绑定到 vfio-pci
驱动程序上。这是实现PCI设备直通(passthrough)的关键步骤。下面是详细解释:
1. vfio-pci
驱动程序
vfio-pci
是一个内核模块,允许用户空间程序(如QEMU/KVM)安全地访问PCI设备。通过将设备绑定到 vfio-pci
,你可以将设备的控制权从宿主操作系统转交给虚拟机。
2. options vfio-pci ids=...
这行配置的作用是告诉 vfio-pci
模块将哪些设备ID绑定到它上面。设备ID由两个部分组成:供应商ID和设备ID,每个ID由4位十六进制数字表示。
在你的配置中:
8086:46d1
和8086:54c8
是两个设备ID。这些ID代表具体的Intel设备,可能是你要直通的iGPU或相关的设备。
详细解释:
8086
是Intel的供应商ID。46d1
和54c8
是具体设备的ID。
3. 为什么需要这样做?
当你在虚拟化环境中想要直通特定的PCI设备(如iGPU)给虚拟机时,宿主操作系统必须释放对这些设备的控制权。默认情况下,宿主操作系统会使用自己的驱动程序来管理这些设备。
通过将这些设备ID绑定到 vfio-pci
驱动程序上,你可以确保宿主操作系统不再使用这些设备,而是让它们完全由 vfio-pci
管理,从而使得这些设备可以被虚拟机直接使用。
总结
添加 options vfio-pci ids=8086:46d1,8086:54c8
到 /etc/modprobe.d/vfio.conf
文件中:
- 将设备ID为
8086:46d1
和8086:54c8
的PCI设备绑定到vfio-pci
驱动程序上。 - 确保这些设备不再由宿主操作系统使用,而是可以被虚拟机直接访问和控制。
这一步是实现PCI设备直通(passthrough)的必要配置,确保你的iGPU或其他设备能够在虚拟机中正常工作。
2. 创建Win10虚拟机
下载windwos安装镜像和驱动镜像并上传到pve,然后按照下面的步骤创建虚拟机
3. 初始化Win10虚拟机
创建好虚拟机之后,按照这个视频安装好windwos 👉 利用PVE虚拟机,安装Windows和Linux系统,并优化配置
记住电脑的ip地址,然后开启远程桌面
4. 修改虚拟机配置
4.1 添加核显直通
添加核显和声卡
修改虚拟机硬件中的 显示
为 无
。
4.2 上传vbios文件
下载 该文件
将文件上传到PVE的 /usr/share/kvm/
目录中
4.3 编辑配置文件
编辑 /etc/pve/qemu-server/<虚拟机id>.conf
文件,添加一行:
args: -set device.hostpci0.addr=02.0 -set device.hostpci0.x-igd-gms=0x2 -set device.hostpci0.x-igd-opregion=on
找到行 hostpci0: 0000:00:02.0
,在末尾添加:
,legacy-igd=1,romfile=n100.rom
对于编辑配置文件的解释,来源于 chatgpt-4o,不保证准确性
在Proxmox VE (PVE) 8.2中直通核显(iGPU)到Windows 10虚拟机时,涉及到的两项配置修改的目的是确保iGPU能在虚拟机中正常工作,并解决一些可能出现的兼容性问题。下面是这两项配置的详细解释:
1. 添加VBIOS文件并修改配置文件
首先,你需要在/usr/share/kvm/
目录中添加一个vbios_gvt_uefi.rom
文件,这个文件是iGPU的VBIOS (Video BIOS) 文件,用于在虚拟机中初始化和配置iGPU。
然后在/etc/pve/qemu-server/111.conf
文件中添加以下一行:
args: -set device.hostpci0.addr=02.0 -set device.hostpci0.x-igd-gms=0x2 -set device.hostpci0.x-igd-opregion=on
详细解释:
args
: 这个参数用于向QEMU传递额外的命令行参数,以进一步配置虚拟机。-set device.hostpci0.addr=02.0
: 设置直通的iGPU设备地址。02.0
是设备的PCI地址。-set device.hostpci0.x-igd-gms=0x2
: 配置iGPU的图形内存大小(GMS,Graphics Memory Size)。0x2
代表一个特定的内存大小值(具体含义请参考相关文档或硬件规格)。-set device.hostpci0.x-igd-opregion=on
: 启用iGPU的OpRegion支持,OpRegion是一个BIOS扩展,用于操作系统与iGPU之间的通信。
2. 修改hostpci0配置项
然后,将hostpci0: 0000:00:02.0
修改为:
hostpci0: 0000:00:02.0,legacy-igd=1,romfile=n100.rom
详细解释:
hostpci0: 0000:00:02.0
: 这是直通的iGPU设备的PCI地址。legacy-igd=1
: 这个参数用于启用iGPU的传统模式支持,确保iGPU能够在虚拟机中正确初始化和工作。romfile=n100.rom
: 这个参数指定了用于iGPU的VBIOS文件(在前面步骤中你放置到/usr/share/kvm/
目录下的vbios_gvt_uefi.rom
文件)。这里你需要确保文件名匹配,如果你的文件名是vbios_gvt_uefi.rom
,那么应该改为romfile=vbios_gvt_uefi.rom
。
总结
这两项修改的目的是:
- 提供必要的VBIOS文件,以便虚拟机能够正确初始化和配置iGPU。
- 通过传递额外的QEMU参数,确保iGPU在虚拟机中能正确工作,并解决可能的兼容性问题。
- 使用特定的配置参数(如
legacy-igd
和romfile
)来启用iGPU的传统模式支持,并指定使用正确的VBIOS文件。
这些配置对于确保iGPU在Windows 10虚拟机中正确工作至关重要。
4.4 安装驱动
直接安装官方驱动即可
然后连接显示器,成功输出画面表示显卡直通成功
5. 最后
感谢下面的内容对本次教程提供的帮助