pve虚拟机pcie直通教程

文章时效一定要看!!!

不同版本配置天差地别,请勿用于6.x以外的版本
本文写作基于
新建博文时镜像版本:

  • pve6.2-4

最后一次更新时版本:

  • pve6.2-15

新建博文关键软件包版本:

  • pve-qemu-kvm: 5.1.0-2

最后一次更新时关键软件包版本:

  • pve-qemu-kvm: 5.1.0-6

1. 开启iommu

  1. 先进入bios打开VT-d虚拟化选项。
  2. 修改启动参数

编辑/etc/default/grub

nano /etc/default/grub

找到:GRUB_CMDLINE_LINUX_DEFAULT="quiet"
替换为GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on video=efifb:off,vesafb:off"
如果是amd平台替换为GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on video=efifb:off,vesafb:off"

解释:

  1. iommu开启直通分组
  2. efifb:off 禁用efi启动的显示设备
  3. vesafb:off 禁用legacy启动的显示设备

替换后执行以下命令更新grub:

update-grub

2. 加载模块

编辑/etc/modules

nano /etc/modules

添加以下几个模块,直接复制即可。

vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

3. 阻止驱动加载(显卡直通时才需要操作)

因为pve启动时会尝试加载显卡驱动,为了避免pve占用显卡,需要阻止pve的显卡驱动加载。

3.1 添加驱动黑名单

编辑/etc/modprobe.d/pve-blacklist.conf

nano /etc/modprobe.d/pve-blacklist.conf 

添加以下内容

# block AMD driver
blacklist radeon
blacklist amdgpu

# block NVIDIA driver
blacklist nouveau
blacklist nvidia
blacklist nvidiafb

# block INTEL driver
blacklist snd_hda_intel
blacklist snd_hda_codec_hdmi
blacklist i915

3.2 添加显卡到直通设备中

查看所有pci设备。

lspci

找到显卡后记下硬件id,形式是xxxx:xxxx,比如G5400的核心显卡的硬件id是8086:3e90
编辑/etc/modprobe.d/vfio.conf

nano /etc/modprobe.d/vfio.conf

添加以下内容注意!!!!把8086:3e90换成你的显卡的硬件id

options vfio-pci ids=8086:3e90

4. 重启

一定要确认机器正常重启,重启后屏幕会卡在第二行好像是initramfs(写博客的时候机器不在手边,不记得具体显示什么了,下次折腾的时候再补充。反正屏幕卡住说明阻止了驱动加载)

5. 配置虚拟机

  1. 机器设置为q35
  2. 点击添加设备,PCI设备,找到显卡对应的设备。
  3. 打开全部功能 PCI Express
  4. 启动机器,安装驱动

6. 一些大坑

6.1 intel

intel的坑比较多

  1. intel有多种直通方案,分别是gpu虚拟化以及传统直通。当前版本(PVE6.2-4镜像)(pve-qemu-kvm 5.1.0-2)存在有关intel显卡的bug,社区在2020年上半年已经有优化intel直通的提案,不久后在pve-qemu-kvm 5.1.0-5版本中添加了这一特性。目前(2020-10-06)此版本仍然没有进入测试版分支,所以只有两个方案:自己编译或再等一万年。(2020-11-04)更新博文时,5.1.0-4版本已经发布,-5还会远吗,继续等等 (2020-11-24)5.1.0-5他终于更了,可以直接添加legacy-igd=1
  2. intel的显卡vbios因板而异,不同主板的vbios对efi和legacy的支持水平参差不齐,我使用的主板恰好支持差,直通后HDMI与VGA口均不输出信号,但是驱动可以正常加载,解决方案是使用rom-parser和rom-fixer工具(github仓库地址)编辑提取出来的vbios(挖坑:这里会开一篇教程文章),并且将修改好的vbios文件复制到/usr/share/kvm,并且在显卡pcihost后添加romfile=”xxx.rom”手动加载vbios。说点题外话,提取的vbios可以测试兼容性。
    ./rom-parser /tmp/xxx
    如果有 PCIR: type 3说明支持efi启动,建议更换bios为OVMF。
  3. 驱动问题,直通windows,设备管理器显卡感叹号,提示代码43。算是直通成功一半了,但是这种情况处理起来比较复杂。有些情况下代码43显卡仍然可以正常工作,这种情况通常不用理会。如果工作不正常可以考虑下载安装老版本的驱动程序(我用windows自动安装的一切正常

6.2 nvidia

有卡还没测,可以先等一万年,会更的。
2020-11-4上周尝试直通GTX 1080Ti一次成功…N卡直通没啥坑,放心通就好了
官方文档提到需要添加以下内容

echo "options kvm ignore_msrs=1 report_ignored_msrs=0" > /etc/modprobe.d/kvm.conf

NVIDIA Kepler K80 GPUs需要在虚拟机配置文件中添加

args: -machine pc,max-ram-below-4g=1G

此外还必须进行以下操作,否则驱动出错:
WebUI中:对应虚拟机->硬件->显卡对应的PCI设备(双击)->勾选x-vga(主GPU)
或者修改虚拟机配置文件,在hostpci:后添加x-vga=1

驱动安装
NVIDIA GeForce GTX1080Ti Ubuntu20.04 LTS驱动安装

nvidia-docker
2020-11-24 待更新(挖坑:这里会开一篇文章)

6.3 amd

有卡还没测,可以再等一万年,在试了。

效果图:

1
2