Broadcom 无线网卡直通到 Ubuntu VM

Broadcom 无线网卡直通到 Ubuntu VM

我正在尝试设置无线网卡以将其传递到 QEMU VM(只是为了检查设备传递及其工作原理)。我能够很好地使用主机上的 wifi。

主机上的 lspci 显示与卡相关的以下信息: 在此处输入图片描述

使用的内核驱动程序是“wl”。

现在,我尝试解除主机驱动程序的绑定,并将 vfio-pci 驱动程序与我的无线网卡关联,如下所示:

#!/bin/bash

# content of /etc/modprobe.d/local.conf is
# options vfio-pci ids=14e4:4331

# content of /etc/modprobe.d/vfio.conf is
# options vfio_iommu_type1 allow_unsafe_interrupts=1

set -e

BDF="03:00.0"
GRP=12

echo "[+] loading vfio-pci"
sudo modprobe vfio-pci

echo "[+] Finding iommu group"
readlink /sys/bus/pci/devices/0000:${BDF}/iommu_group

echo "[+] Devices in the group"
ls /sys/bus/pci/devices/0000:${BDF}/iommu_group/devices

echo "[+] Unbinding device driver"
echo 0000:${BDF} | sudo tee /sys/bus/pci/devices/0000:${BDF}/driver/unbind

echo "[+] Finding vendor, device ID"
lspci -n -s ${BDF}
val=$(lspci -n -s ${BDF} | cut -d' ' -f3)
vendor=$(echo $val|cut -d':' -f1)
deviceid=$(echo $val|cut -d':' -f2)
echo "-- vendor is ${vendor}"
echo "-- deviceid is ${deviceid}"

echo "[+] Binding to vfio-pci"
echo "${vendor} ${deviceid}" | sudo tee /sys/bus/pci/drivers/vfio-pci/new_id

echo "[+] Checking /dev/vfio"
ls /dev/vfio

echo "[+] checking dmesg for vfio logs"
dmesg | grep -i vfio

此时,执行 lspci 显示该设备与 vfio-pci 驱动程序相关联。

在此处输入图片描述

现在,我在 QEMU 中启动 Ubuntu,并将设备作为以下参数传递:

-device vfio-pci,host=03:00.0,id=net0

但是,当检查虚拟机内部的“lspci -v”时,我发现与该设备关联的驱动程序是bcma-pci-bridge

在此处输入图片描述

我的疑问/问题是:

  1. 我是否以正确的方式将设备传递给虚拟机?根据 lspci 输出/dmesg 输出,这部分似乎是正确的。
  2. 使用“bcma-pci-bridge”是否符合预期行为?是否有任何方法可以让虚拟机在设备上使用“wl”驱动程序?设置完成后,我想试用“wl”驱动程序,因此以这种方式进行设置会很有用。

答案1

我遇到了类似的问题,内部机器无法接收我的卡,因此我创建了一个新的虚拟网络,并将virt-managerNAT 设置为转发到我的无线卡。然后我使用virtio并在 VM 设置中选择该网络。

转发至 wirelesscard

编辑 - 我不知道您是否能够按照您描述的方式使用此方法与无线网卡进行交互,因此也许这不是一个规范的答案

答案2

首先,我使用此方法将设备传递给我的虚拟机已有一段时间了,从未遇到任何问题。

使用与 vfio bind 类似的方法,您可以强制外围设备绑定到特定的驱动程序。

步骤如下,从当前驱动程序解除绑定,wl然后 modprobe 将 wifi 卡绑定到它。

我不能保证它一定会起作用,我猜bcma-pci-bridge是因为 iommu 重新映射而使用的,但是当我将我的英特尔 wifi 绑定到虚拟机时,它使用与主机相同的驱动程序。

在您的虚拟机中尝试此脚本

#!/bin/bash

set -e

BDF="00:04.0"

echo "[+] Unbinding old wifi device driver"
echo 0000:${BDF} | sudo tee /sys/bus/pci/devices/0000:${BDF}/driver/unbind

echo "[+] Finding vendor, device ID"
lspci -n -s ${BDF}
val=$(lspci -n -s ${BDF} | cut -d' ' -f3)
vendor=$(echo $val|cut -d':' -f1)
deviceid=$(echo $val|cut -d':' -f2)
echo "-- vendor is ${vendor}"
echo "-- deviceid is ${deviceid}"
modprobe wl
echo "[+] Binding to wl driver"
echo "${vendor} ${deviceid}" | sudo tee /sys/bus/pci/drivers/wl/new_id

相关内容