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

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions