Skip to content

Commit f043710

Browse files
Fix nic adapater and root disk controller for UEFI VMs
1 parent ae5308b commit f043710

1 file changed

Lines changed: 35 additions & 13 deletions

File tree

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3028,8 +3028,10 @@ public void createVifs(final VirtualMachineTO vmSpec, final LibvirtVMDef vm) thr
30283028
final NicTO[] nics = vmSpec.getNics();
30293029
final Map <String, String> params = vmSpec.getDetails();
30303030
String nicAdapter = "";
3031-
if (params != null && params.get("nicAdapter") != null && !params.get("nicAdapter").isEmpty()) {
3032-
nicAdapter = params.get("nicAdapter");
3031+
if (params != null && params.get(VmDetailConstants.NIC_ADAPTER) != null && !params.get(VmDetailConstants.NIC_ADAPTER).isEmpty()) {
3032+
nicAdapter = params.get(VmDetailConstants.NIC_ADAPTER);
3033+
} else if (MapUtils.isNotEmpty(params) && params.containsKey(GuestDef.BootType.UEFI.toString())) {
3034+
nicAdapter = "e1000";
30333035
}
30343036
Map<String, String> extraConfig = vmSpec.getExtraConfig();
30353037
for (int i = 0; i < nics.length; i++) {
@@ -4383,22 +4385,42 @@ public DiskDef.DiskBus getDataDiskModelFromVMDetail(final VirtualMachineTO vmTO)
43834385
private DiskDef.DiskBus getGuestDiskModel(final String platformEmulator, boolean isUefiEnabled) {
43844386
if (platformEmulator == null) {
43854387
return DiskDef.DiskBus.IDE;
4386-
} else if (platformEmulator.startsWith("Other PV Virtio-SCSI")) {
4387-
return DiskDef.DiskBus.SCSI;
4388-
} else if (platformEmulator.contains("Ubuntu") ||
4388+
}
4389+
4390+
final boolean isLinuxLike = platformEmulator.contains("Ubuntu") ||
43894391
StringUtils.startsWithAny(platformEmulator,
4390-
"Fedora", "CentOS", "Red Hat Enterprise Linux", "Debian GNU/Linux", "FreeBSD", "Oracle",
4391-
"Rocky Linux", "AlmaLinux", "Other PV")) {
4392-
return DiskDef.DiskBus.VIRTIO;
4393-
} else if (isUefiEnabled && StringUtils.startsWithAny(platformEmulator, "Windows", "Other")) {
4394-
return DiskDef.DiskBus.SATA;
4395-
} else if (guestCpuArch != null && guestCpuArch.equals("aarch64")) {
4392+
"Fedora", "CentOS", "Red Hat Enterprise Linux",
4393+
"Debian GNU/Linux", "FreeBSD", "Oracle",
4394+
"Rocky Linux", "AlmaLinux", "Other PV");
4395+
4396+
// Explicit Virtio-SCSI preference
4397+
if (platformEmulator.startsWith("Other PV Virtio-SCSI")) {
4398+
return DiskDef.DiskBus.SCSI;
4399+
}
4400+
4401+
// Architecture-specific handling
4402+
if (guestCpuArch != null && guestCpuArch.equals("aarch64")) {
43964403
return DiskDef.DiskBus.SCSI;
4397-
} else {
4398-
return DiskDef.DiskBus.IDE;
43994404
}
44004405

4406+
// Use SCSI for Linux-based UEFI guests
4407+
if (isUefiEnabled && isLinuxLike) {
4408+
return DiskDef.DiskBus.SCSI;
4409+
}
4410+
4411+
// Windows/Other and UEFI behavior
4412+
if (isUefiEnabled && StringUtils.startsWithAny(platformEmulator, "Windows", "Other")) {
4413+
return DiskDef.DiskBus.SATA;
4414+
}
4415+
4416+
// non-UEFI Linux guests
4417+
if (isLinuxLike) {
4418+
return DiskDef.DiskBus.VIRTIO;
4419+
}
4420+
4421+
return DiskDef.DiskBus.IDE;
44014422
}
4423+
44024424
private void cleanupVMNetworks(final Connect conn, final List<InterfaceDef> nics) {
44034425
if (nics != null) {
44044426
for (final InterfaceDef nic : nics) {

0 commit comments

Comments
 (0)