使用SR-IOV创建KVM虚拟机报错“host doesn’t support passthrough of host PCI devices”解决

本文详细讲述了在CentOS 7中使用SR-IOV创建KVM虚拟机时遇到的错误,包括如何确认SR-IOV支持、BIOS和GRUB配置、vfio加载以及常见问题的解决方法。确保了VT-d、IOMMU和vfio的正确启用,以避免'host doesn’t support passthrough of host PCI devices'错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题现象

使用SR-IOV虚拟网卡创建KVM虚拟机,创建虚拟机添加“–hostdev=xxxx”参数,或者修改虚拟机XML配置文件增加 “hostdev”,创建SR-IOV虚拟网卡时会报错如下:

ERROR unsupported configuration: host doesn’t support passthrough of host PCI devices

二、 确认开启SR-IOV全部支持

以下忘记第二项不设置或打开都会导致以上问题。

1、在BIOS里开启网卡SR-IOV
在这里插入图片描述
注:即使BIOS里开启全局SRIOV,网卡也依然可以当作普通网卡使用

2、在BIOS里开启VT-d支持
在这里插入图片描述
3、在grub配置iommu支持

修改/boot/grub2/grub.cfg或 /etc/grub2.cfg文件(软链接),在linux16加载内核镜像一行追加“intel_iommu=on iommu=pt”,“iommu.passthrough=1”不加也可,包含在“intel_iommu=on”

[root@localhost ~]# ls -l /etc/grub2.cfg lrwxrwxrwx. 1 root root 22
Nov 19 17:54 /etc/grub2.cfg -> …/boot/grub2/grub.cfg

linux16 /vmlinuz-3.10.0-514.el7.x86_64 root=/dev/mapper/cl-root ro
crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet
intel_iommu=on iommu=pt

也可修改/etc/default/grub文件,在GRUB_CMDLINE_LINUX最后追加“intel_iommu=on iommu=pt”参数,然后执行grub2-mkconfig -o /boot/grub2/grub.cfg刷新 grub.cfg 文件;

[root@localhost ~]# cat /etc/default/grub GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="( s e d ′ s , r e l e a s e . ∗ (sed 's, release
.*(sed ′ s,release.∗,g’ /etc/system-release)" GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT=“console”
GRUB_CMDLINE_LINUX=“crashkernel=auto rd.lvm.lv=cl/root
rd.lvm.lv=cl/swap rhgb quiet intel_iommu=on iommu=pt
iommu.passthrough=1” GRUB_DISABLE_RECOVERY=“true”

[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg Generating
grub configuration file … Found linux image:
/boot/vmlinuz-3.10.0-514.el7.x86_64 Found initrd image:
/boot/initramfs-3.10.0-514.el7.x86_64.img Found linux image:
/boot/vmlinuz-0-rescue-e5ec5990f1e548bea132e3458196c892 Found initrd
image: /boot/initramfs-0-rescue-e5ec5990f1e548bea132e3458196c892.img
done

注:额外追加“console=ttyS0,115200”参数可支持串口显示;

4、虚拟化支持及开启成功验证

1)验证BIOS里开启SR-IOV和Intel VT-d,Grub开启IOMMU生效方法如下:

[root@localhost ~]# cat /proc/cmdline | grep intel_iommu
BOOT_IMAGE=/vmlinuz-3.10.0-514.el7.x86_64 root=/dev/mapper/cl-root ro
crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet
intel_iommu=on iommu=pt iommu.passthrough=1

[root@localhost ~]# dmesg | grep -e IOMMU
[ 0.000000] DMAR: IOMMU enabled
[ 0.064288] DMAR-IR: IOAPIC id 3 under DRHD base 0xfbffc000 IOMMU 0
[ 0.064289] DMAR-IR: IOAPIC id 1 under DRHD base 0xc7ffc000 IOMMU 1
[ 0.064290] DMAR-IR: IOAPIC id 2 under DRHD base 0xc7ffc000 IOMMU 1

BIOS里只开启SR-IOV,忘记开启Intel VT-d时只会打印:

[root@localhost ~]# dmesg | grep -e IOMMU
[ 0.000000] DMAR: IOMMU enabled

并且创建虚拟机添加“–hostdev=xxxx”参数,创建SR-IOV虚拟网卡时会报错如下:

ERROR unsupported configuration: host doesn’t support passthrough of host PCI devices

2)验证vfio加载正常:

[root@localhost ~]# lsmod | grep vfio
vfio_iommu_type1       17632  1 
vfio_pci               36948  1 
vfio                   26136  5 vfio_iommu_type1,vfio_pci
irqbypass              13503  4 kvm,vfio_pci

注意:重启后“lsmod | grep vfio”并不会有显示,只有虚拟机创建后才会加载启动vfio,看到显示。

Centos7使用SR-IOV创建KVM虚拟机具体方法参见:使用SR-IOV创建KVM虚拟机

### 配置和支持SR-IOVKVM虚拟机 #### 准备工作 确保物理服务器上的网络适配器支持并启用了SR-IOV功能。对于特定型号如NVIDIA ConnectX系列以太网卡,在BIOS设置中开启相应选项,并通过驱动程序调整操作系统层面的支持[^2]。 #### 安装必要的软件包 在宿主机上安装QEMU-KVM及相关工具链,这些组件提供了创建和管理KVM实例的能力。命令如下: ```bash sudo apt-get update && sudo apt-get install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager -y ``` #### 启用内核模块 加载`vfio-pci`模块来增强对PCI设备直通的支持,这对于实现高性能I/O至关重要。编辑 `/etc/modules-load.d/vfio.conf` 文件加入以下内容: ```plaintext vfio-pci ``` 重启系统使更改生效。 #### 创建VF (Virtual Function) 利用`ip link set dev <PF> sriov_numvfs=<number>`指令指定要分配给虚拟函数的数量,其中 `<PF>` 是物理功能名称而 `<number>` 表示希望创建多少个虚拟接口[^3]。 例如: ```bash sudo ip link set dev enp8s0f0 sriov_numvfs=4 ``` 这将在选定的物理端口下生成四个新的虚拟网络接口供后续绑定到不同来宾使用。 #### 修改Libvirt XML定义文件 针对目标域(即待部署的虚拟机),修改其XML描述文档中的<devices>/<interface/>部分,指明采用直接模式连接至某个具体的VF。样例片段展示如下: ```xml <domain type='kvm'> ... <devices> ... <interface type='hostdev' managed='yes'> <source> <address type='pci' domain='0x0000' bus='0x0a' slot='0x00' function='0x1'/> </source> <mac address='52:54:00:d9:f7:ca'/> <model type='virtio'/> </interface> ... </devices> </domain> ``` 注意替换上述代码里的 PCI 地址以及MAC地址字段为实际环境下的对应值。 完成以上步骤之后保存改动过的配置文件并通过 `virsh define` 或者图形界面重新导入更新后的设定即可启动具备SR-IOV特性的新虚拟机实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值