PVE 7.2-4 硬件直通
基本要求
确认自己的主板CPU是否支持Vt-d功能,intel要b75以上芯片组才支持。也就是说intel4代酷睿处理器以上理论都可以支持,AMD暂时不明。
GVT-g 一般在6代以上的CPU上支持,可以自行尝试
VT-D是io虚拟化。不是VT-X,具体请参考下面文章
https://zhuanlan.zhihu.com/p/50640466
请注意 ,开启vt-d才能io虚拟化,AMD平台是iommu,某些OEM主板上叫SRIOV。
本文以 Intel 平台作为环境基础
检查VT-d是否开启
#执行 dmesg | grep -e DMAR -e IOMMU #若无输出,请在BIOS内开启VT-d
NVIDIA独显直通
启用硬件直通
打开grub配置文件
nano /etc/default/grub
找到这一行
GRUB_CMDLINE_LINUX_DEFAULT="quiet“
Intel用户修改为:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on pcie_acs_override=downstream video=vesafb:off video=efifb:off"
以下有几个注意的点以及参数解读
#这里为了保证独显不被占用关闭PVE对此两种显卡的启用
#启用intel_IOMMU
intel_iommu=on
#有些主板的PCIE 1、2 槽同时插上时会共享带宽,如果不拆分iommu,当两个设备同时直通,其中一个就会显示占用
iommu=pt
#如果是更新到pve7.2.4后虚拟机没法开机建议在CMDLINE中加上以下参数
pcie_acs_override=downstream,multifunction nofb textonly nomodeset
#pcie_acs_override=downstream,multifunction 用于将 iommu groups 拆分,方便直通一些板载的设备。
#这个参数需要你的处理器支持 ACS (Access Control Services) 功能,并在 BIOS 中开启。
#nofb 是用于禁用帧缓冲设备,避免内核在屏幕上输出信息。
#textonly 是用于设置控制台为文本模式,不使用图形界面。
#nomodeset 是用于禁止加载显卡驱动程序,避免与直通的显卡冲突。
video=simplefb:off
#是一个用于禁用 simplefb 帧缓冲驱动程序的内核参数。
#这个参数可以在使用 GPU 透传时避免内核在屏幕上输出信息。如
#果你需要显卡直通,建议在 cmdline 再加上 video=vesafb:off 和 video=efifb:off
#禁止启动vesa驱动
video=vesafb:off
#禁止启动efi启动的显卡
video=efifb:off
#i915.enable_gvt 是一个用于启用 Intel 的 GVT-g 驱动程序的内核参数。
GVT-g 是一种硬件虚拟化技术,可以让多个虚拟机共享一个 Intel 核显,并分配不同的虚拟 GPU。
如果你想使用 GVT-g 功能,并且核显可以支持就需要添加这个参数。
如果你只想使用显卡直通又或者核显不支持,就不要添加这个参数。
i915.enable_gvt=1
更新grub
update-grub
加载需要的模块
编辑 nano /etc/modules
添加以下内容
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
#kvmgt 模块为核显i915 方式直通
找到设备的hostpci
root@pve:~# lspci | grep NVIDIA
01:00.0 VGA compatible controller: NVIDIA Corporation GM206 [GeForce GTX 960] (rev a1)
01:00.1 Audio device: NVIDIA Corporation GM206 High Definition Audio Controller (rev a1)
01:00.0 VGA compatible controller: NVIDIA Corporation GM206 [GeForce GTX 960] (rev a1) 显卡本身视频输出
01:00.1 Audio device: NVIDIA Corporation GM206 High Definition Audio Controller (rev a1) 显卡自带的声卡
这里要注意一下,如果是直通独显,需要将显卡的声卡以及显卡同时直通至一个虚拟机
查看设备的ID
#后面xx:xx.x的为hostpci的ID,因为要同时直通显卡本身的显卡和声卡,这里直接选择01:00设备输出ID
lspci -n -s 01:00
root@pve:~# lspci -n -s 01:00
01:00.0 0300: 10de:1401 (rev a1)
01:00.1 0403: 10de:0fba (rev a1)
可以看到上面已经输出了ID,将ID添加进vfio
echo "options vfio-pci ids=10de:1401,10de:0fba disable_vga=1" > /etc/modprobe.d/vfio.conf
#以下是给核显加入vfio有需求的话可以使用上面的方法添加
#echo "options vfio-pci ids=10de:1401,10de:0fba" > /etc/modprobe.d/vfio.conf
注意,上面这条命令,ids=后面跟直通组的所有设备。中间以英文逗号隔开。自己的设备自己替换。
给设备加入信任列表
echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modprobe.d/iommu_unsafe_interrupts.conf
禁止PVE加载驱动
为了保证硬件在直通前不会被宿主机占用,需要给显卡以及其他使用的模块提前禁用。保证显卡在PVE开机后不会被宿主机使用
查看设备需要什么驱动
lspci -vvv -s 01:00
1:00.0 VGA compatible controller: NVIDIA Corporation GM206 [GeForce GTX 960] (rev a1) (prog-if 00 [VGA controller])
...
Kernel driver in use: vfio-pci
Kernel modules: nvidiafb, nouveau
01:00.1 Audio device: NVIDIA Corporation GM206 High Definition Audio Controller (rev a1)
...
Kernel driver in use: vfio-pci
Kernel modules: snd_hda_intel
可以看到设备 1:00.0
使用了 nvidiafb, nouveau
设备 01:00.1
使用了 snd_hda_intel
编辑 nano /etc/modprobe.d/pve-blacklist.conf
将需要禁用的模块加入
#直通AMD显卡,禁用以下模块
blacklist radeon
blacklist amdgpu
#直通NVIDIA显卡,禁用以下模块
blacklist nvidiafb
blacklist nouveau
blacklist nvidia
#直通INTEL核显,禁用以下模块,注意!如果使用Gvt-G,请不要禁用以下模块模块
blacklist snd_hda_intel
blacklist snd_hda_codec_hdmi
blacklist i915
更新配置
root@pve:~# update-initramfs -u
update-initramfs: Generating /boot/initrd.img-5.15.35-1-pve
Running hook script 'zz-proxmox-boot'..
Re-executing '/etc/kernel/postinst.d/zz-proxmox-boot' in new private mount namespace..
No /etc/kernel/proxmox-boot-uuids found, skipping ESP sync.
#重启使配置生效
root@pve:~# reboot
查看模块是否被正常加载
root@pve:~# lsmod | grep vfio
vfio_pci 57344 1
vfio_virqfd 16384 1 vfio_pci
irqbypass 16384 11 vfio_pci,kvm
vfio_iommu_type1 36864 1
vfio 36864 5 vfio_iommu_type1,vfio_pci
使用 dmesg 查看是否有错误
dmesg | grep "No more image"
如果输出 No more image in the PCI ROM
那可能需要按上述操作把核显驱动也禁了
显卡直通 代码 43 解决
尽量使用最新版的NVIDIA驱动程序
echo "options kvm ignore_msrs=1 report_ignored_msrs=0" > /etc/modprobe.d/kvm.conf
参考教程原帖
- 佛西博客 - PVE开启硬件直通功能 (buduanwang.vip)
- 佛西博客 - Proxmox VE pve7.0安装破解内核,解决iommu分组问题 (buduanwang.vip)
- PVE开启硬件显卡直通功能 - 知乎 (zhihu.com)
- PVE直通核显 - 郑羊羊咩的窝 (zyyme.com)
- PVE直通核显给虚拟机-教程区-Proxmox中文社区 - Proxmox Virtual Environment - Proxmox Mail Gateway
- https://www.huakings.cn/post/180.html
- 【司波图】PVE下针对macOS的显卡直通设置(虚拟机装黑果果03_完结)_哔哩哔哩_bilibili
- Proxmox VE 直通显卡方案及解决N卡Code43 | 晓羽笔记 (xylog.cn)
- PCI(e) 直通 - Proxmox VE
GVT-G 共享 核显
编辑 grub引导配置
打开grub配置文件
vim /etc/default/grub
找到这一行
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
就像这样
GRUB_CMDLINE_LINUX_DEFAULT="quiet i915.enable_gvt=1"