Strip `nomodeset nofb gfxpayload=text` from GRUB cmdline so virtio/KMS GPUs probe (BM-emulator + fake-GPU)
Nobody has claimed this yet.
Assessment
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Newbie friendliness
- 55/100
- Issue type
- Bug
- Clarity
- Mostly clear
- Activity status
- Quiet
- Tech stack
- linux, shell, ubuntu
- Domain
- build-system, infrastructure, operating-systems
Research direction
Inspect the relevant diskimage-builder element's finalise.d scripts and search for where GRUB_CMDLINE_LINUX_DEFAULT is set. Check /etc/default/grub and the update-grub step, then build an Ubuntu 22.04 image and verify that the three flags are absent so KMS and virtio_gpu can probe successfully.
Written by the indexing model from the issue text.
Description
Summary
The Ubuntu 22.04 kube images produced by this repo (verified up through release 2026.04-6, ubuntu-22.04-v1.34.7.qcow2) ship with GRUB_CMDLINE_LINUX_DEFAULT containing:
nomodeset nofb gfxpayload=text
These flags tell the Linux kernel to refuse loading any KMS GPU driver. That is fine for headless serial-console-only servers, but it breaks any workload that expects a working /dev/dri/cardN, including:
- BM hosts (or BM-emulator VMs) with a virtio-gpu / virtio-vga device attached.
- Any device-plugin that advertises GPU character devices (e.g.
squat/generic-device-pluginexposing/dev/dri/card*asvexxhost.com/fake-gpu, or NVIDIA's plugin in environments where the host exposes a virtual GPU via virtio).
Reproduction (downstream consumer)
In Atmosphere's ironic_emulator_nodes BM-on-Ironic test rig (vexxhost/atmosphere, branch bm-mcapi-fixes):
- Boot a Magnum/CAPI cluster onto BM-emulator nodes whose libvirt domains include a virtio-vga device, using image
ubuntu-2204-kube-v1.34.7-rawfrom this repo's release2026.04-6. - Apply a fake-GPU device-plugin DaemonSet that watches
/dev/dri/card*. - Observed on every worker:
dmesg | grep -i virtio_gpushowsvirtio_gpu: probe failed with error -22./dev/driis empty — nocard0device file.kubectl get nodes -o jsonpath='{...allocatable.vexxhost\.com/fake-gpu}'returns0on every node.- Pods requesting
vexxhost.com/fake-gpustayPendingindefinitely.
Workaround in use today
We do this on each worker after the cluster is up:
nsenter -t 1 -m -u -i -n -p \
sed -i 's/ nomodeset//g; s/ nofb//g; s/ gfxpayload=text//g' /etc/default/grub
nsenter -t 1 -m -u -i -n -p update-grub
nsenter -t 1 -m -u -i -n -p systemctl --no-block reboot
After reboot, virtio_gpu probes successfully, /dev/dri/card0 appears, and the device-plugin advertises vexxhost.com/fake-gpu=1. Demo pod sees 06:00.0 VGA compatible controller: Red Hat, Inc. Virtio 1.0 GPU (rev 01) and /dev/dri/card0.
This is reliable but has obvious downsides: privileged in-cluster mutation, requires a reboot, and has to be re-applied on every new node (autoscaler, scale-up, rolling upgrade replacing a worker).
Proposed fix
At image-build time, strip the three flags before update-grub:
sed -i 's/ nomodeset//g; s/ nofb//g; s/ gfxpayload=text//g' /etc/default/grub
update-grub
Most natural place is in the relevant DIB element's finalise.d (or wherever GRUB_CMDLINE_LINUX_DEFAULT is currently being set with these flags). If the flags are coming from the upstream Ubuntu cloud image base (i.e. not added by an element here) we can just unconditionally normalise them in a cluster-api-vexxhost-style finalise script.
If keeping the flags is desirable for some "headless serial-only" target, gate behind a build env var (e.g. DIB_DISABLE_KMS=1), default to enabling KMS.
Why "BM GPU" rather than just "fake-GPU"
The same issue will hit any consumer that expects a working DRM device on the kube nodes — virtio-vga in BM-emulator rigs, real GPUs passed through via VFIO on real BM hosts, virgl/QXL in nested-virt CI, etc. The fix is the same regardless of which GPU is attached: don't tell the kernel to refuse KMS in the first place.
References
- Downstream gap tracking + workaround:
vexxhost/atmosphereroles/ironic_emulator_nodes/README.md— "Stripnomodesetfrom the image's GRUB cmdline — gap #20" - Tested image:
ubuntu-22.04-v1.34.7.qcow2from release2026.04-6of this repo.
Happy to send a PR if there's agreement on the approach.
- Dominant language
- Shell
- Stars
- 12
- Forks
- 9
- Avg merge
- 1m
- Merged PRs (30d)
- 4
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from vexxhost/capo-image-elements
-
Dependency Dashboard Open
Difficulty 4/5 3-5 days Newbie friendliness 20/100
All issues in vexxhost/capo-image-elements
Similar issues
-
Update Vish to 1.1.5 Openpackage-update
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
oSoWoSo/vOid_Community_repOsitory#144 · 1 comment ·
-
help wanted new command
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
tldr-pages/tldr#24151 ·
-
PacReq: Rune IDE Openpackage request
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
pacstall/pacstall-programs#9402 ·
-
[BUG] ci: the first prefetch-images.sh call runs before shard.txt exists, so it is always a no-op Openbug github-actions
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
-
update-request
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
msys2/MINGW-packages#31768 ·