diff --git a/cmd/create.go b/cmd/create.go index ce2cadd..6bea0e7 100644 --- a/cmd/create.go +++ b/cmd/create.go @@ -412,12 +412,17 @@ func runKubevirtCreate(name string) error { } opts := types.CreateOpts{ - Name: name, - Namespace: ns, - Mem: createMem, - CPU: createCPU, - Disk: createDisk, - ISO: iso, + Name: name, + Namespace: ns, + Mem: createMem, + CPU: createCPU, + Disk: createDisk, + ISO: iso, + // --firmware was honoured only by the QEMU paths, so a KubeVirt ISO + // install always got SeaBIOS and a UEFI-only ISO (Utah, Dakota) found + // nothing to boot. Opt-in here: changing the KubeVirt default would + // re-firmware every existing catalog image. + UEFI: createFirmware == "uefi", ContainerDisk: containerDisk, ImportURL: importURL, PVC: createPVC, diff --git a/pkg/kubevirt/bootc.go b/pkg/kubevirt/bootc.go index d47a5da..eb7bf59 100644 --- a/pkg/kubevirt/bootc.go +++ b/pkg/kubevirt/bootc.go @@ -481,6 +481,12 @@ write_files: # empty NVRAM, so it needs the removable fallback path EFI/BOOT/BOOTX64.EFI # — that's exactly what --generic-image adds (and it skips firmware changes). COMPOSEFS=0; FS=xfs; BACKEND=--generic-image + # bootc formats the root with the image's own mkfs, so an image that + # ships no xfsprogs (Hummingbird-based desktops carry btrfs-progs + # only) fails "Creating rootfs: No such file or directory" on xfs. + if ! imghas /usr/sbin/mkfs.xfs && ! imghas /usr/bin/mkfs.xfs; then + if imghas /usr/sbin/mkfs.btrfs || imghas /usr/bin/mkfs.btrfs; then FS=btrfs; fi + fi fi echo "CORRAL_COMPOSEFS=$COMPOSEFS FS=$FS" podman run --rm --privileged --pid=host --security-opt label=type:unconfined_t \ diff --git a/pkg/kubevirt/manifests.go b/pkg/kubevirt/manifests.go index 9c17e05..fd57cb6 100644 --- a/pkg/kubevirt/manifests.go +++ b/pkg/kubevirt/manifests.go @@ -143,6 +143,12 @@ func GenerateVM(opts types.CreateOpts) map[string]any { "interfaces": []map[string]any{ {"name": "default", "masquerade": map[string]any{}}, }, + // An absolute pointer, so VNC clicks land where they are aimed. + // The default PS/2 mouse is relative: a VNC client's absolute + // coordinates drift, and installers cannot be driven by pointer. + "inputs": []map[string]any{ + {"type": "tablet", "bus": "usb", "name": "tablet"}, + }, }, } if opts.UEFI {