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 |
|
对于 AMD CPU:
1 |
|
如果命令的输出包含有关 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 |
|
在上面的示例中,USB 网络适配器连接到了 Bus 01 下的 Port 5。通过查看上面的拓扑结构信息,可以看到该端口所连接的控制器为 Bus 01,Driver 为 xhci_hcd/14p。
接下来,您可以使用 lspci
命令来查找该控制器所连接的 PCI 总线和设备。例如,使用以下命令可以查找驱动为 xhci_hcd 的控制器:
1 |
|
该命令会输出控制器的 PCI 地址和其他详细信息。例如:
1 |
|
在上面的示例中,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 |
|
在此示例中,我们使用 -device 参数将外部网卡直通到虚拟机中,并使用 -drive 参数将虚拟机磁盘映像文件加载到虚拟机中。您可以根据您的系统和需求进行相应的更改。
请注意,使用直通设备功能需要一些技术知识和实践经验,并且可能会有一些风险。建议在进行此类操作之前备份您的数据并进行适当的测试。