Skip to content

KVM: default (libvirt-chosen) cirrus video renders a blank console for Windows Server 2025 Core — default should be vga #13806

Description

@andrijapanicsb

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.

  1. 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.)
  2. 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)

  1. 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
  2. QEMU switched its own default away from cirrus to -vga std in QEMU 2.2 (2014)
    (see QEMU 2.2 changelog).
  3. 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.
  4. 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.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions