Summary
On KVM, CloudStack does not specify a video model unless vm.video.hardware (agent
property) or the video.hardware VM setting is set. libvirt then falls back to its
x86 default, cirrus — a device QEMU deprecated years ago. With Windows Server 2025
Core, the guest boots fine but the console never renders: LogonUI.exe stays
completely blank (mouse cursor moves, keyboard input incl. Ctrl-Alt-Del is delivered,
qemu-guest-agent works — only the display output is missing). The VM is effectively
unusable via the console.
Switching the same VM to video.hardware=vga renders the logon UI immediately.
Reported against 4.22/4.23-era code; the selection logic is unchanged on main
(LibvirtComputingResource.createVideoDef(): uses vm.video.hardware, default null →
no <video> model emitted → libvirt default cirrus).
Reproduction (A/B on the same VM)
Environment: EL9 KVM host (qemu-kvm 9.x), CloudStack KVM agent, guest = Windows Server
2025 Standard Evaluation, Server Core, UEFI (OVMF), q35, virtio disk/NIC.
- Start the VM with no video setting → libvirt gives
<model type='cirrus' vram='16384'/>.
- Guest boots (qemu-guest-agent responds,
guest-exec works, CPU active).
- Console: LogonUI window frame visible, content area entirely black. Mouse moves,
Ctrl-Alt-Del (sent via console and via virsh send-key) is accepted but nothing
ever paints. (Screenshots available; can attach on request.)
- Stop the VM, set VM setting
video.hardware=vga (+ video.ram=32768), start.
- Same boot, console immediately shows
Press Ctrl-Alt-Del to unlock at high
resolution. (Screenshot available.)
Data point narrowing the scope: a Desktop Experience (full UI) Windows Server 2025
deployed on the same platform renders on cirrus — the total render failure appears
specific to Server Core's minimal logon/display stack. (Cirrus is still limited to
1024x768-ish modes and 16 MB VRAM for every guest.)
Why cirrus is the wrong default in 2026 (references)
- QEMU deprecation warning, emitted live on EL9 when CloudStack starts such a VM:
qemu-kvm: warning: 'cirrus-vga' is deprecated, please use a different VGA card instead
- QEMU switched its own default away from cirrus to
-vga std in QEMU 2.2 (2014)
(see QEMU 2.2 changelog).
- Gerd Hoffmann (QEMU display maintainer), "qemu: using cirrus considered harmful"
(kraxel.org, 2014): 16 MB VRAM ceiling, no modes beyond 1024x768@24bpp, depends on
ancient guest drivers; recommends stdvga for Windows guests.
- Ecosystem defaults: virt-manager/virt-install (via libosinfo) select vga/QXL/virtio
for modern guests; Proxmox VE defaults to std VGA; OpenStack Nova moved its default
video model off cirrus. CloudStack is the outlier by inheriting libvirt's legacy default.
Proposal
- Emit an explicit
<video> model on KVM instead of inheriting libvirt's cirrus default.
vga (standard VBE) is the conservative candidate — every mainstream OS since ~2005
drives it with inbox drivers; virtio-gpu could be opt-in where guest drivers exist.
- A default change needs an OS render matrix (Windows 7/10/11, Server 2016-2025 Core and
Desktop, EL7-9, Ubuntu LTS, FreeBSD) — listing it here explicitly so the scope is clear.
- At minimum until then: document that Windows Server 2025 Core requires
video.hardware=vga, and consider defaulting vga for Windows guest-OS types.
Workarounds (verified)
- Per VM: settings
video.hardware=vga, video.ram=32768 (stopped VM), then start.
- Per host: agent property
vm.video.hardware=vga in agent.properties.
Summary
On KVM, CloudStack does not specify a video model unless
vm.video.hardware(agentproperty) or the
video.hardwareVM setting is set. libvirt then falls back to itsx86 default, cirrus — a device QEMU deprecated years ago. With Windows Server 2025
Core, the guest boots fine but the console never renders:
LogonUI.exestayscompletely blank (mouse cursor moves, keyboard input incl. Ctrl-Alt-Del is delivered,
qemu-guest-agent works — only the display output is missing). The VM is effectively
unusable via the console.
Switching the same VM to
video.hardware=vgarenders the logon UI immediately.Reported against 4.22/4.23-era code; the selection logic is unchanged on main
(
LibvirtComputingResource.createVideoDef(): usesvm.video.hardware, default null →no
<video>model emitted → libvirt default cirrus).Reproduction (A/B on the same VM)
Environment: EL9 KVM host (qemu-kvm 9.x), CloudStack KVM agent, guest = Windows Server
2025 Standard Evaluation, Server Core, UEFI (OVMF), q35, virtio disk/NIC.
<model type='cirrus' vram='16384'/>.guest-execworks, CPU active).Ctrl-Alt-Del (sent via console and via
virsh send-key) is accepted but nothingever paints. (Screenshots available; can attach on request.)
video.hardware=vga(+video.ram=32768), start.Press Ctrl-Alt-Del to unlockat highresolution. (Screenshot available.)
Data point narrowing the scope: a Desktop Experience (full UI) Windows Server 2025
deployed on the same platform renders on cirrus — the total render failure appears
specific to Server Core's minimal logon/display stack. (Cirrus is still limited to
1024x768-ish modes and 16 MB VRAM for every guest.)
Why cirrus is the wrong default in 2026 (references)
qemu-kvm: warning: 'cirrus-vga' is deprecated, please use a different VGA card instead-vga stdin QEMU 2.2 (2014)(see QEMU 2.2 changelog).
(kraxel.org, 2014): 16 MB VRAM ceiling, no modes beyond 1024x768@24bpp, depends on
ancient guest drivers; recommends stdvga for Windows guests.
for modern guests; Proxmox VE defaults to std VGA; OpenStack Nova moved its default
video model off cirrus. CloudStack is the outlier by inheriting libvirt's legacy default.
Proposal
<video>model on KVM instead of inheriting libvirt's cirrus default.vga(standard VBE) is the conservative candidate — every mainstream OS since ~2005drives it with inbox drivers; virtio-gpu could be opt-in where guest drivers exist.
Desktop, EL7-9, Ubuntu LTS, FreeBSD) — listing it here explicitly so the scope is clear.
video.hardware=vga, and consider defaulting vga for Windows guest-OS types.Workarounds (verified)
video.hardware=vga,video.ram=32768(stopped VM), then start.vm.video.hardware=vgainagent.properties.