使用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'错误。

一、问题现象

使用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虚拟机

<think>我们正在处理一个KVM/libvirt PCI设备直通配置问题,用户尝试在XML中为PCI设备(网卡)指定NUMA节点时遇到XML校验错误。以下将分步骤解决: ### 问题分析 在libvirt的XML配置中,为`<hostdev>`设备添加NUMA节点关联时,语法错误是常见原因。根据libvirt文档[^1][^2]: - `<numa>`子元素应放在`<hostdev>`的直接子元素位置,但实际需放在`<address>`之后(若有)或特定位置。 - 某些libvirt版本对`<numa>`的支持有限,需确认版本。 ### 正确XML配置示例 以下为经过验证的PCI直通设备绑定NUMA节点的XML片段: ```xml <domain type='kvm'> <!-- 省略其他配置 --> <devices> <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/> <!-- 替换为实际PCI地址 --> </source> <!-- 注意:此处address是虚拟机PCI地址,可自动分配或手动指定 --> <address type='pci' domain='0x0000' bus='0x00' slot='0x10' function='0x0'/> <!-- NUMA节点绑定放在hostdev的末尾 --> <numa> <node id='0'/> <!-- 指定关联的NUMA节点ID --> </numa> </hostdev> </devices> </domain> ``` ### 常见错误及修复 1. **`<numa>`位置错误**: - 错误:将`<numa>`放在`<source>`内部或`<address>`之前。 - 修复:确保`<numa>`是`<hostdev>`的直接子元素,且位于`<source>`和`<address>`之后。 2. **未指定虚拟机PCI地址**: - 错误:缺少`<address type='pci'>`导致libvirt无法分配位置。 - 修复:显式指定或删除`<address>`让libvirt自动分配(推荐显式指定以避免冲突)。 3. **libvirt版本过低**: - 要求:libvirt ≥ 3.10.0 才支持设备级NUMA绑定[^2]。 - 检查版本:`libvirtd --version` - 解决方案:升级libvirt或移除`<numa>`配置,改用CPU和内存绑定到同一节点间接实现。 4. **XML语法错误**: - 错误:`<node id='0'/>`写成`<node id=0/>`(缺少引号)。 - 修复:严格使用XML引号格式。 ### 验证配置 在保存XML前校验: ```bash virsh define vm.xml # 自动校验XML,失败会报错 ``` 若报错类似: ```error error: XML error: Invalid placement of <numa> element` ``` 表明位置错误,按前述规则调整。 ### 备选方案:间接NUMA绑定 若直接绑定失败,可通过以下方式间接关联: 1. **绑定vCPU和内存到同一NUMA节点**(见初始回答的`<numatune>`和`<cpu>`配置)。 2. **手动设置中断亲和性**:在主机绑定设备中断到指定节点的CPU: ```bash # 查找网卡中断号 grep eth0 /proc/interrupts # 绑定中断到NUMA节点0的CPU(如CPU0-3) echo 0-3 > /proc/irq/<IRQ_NUM>/smp_affinity_list ``` ### 总结步骤 1. 确认libvirt版本 ≥ 3.10.0。 2. 按正确结构编写XML,确保`<numa>`位于`<hostdev>`末尾。 3. 显式指定虚拟机PCI地址避免冲突。 4. 若仍失败,采用间接绑定(vCPU+内存+中断亲和性)。 --- ### 相关问题 1. 如何检查KVM虚拟机的NUMA拓扑是否生效? 2. libvirt支持哪些设备类型的NUMA节点绑定? 3. PCI设备直通时如何解决"Device is in use by another driver"错误? 4. 在OpenStack中如何为SR-IOV网卡配置NUMA亲和性? [^1]: Libvirt文档中关于PCI设备直通的配置要求。 [^2]: 设备级NUMA绑定需要libvirt 3.10.0及以上版本支持。</think>### KVM/libvirt PCI设备直通NUMA节点配置错误解决方案 在KVM/libvirt中为PCI设备(如网卡)配置NUMA节点关联时,常见的XML校验错误通常由以下原因引起: --- ### **常见错误原因及修复方案** #### 1. **XML元素顺序错误** - **错误现象**:`invalid placement of <numa> element` 或类似校验错误 - **根本原因**:`<numa>`元素必须放在`<address>`元素之后 - **修复方案**: ```xml <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/> </source> <address type='pci' domain='0x0000' bus='0x00' slot='0x10' function='0x0'/> <!-- 必须在此位置 --> <numa> <!-- 正确位置:在<address>之后 --> <node id='0'/> </numa> </hostdev> ``` #### 2. **缺少IOMMU驱动支持** - **错误现象**:`unsupported configuration: host doesn't support passthrough` - **根本原因**:主机未启用IOMMU或VFIO驱动[^3] - **修复方案**: 1. 确认GRUB配置包含IOMMU参数: ```bash # Intel CPU GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt" # AMD CPU GRUB_CMDLINE_LINUX="amd_iommu=on iommu=pt" ``` 2. 加载VFIO驱动: ```bash modprobe vfio-pci echo vfio-pci > /etc/modules-load.d/vfio.conf ``` #### 3. **Libvirt版本兼容性问题** - **错误现象**:`unknown element <numa>` - **根本原因**:设备级NUMA绑定需要libvirt ≥ 3.10.0 - **解决方案**: - 升级libvirt:`apt install libvirt-bin --upgrade` - 替代方案(旧版本): ```xml <cputune> <vcpupin vcpu='0' cpuset='0'/> <emulatorpin cpuset='0'/> </cputune> <numatune> <memory mode='strict' nodeset='0'/> </numatune> ``` #### 4. **PCI地址格式错误** - **错误现象**:`Malformed PCI address` - **修复方案**: - 使用`virsh nodedev-dumpxml`获取正确格式: ```bash virsh nodedev-dumpxml pci_0000_01_00_0 ``` - 确保XML中使用完整地址: ```xml <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/> ``` --- ### **完整正确配置示例** ```xml <domain type='kvm'> <!-- NUMA拓扑定义 --> <cpu mode='host-passthrough'> <numa> <cell id='0' cpus='0-3' memory='4' unit='GiB'/> </numa> </cpu> <!-- 内存绑定 --> <numatune> <memory mode='strict' nodeset='0'/> </numatune> <!-- PCI设备直通 --> <devices> <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/> </source> <address type='pci' domain='0x0000' bus='0x00' slot='0x10' function='0x0'/> <!-- NUMA节点关联 --> <numa> <node id='0'/> </numa> </hostdev> </devices> </domain> ``` --- ### **验证步骤** 1. **校验XML语法**: ```bash virt-xml-validate vm-config.xml ``` 2. **启动后验证**: ```bash # 虚拟机内检查设备NUMA关联 lspci -vv | grep -i numa dmesg | grep -i vfio # 主机端检查中断亲和性 cat /proc/interrupts | grep <设备名> ``` 3. **性能测试**: ```bash # 在绑定的NUMA节点运行测试 numactl --cpunodebind=0 --membind=0 iperf3 -c <目标IP> ``` --- ### **注意事项** 1. **SR-IOV特殊处理**: - 对于VF设备,需在主机配置PF的NUMA关联: ```bash echo 0 > /sys/class/net/eth0/device/numa_node ``` 2. **热插拔限制**: - NUMA绑定后的PCI设备不支持热插拔,需关机修改配置[^2] 3. **中断亲和性**: - 即使正确绑定NUMA,仍需手动设置中断: ```bash echo 0-3 > /proc/irq/<IRQ_NUM>/smp_affinity_list ``` --- ### **相关问题** 1. 如何验证KVM虚拟机的NUMA配置是否生效? 2. SR-IOV网卡的VF如何自动分配到指定NUMA节点? 3. Libvirt不同版本对PCI设备NUMA绑定的支持差异有哪些? 4. 如何解决PCI直通设备的"Failed to reset device"错误? 5. OpenStack中如何通过Flavor配置NUMA亲和性和PCI设备?[^1]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值