QEMU/KVM-虚拟机网卡直通

确定主机和虚拟机都支持 VT-d 或 AMD-Vi

确保您的主机和虚拟机都支持 VT-d(Intel)或 AMD-Vi(AMD)技术。VT-d 和 AMD-Vi 技术支持直接内存访问(DMA)重映射,以允许物理设备直接分配给虚拟机。如果您的系统不支持 VT-d 或 AMD-Vi,则不能使用此功能。

要检查您的系统是否支持 VT-d 或 AMD-Vi,请在主机上运行以下命令之一,以查看 CPU 是否支持 IOMMU(输入输出内存管理单元):

对于 Intel CPU:

1
$ dmesg | grep -e DMAR -e IOMMU

对于 AMD CPU:

1
$ dmesg | grep -i -e AMD-Vi -e IOMMU

如果命令的输出包含有关 IOMMU 或 DMA 重映射的信息,则表示您的系统支持 VT-d 或 AMD-Vi 技术。如果未显示任何输出,则表示您的系统不支持此技术。

请注意,在某些系统中,VT-d 或 AMD-Vi 技术默认可能被禁用。如果您的系统支持此技术但未启用,请在系统 BIOS 中启用该选项。

查找网络设备 PCI 地址

当您将一个 USB 网络适配器插入计算机的 USB 接口后,它将被识别为一个 USB 设备而非一个 PCI 设备。因此,要查找该适配器的 PCI 地址,需要查找其所连接的 USB 控制器,然后查找该控制器所连接到的 PCI 总线和设备。

要查找 USB 控制器的位置,可以使用命令 lsusb -t 查看 USB 设备的拓扑结构。该命令会输出每个 USB 设备的拓扑信息,包括其所连接的控制器的位置信息。例如,下面是一个示例输出:

1
2
3
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/14p, 480M
|__ Port 5: Dev 2, If 0, Class=Vendor Specific Class, Driver=r8152, 480M

在上面的示例中,USB 网络适配器连接到了 Bus 01 下的 Port 5。通过查看上面的拓扑结构信息,可以看到该端口所连接的控制器为 Bus 01,Driver 为 xhci_hcd/14p。

接下来,您可以使用 lspci 命令来查找该控制器所连接的 PCI 总线和设备。例如,使用以下命令可以查找驱动为 xhci_hcd 的控制器:

1
$ lspci -nn | grep -i usb | grep -i xhci

该命令会输出控制器的 PCI 地址和其他详细信息。例如:

1
00:14.0 USB controller [0c03]: Intel Corporation 8 Series/C220 Series Chipset Family USB xHCI [8086:8c31] (rev 05)

在上面的示例中,USB 控制器连接到的 PCI 总线编号为 “00”,设备编号为 “14”,功能编号为 “0”。因此,该设备的 PCI 地址为 “0000:00:14.0”。

PCI 地址格式

PCI 地址通常以 “0000” 开头,这是因为每个 PCI 根总线都有一个唯一的编号,它用于标识 PCI 总线层次结构中的每个总线。在 Linux 系统中,PCI 地址通常表示为 “domain:bus:device.function” 的形式,其中 domain 表示 PCI 根总线编号,bus、device 和 function 分别表示设备在总线层次结构中的位置。因此,PCI 地址的开头通常为 “0000”,表示设备连接到系统的第一个 PCI 根总线。但是,对于某些非标准系统,PCI 地址的开头可能会不同,因此需要具体情况具体分析。

QEMU/KVM 虚拟机设置

可以使用 QEMU/KVM 虚拟机的直通设备功能(也称为 PCI passthrough)来直接使用外部网卡,而无需使用桥接。PCI passthrough 允许将主机上的物理设备直接分配给虚拟机,并且虚拟机可以像物理主机一样直接访问该设备,以获得更好的性能和更好的兼容性。

下面是大致的步骤:

确定您的主机和虚拟机都支持 VT-d 或 AMD-Vi。

确认您的外部网卡不被主机使用。

使用 IOMMU 和 vfio 驱动程序将外部网卡直通到虚拟机中。这可以使用 libvirt 和 virt-manager 工具完成,或者手动使用 qemu-kvm 命令行进行配置。

以下是使用 qemu-kvm 命令行手动配置的示例:

1
2
3
4
$ qemu-kvm -device vfio-pci,host=01:00.0,multifunction=on \
-device vfio-pci,host=01:00.1 \
-drive file=/path/to/vm-image,if=virtio \
-m 2048 -smp 2 -cpu host

在此示例中,我们使用 -device 参数将外部网卡直通到虚拟机中,并使用 -drive 参数将虚拟机磁盘映像文件加载到虚拟机中。您可以根据您的系统和需求进行相应的更改。

请注意,使用直通设备功能需要一些技术知识和实践经验,并且可能会有一些风险。建议在进行此类操作之前备份您的数据并进行适当的测试。


QEMU/KVM-虚拟机网卡直通
http://example.com/2023/02/16/QEMU-KVM-虚拟机网卡直通/
作者
Jie
发布于
2023年2月16日
许可协议