From f043710ccbf15db7c10c5c16d6c1ae2675802b24 Mon Sep 17 00:00:00 2001 From: Harikrishna Patnala Date: Wed, 6 May 2026 16:19:43 +0530 Subject: [PATCH] Fix nic adapater and root disk controller for UEFI VMs --- .../resource/LibvirtComputingResource.java | 48 ++++++++++++++----- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java index 054ef44bbe74..82a953152273 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java @@ -3028,8 +3028,10 @@ public void createVifs(final VirtualMachineTO vmSpec, final LibvirtVMDef vm) thr final NicTO[] nics = vmSpec.getNics(); final Map params = vmSpec.getDetails(); String nicAdapter = ""; - if (params != null && params.get("nicAdapter") != null && !params.get("nicAdapter").isEmpty()) { - nicAdapter = params.get("nicAdapter"); + if (params != null && params.get(VmDetailConstants.NIC_ADAPTER) != null && !params.get(VmDetailConstants.NIC_ADAPTER).isEmpty()) { + nicAdapter = params.get(VmDetailConstants.NIC_ADAPTER); + } else if (MapUtils.isNotEmpty(params) && params.containsKey(GuestDef.BootType.UEFI.toString())) { + nicAdapter = "e1000"; } Map extraConfig = vmSpec.getExtraConfig(); for (int i = 0; i < nics.length; i++) { @@ -4383,22 +4385,42 @@ public DiskDef.DiskBus getDataDiskModelFromVMDetail(final VirtualMachineTO vmTO) private DiskDef.DiskBus getGuestDiskModel(final String platformEmulator, boolean isUefiEnabled) { if (platformEmulator == null) { return DiskDef.DiskBus.IDE; - } else if (platformEmulator.startsWith("Other PV Virtio-SCSI")) { - return DiskDef.DiskBus.SCSI; - } else if (platformEmulator.contains("Ubuntu") || + } + + final boolean isLinuxLike = platformEmulator.contains("Ubuntu") || StringUtils.startsWithAny(platformEmulator, - "Fedora", "CentOS", "Red Hat Enterprise Linux", "Debian GNU/Linux", "FreeBSD", "Oracle", - "Rocky Linux", "AlmaLinux", "Other PV")) { - return DiskDef.DiskBus.VIRTIO; - } else if (isUefiEnabled && StringUtils.startsWithAny(platformEmulator, "Windows", "Other")) { - return DiskDef.DiskBus.SATA; - } else if (guestCpuArch != null && guestCpuArch.equals("aarch64")) { + "Fedora", "CentOS", "Red Hat Enterprise Linux", + "Debian GNU/Linux", "FreeBSD", "Oracle", + "Rocky Linux", "AlmaLinux", "Other PV"); + + // Explicit Virtio-SCSI preference + if (platformEmulator.startsWith("Other PV Virtio-SCSI")) { + return DiskDef.DiskBus.SCSI; + } + + // Architecture-specific handling + if (guestCpuArch != null && guestCpuArch.equals("aarch64")) { return DiskDef.DiskBus.SCSI; - } else { - return DiskDef.DiskBus.IDE; } + // Use SCSI for Linux-based UEFI guests + if (isUefiEnabled && isLinuxLike) { + return DiskDef.DiskBus.SCSI; + } + + // Windows/Other and UEFI behavior + if (isUefiEnabled && StringUtils.startsWithAny(platformEmulator, "Windows", "Other")) { + return DiskDef.DiskBus.SATA; + } + + // non-UEFI Linux guests + if (isLinuxLike) { + return DiskDef.DiskBus.VIRTIO; + } + + return DiskDef.DiskBus.IDE; } + private void cleanupVMNetworks(final Connect conn, final List nics) { if (nics != null) { for (final InterfaceDef nic : nics) {