如何确认 VFIO 在 20.04 中正常工作?

Sto*_*aft 7 kernel pci 20.04 kvm-virtualization

我刚刚安装了 Ubuntu Server 20.04,并尝试让 GPU Passthrough 正常工作,但我似乎无法使用以前有效的方法启用 VFIO:

/etc/initramfs-tools/modules:

vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
vhost-net
Run Code Online (Sandbox Code Playgroud)

/etc/default/grub:

GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash iommu=1 amd_iommu=on vfio_pci.ids=10de:1b81,10de:10f0 vfio_iommu_type1.allow_unsafe_interrupts=1"
GRUB_CMDLINE_LINUX=
Run Code Online (Sandbox Code Playgroud)

但内核中似乎没有启用VFIO。

~$  lsmod | grep kvm
kvm_amd                98304  0
kvm                   663552  1 kvm_amd
ccp                    86016  13 kvm_amd
~$ lsmod | grep vfio
~$ 
Run Code Online (Sandbox Code Playgroud)

除非我可以确认 VFIO 已启用,否则我无法将 GPU 的驱动程序绑定到 VFIO,对吗?

编辑:我之前在 Arch 下进行了大约一年的直通,一切都工作得很好。所以这显然是 Ubuntu 的事情。我在 ASROck x399 Taichi 上使用 Thredripper 1950X。

Edit2:我加载了一些进展vfio_mdev。现在它可以代替调节器吗vfio?还是我还需要加载vfio

$ sudo modprobe vfio_mdev
$ lsmod | grep -i vfio
vfio_mdev              16384  0
mdev                   24576  1 vfio_mdev
Run Code Online (Sandbox Code Playgroud)

编辑3:好的,看来vfio不再是一个模块,而是内置到内核中了。https://forum.level1techs.com/t/ubuntu-20-04-missing-kernel-modules-for-vfio-pci-and-vfio-iommu-type1/156327/2

这似乎确实是真的:

~$ cat /boot/config-5.4.0-33-generic | grep -i vfio
CONFIG_KVM_VFIO=y
CONFIG_VFIO_IOMMU_TYPE1=y
CONFIG_VFIO_VIRQFD=y
CONFIG_VFIO=y
CONFIG_VFIO_NOIOMMU=y
CONFIG_VFIO_PCI=y
CONFIG_VFIO_PCI_VGA=y
CONFIG_VFIO_PCI_MMAP=y
CONFIG_VFIO_PCI_INTX=y
CONFIG_VFIO_PCI_IGD=y
CONFIG_VFIO_MDEV=m
CONFIG_VFIO_MDEV_DEVICE=m
# CONFIG_SAMPLE_VFIO_MDEV_MTTY is not set
# CONFIG_SAMPLE_VFIO_MDEV_MDPY is not set
# CONFIG_SAMPLE_VFIO_MDEV_MDPY_FB is not set
# CONFIG_SAMPLE_VFIO_MDEV_MBOCHS is not set
Run Code Online (Sandbox Code Playgroud)

好吧,如果它是内置的,那么就不lsmod显示它是有意义的,因为它不是模块。有什么方法可以确认 vfio 正在工作吗?dmesg 的输出是否足以确认这一点并继续讨论我的下一个问题(pci-alias' 不再像以前那样工作)。但这是另一个话题了。

dmesg | grep -i -e vfio
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-5.4.0-33-generic root=/dev/mapper/main--VG-lvroot ro quiet splash iommu=1 amd_iommu=on vfio_pci vfio_iommu_type1.allow_unsafe_interrupts=1 vt.handoff=7
[    0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-5.4.0-33-generic root=/dev/mapper/main--VG-lvroot ro quiet splash iommu=1 amd_iommu=on vfio_pci vfio_iommu_type1.allow_unsafe_interrupts=1 vt.handoff=7
[    0.532762] VFIO - User Level meta-driver version: 0.3
Run Code Online (Sandbox Code Playgroud)

Clo*_*ONG 9

如果内核已经使用 vfio 驱动程序构建,则无法使用 lsmod 来显示 vfio 驱动程序是否已加载到 Linux 内核中。但您仍然可以使用以下命令查看这些驱动程序是否内置到内核中:

# cat /lib/modules/$(uname -r)/modules.builtin | grep vfio

kernel/drivers/vfio/vfio.ko
kernel/drivers/vfio/vfio_virqfd.ko
kernel/drivers/vfio/vfio_iommu_type1.ko
kernel/drivers/vfio/pci/vfio-pci.ko
Run Code Online (Sandbox Code Playgroud)

该命令还可以帮助您在“grep”之后检查内核中具有不同驱动程序名称模式的其他内置驱动程序