feat: add QEMU software emulation fallback for VM testing
VM creation failed with "Emulator does not support virt type 'kvm'" in environments without /dev/kvm (nested VMs, CI, containers). This makes ISO boot testing work everywhere by detecting KVM at runtime. Changes: - vm/template.xml: replace hardcoded type='kvm' and cpu mode='host-passthrough' with @DOMAIN_TYPE@ and @CPU_MODE@ placeholders - run.sh vm_create(): detect /dev/kvm at runtime, use KVM + host-passthrough when available, fall back to QEMU + qemu64 software emulation when not - tests: 6 new tests covering placeholder existence, KVM detection, and substitution logic This enables the ISO to be booted and serial output captured for verification even without hardware virtualization support. 💘 Generated with Crush Assisted-by: GLM-4.7 via Crush <crush@charm.land>
This commit is contained in:
@@ -199,12 +199,26 @@ vm_create() {
|
|||||||
log_warn "This is OK for live ISO testing but not for installation"
|
log_warn "This is OK for live ISO testing but not for installation"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Detect KVM acceleration; fall back to QEMU software emulation
|
||||||
|
local domain_type="qemu"
|
||||||
|
local cpu_mode="qemu64"
|
||||||
|
if [[ -e /dev/kvm ]]; then
|
||||||
|
domain_type="kvm"
|
||||||
|
cpu_mode="host-passthrough"
|
||||||
|
log_info "KVM acceleration enabled"
|
||||||
|
else
|
||||||
|
log_warn "KVM not available (/dev/kvm missing) - using QEMU software emulation"
|
||||||
|
log_warn "VM will be slower but functional for boot testing"
|
||||||
|
fi
|
||||||
|
|
||||||
# Create VM XML from template
|
# Create VM XML from template
|
||||||
local vm_xml="/tmp/${VM_NAME}.xml"
|
local vm_xml="/tmp/${VM_NAME}.xml"
|
||||||
sed -e "s|@VM_NAME@|${VM_NAME}|g" \
|
sed -e "s|@VM_NAME@|${VM_NAME}|g" \
|
||||||
-e "s|@VM_UUID@|${vm_uuid}|g" \
|
-e "s|@VM_UUID@|${vm_uuid}|g" \
|
||||||
-e "s|@VM_RAM@|${VM_RAM}|g" \
|
-e "s|@VM_RAM@|${VM_RAM}|g" \
|
||||||
-e "s|@VM_CPUS@|${VM_CPUS}|g" \
|
-e "s|@VM_CPUS@|${VM_CPUS}|g" \
|
||||||
|
-e "s|@DOMAIN_TYPE@|${domain_type}|g" \
|
||||||
|
-e "s|@CPU_MODE@|${cpu_mode}|g" \
|
||||||
-e "s|@SECURE_BOOT@|${secure_boot}|g" \
|
-e "s|@SECURE_BOOT@|${secure_boot}|g" \
|
||||||
-e "s|@UEFI_CODE@|${uefi_code}|g" \
|
-e "s|@UEFI_CODE@|${uefi_code}|g" \
|
||||||
-e "s|@UEFI_VARS_TEMPLATE@|${uefi_vars}|g" \
|
-e "s|@UEFI_VARS_TEMPLATE@|${uefi_vars}|g" \
|
||||||
|
|||||||
@@ -275,6 +275,34 @@
|
|||||||
grep -q "vm_setup_swtpm" /workspace/run.sh
|
grep -q "vm_setup_swtpm" /workspace/run.sh
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# VM KVM/QEMU Acceleration Fallback
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
@test "VM template has domain type placeholder" {
|
||||||
|
grep -q '@DOMAIN_TYPE@' /workspace/vm/template.xml
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "VM template has CPU mode placeholder" {
|
||||||
|
grep -q '@CPU_MODE@' /workspace/vm/template.xml
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "run.sh detects KVM availability via /dev/kvm" {
|
||||||
|
grep -q '/dev/kvm' /workspace/run.sh
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "run.sh substitutes domain type in VM XML" {
|
||||||
|
grep -q '@DOMAIN_TYPE@' /workspace/run.sh
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "run.sh substitutes CPU mode in VM XML" {
|
||||||
|
grep -q '@CPU_MODE@' /workspace/run.sh
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "run.sh defaults to QEMU emulation when KVM unavailable" {
|
||||||
|
grep -q 'qemu64' /workspace/run.sh
|
||||||
|
}
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# Output Verification
|
# Output Verification
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
|
|||||||
+2
-2
@@ -1,4 +1,4 @@
|
|||||||
<domain type='kvm'>
|
<domain type='@DOMAIN_TYPE@'>
|
||||||
<name>@VM_NAME@</name>
|
<name>@VM_NAME@</name>
|
||||||
<uuid>@VM_UUID@</uuid>
|
<uuid>@VM_UUID@</uuid>
|
||||||
<memory unit='MiB'>@VM_RAM@</memory>
|
<memory unit='MiB'>@VM_RAM@</memory>
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
<apic/>
|
<apic/>
|
||||||
<smm state='on'/>
|
<smm state='on'/>
|
||||||
</features>
|
</features>
|
||||||
<cpu mode='host-passthrough' check='none'/>
|
<cpu mode='@CPU_MODE@' check='none'/>
|
||||||
<clock offset='utc'>
|
<clock offset='utc'>
|
||||||
<timer name='rtc' tickpolicy='catchup'/>
|
<timer name='rtc' tickpolicy='catchup'/>
|
||||||
<timer name='pit' tickpolicy='delay'/>
|
<timer name='pit' tickpolicy='delay'/>
|
||||||
|
|||||||
Reference in New Issue
Block a user