必应网站建设,深圳软件公司招聘,销售crm,宣传片制作协议一、环境说明
操作系统#xff1a;openEuler 22.03CPU#xff1a;Kunpeng-920#xff0c;arm v8cloudstack#xff1a;4.18libvirtd#xff1a;6.2.0
二、问题描述
在UI上创建VPC后#xff0c;平台会同时创建一个virtual router#xff0c;此时virtual router有两个网…一、环境说明
操作系统openEuler 22.03CPUKunpeng-920arm v8cloudstack4.18libvirtd6.2.0
二、问题描述
在UI上创建VPC后平台会同时创建一个virtual router此时virtual router有两个网卡分别为private IP169. 然后在vpc下创建network此时virtual router不会绑定network 创建虚拟机时指定此networkcloudstack报创建失败。
三、问题排查
当在vpc下的network创建第一个虚拟机时cloudstack会先将virtual router绑定至该network其中一个动作是为virtual router附加一个新的网卡作为该network的网关。 但是虚拟机报创建失败后查看virtual router仍只有两个网卡其对应的network name列也是空的。 查看cloudstack management日志发现报错org.libvirt.LibvirtException: internal error: No more available PCI slots。 而对比普通isolated network对应的virtual router的domain内容virsh dumpxml发现vpc下报错的virtual router缺少两个对应pci设备的定义。 通过搜索在github上查看到类似的issue。 其解决方法是在./plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java中添加代码如下 if (_emulator ! null _emulator.endsWith(aarch64)) {devicesBuilder.append(controller typepci modelpcie-root/\n);for (int i 0; i 32; i) {devicesBuilder.append(controller typepci modelpcie-root-port/\n);}devicesBuilder.append(controller typepci modelpcie-to-pci-bridge/\n);}通过_emulator判断为aarch64架构的话就添加32个pci设备。 但是debug查看该值在执行至本段代码是为空字符串且查看上面代码 if (_emulator ! null) {devicesBuilder.append(emulator _emulator /emulator\n);}本地查看虚拟机的domain内容_emulator的值对应为/usr/libexec/qemu-kvm也没有架构后缀。 因此怀疑本段代码没有普适性。 因此将本段代码注释掉修改代码如下
#./plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java 添加一个类
public static class PCIDef {public PCIDeg() {}Overridepublic String toString() {StringBuilder pciBuilder new StringBuilder();devicesBuilder.append(controller typepci modelpcie-root/\n);for (int i 0; i 32; i) {pciBuilder.append(controller typepci modelpcie-root-port/\n);}pciBuilder.append(controller typepci modelpcie-to-pci-bridge/\n);return pciBuilder.toString();}
}#plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java 2553行if (isGuestAarch64()) {createArm64UsbDef(devices);#新增createArm64PCIDef(devices);}#plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java 2580行protected void createArm64PCIDef(DevicesDef devices) {devices.addDevice(new LibvirtVMDef.PCIDef());}