Ubuntu 16.04 KVM中实现PCI Passthrough

确认环境

  1. 确认/boot/config-XXXX文件中与VFIO相关参数设置为y或者m。其中比较重要的是VGA、IOMMU相关参数。

    这里写图片描述

  2. 确认IOMMU开启,也就是BIOS与IOMMU相关选项打开 (Intel VT-d或者 AMD IOV)

# dmesg | grep IOMMU

[    0.000000] DMAR: IOMMU enabled
[    0.040828] DMAR-IR: IOAPIC id 2 under DRHD base  0xfed91000 IOMMU 1
  • 1
  • 2
  • 3
  • 4
  1. 确认CPU支持硬件虚拟化,有内容输入即可
# egrep -o '(vmx|svm)' /proc/cpuinfo
  • 1

安装虚拟机相关软件

sudo apt-get install qemu-kvm libvirt-bin bridges-utils ovmf  virt-manager uml-utilities
  • 1

执行如下命令查看KVM是否安装成功

# kvm-ok

输出如下为成功:
INFO: /dev/kvm exists
KVM acceleration can be used
  • 1
  • 2
  • 3
  • 4
  • 5

查看kvm内核模块是否已加载

lsmod | grep kvm
  • 1

IOMMU 开启

编辑 /etc/default/grubGRUB_CMDLINE_LINUX_DEFAULT 参数,将intel_iommu=on添加在行位
使用sudo update-grub来更新grub文件。

屏蔽Nouveau 驱动

参考 https://silenceu.me/ubuntu/disablenoveau.html

编辑/etc/modproble.d/blacklist.conf文件,加入如下内容:

blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0
alias nouveau off
alias lbm-nouveau offenter code here
  • 1
  • 2
  • 3
  • 4
  • 5

然后运行以下命令禁用nouveau内核

# echo options nouveau modeset=0 | sudo tee -a /etc/modprobe.d/nouveau-kms.conf
# sudo update-initramfs -u
  • 1
  • 2

重启之后,使用dmesg | grep nouveau查看,如果没有输出则成功禁止。

确认Passthrough的设备

使用lspci -nn列出所有PCI设备和他们的地址,记录下GPU ids为 [10de:11c6] & [10de:0e0b]

这里写图片描述

查看这两个设备属于的IOMMU组,find /sys/kernel/iommu_groups/ -type l 。(如果没有显示任何内容,请确认BIOS中相应Intel VT 或 AMD IOV打开与否)查找之前记录的GPU IDS,属于group1。 如果在该组中化存在其他设备需要为kernel添加ACS Patch,相应的方法参见链接。如果只有一个组,则进行下一步。

Kernel 4.8 added better support for IOMMU group separation. If your GPU’s IOMMU group has another device in it with the address 00:01.0 then you don’t need the ACS patch.

这里写图片描述

配置PCI IDS

首先创建 /etc/modprobe.d/vfio.conf文件,将相应的GPU PCI IDs 添加进去

options vfio-pci ids=10de:11c6,10de:0e0b
  • 1

然后编辑 /etc/default/grubGRUB_CMDLINE_LINUX_DEFAULT 参数,将vfio-pci.ids=10de:11c6,10de:0e0b添加在行位
使用sudo update-grub来更新grub文件。

将vfio相关模块添加到initrd

编辑文件/etc/initramfs-tools/modules

vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
  • 1
  • 2
  • 3
  • 4

保存,并且更新initrdsudo update-initramfs -u

qemu 配置文件中开启passthrough

编辑 /etc/libvirt/qemu.conf

取消改行的注释

nvram = [    "/usr/share/OVMF/OVMF_CODE.fd:/usr/share/OVMF/OVMF_VARS.fd"
]
  • 1
  • 2

重启查看配置

查看vfio-pci.ids 是否设置成功dmesg | grep vfio-pci.ids
这里写图片描述

查看vfio相关模块是否加载成功
这里写图片描述

查看GPU驱动是否为vfio-pci(lspci -vv)
这里写图片描述

使用

  1. 为虚拟机添加PCI 设备时将GPU配置给VM
  2. 在VM中使用NVIDIA GPU时需要,将对VM的 配置文件进行修改。因为NVIDIA GPU 会阻止VM中的驱动加载到GPU上,所以需要在qemu中设置隐藏VM的状态,让GPU无法检测到时VM在控制GPU
<features>
    ...
    <kvm>
      <hidden state='on'/>
    </kvm>
    ...
  </features>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
参考链接
  1. https://forum.level1techs.com/t/play-games-in-windows-on-linux-pci-passthrough-quick-guide/108981?source_topic_id=110696

  2. https://scottlinux.com/2016/08/28/gpu-passthrough-with-kvm-and-debian-linux/

  3. http://www.firewing1.com/howtos/fedora-20/create-gaming-virtual-machine-using-vfio-pci-passthrough-kvm

  4. http://blog.csdn.net/c80486/article/details/42836169

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值