我正在尝试设置无线网卡以将其传递到 QEMU VM(只是为了检查设备传递及其工作原理)。我能够很好地使用主机上的 wifi。
使用的内核驱动程序是“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
。
我的疑问/问题是:
- 我是否以正确的方式将设备传递给虚拟机?根据 lspci 输出/dmesg 输出,这部分似乎是正确的。
- 使用“bcma-pci-bridge”是否符合预期行为?是否有任何方法可以让虚拟机在设备上使用“wl”驱动程序?设置完成后,我想试用“wl”驱动程序,因此以这种方式进行设置会很有用。
答案1
答案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