当前位置:   article > 正文

ubuntu18.04下pass-through直通PCIe设备到qemu-kvm虚拟机实践_kvm网卡直通

kvm网卡直通

设备直通是一种虚拟化资源分配方式,通过将物理设备直通给虚拟机环境,达到使虚拟机可以直接访问物理设备的目的,直通功能对设备的要求不高,不需要设备支持SR-IOV PF/VF,目前市面上的显卡/网卡一般都支持直通。直通典型场景比如主机上有两块显卡,可以一块分配给主机用,另一块给虚拟机用,主板有集成显卡的可以采用将集成显卡给宿主机,PCIe的独立显卡给虚拟机用。

由于实验主机上没有两块GPU卡,但是有两块网卡,所以本篇的场景是将PCI以太网卡直通给QEMU虚拟机,HOST机上使用无线网卡,今天来探索一下PASS-THROUGH的玩法。

实践平台

环境安装

1.安装QEMU虚拟机环境以及虚拟机管理工具环境:

sudo apt-get install qemu-kvm qemu-system libvirt-bin  bridge-utils virt-manager ssh-askpass-gnome  gvncviewer cpu-checker qemu-utils --no-install-recommends

2.默认BIOS中已经ENABLE了CPU虚拟化和设备虚拟化能力,所以这一步操作忽略。

3.Enable PCI IOMMU,参考如下文章:

Linux ion&dma-buf&iommu的原理_papaofdoudou的博客-CSDN博客

如果不启用IOMMU,则无法为PCI设备切换VFIO驱动:

4.确认需要穿透的pci设备和设备号,我们透传的设备如下图所示,Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller。

透传设备的地址BDF为:00000:02:00.0,设备ID为10ec:8168.

设置HOST机上的PCI设备

HOST端通过如下命令查看PCI设备信息

virsh nodedev-list --tree

首先在HOST端将PCI以太网卡设备解绑,将其驱动从默认的r8169切换为vfio-pci,这个过程中,主机的以太网络连接会中断,不过没有关系,主机上还有另外一个集成的无线网卡。

 执行如下命令查看当前设备信息:

$ virsh nodedev-dumpxml pci_0000_02_00_0

从设备信息中看到,设备驱动是r8169,设备的IOMMU分组是9。

查看IOMMU分组信息确实如此,分组为9

 下一步在HOST对设备解绑

$ virsh nodedev-detach pci_0000_02_00_0

解绑后,主机以太网卡功能已经失能,需要连接无线网卡。

此时我们需要加载内核的VFIO模块,由于默认UBUNTU18.04内核已经将vfio.ko,vfio-pci.ko两个模块builtin到内核中,所以这一步操作系统已经帮我们做了,不需要其它操作。

针对以太网卡设备使能VFIO驱动

执行如下命令,将系统的VENDOR和PRODUCT ID作为输入,写入vfio-pci/new_id节点,使能VFIO驱动,bind to vfio-pci Driver.(貌似执行前面的detach之后,这一步不是必须的)。

echo 10ec 8168 > /sys/bus/pci/drivers/vfio-pci/new_id

 执行后,再次查看设备信息,会发现其驱动已经从r8196切换为vfio-pci:

确认IOMMU分组,隶属于同一个IOMMU GROUP的设备必须整体透传给虚拟机,不允许存在部分透传的情况,在没有加载vfio-pci驱动时,/dev/vfio/9是不存在的,在加载vfio-pci后,GROUP设备节点产生,IOMMU GROUP中的所有设备均可以透传给虚拟机了。

前述操作总结起来,目的是将待透传设备的原驱动替换为vfio-pci驱动,除了前面用VIRT工具来操作,其实完全可以用PCI的sysfs文件节点即可完成,如下面的操作步骤所示:

  1. # lspci -s 00:02.0 -k
  2. 00:02.0 VGA compatible controller: Intel Corporation AlderLake-S GT1 (rev 0c)
  3. Subsystem: ASUSTeK Computer Inc. Device 8694
  4. # echo vfio-pci > /sys/bus/pci/devices/0000\:00\:02.0/driver_override
  5. # echo "0000:00:02.0" > /sys/bus/pci/drivers/vfio-pci/bind
  6. # lspci -s 00:02.0 -k
  7. 00:02.0 VGA compatible controller: Intel Corporation AlderLake-S GT1 (rev 0c)
  8. Subsystem: ASUSTeK Computer Inc. Device 8694
  9. Kernel driver in
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号