Virt-install fails with machine type q35

I recently got a Beelink mini-PC. For the size and price it’s pretty powerful; 32Gb RAM, 1TB SSD, AMD Ryzen 7 5700U. Definitely enough to spin up a few test VMs to play with things. So I installed Rocky9 and the virtualization group. I copied over some VM images from an older machine, and it worked! Yay!

Today I noticed the pc machine type was deprecated and we should be using q35. So I thought I’d try a new build.

virt-install --noreboot \
             -n ttt \
             -r 4096 \
             --vcpus=1 \
             --os-variant=rocky9 \
             --machine q35 \
             --accelerate \
             -v '--network=bridge=br-lan,target=v-ttt' \
             --disk path=/dev/SSD/vm.ttt \
             -l https://dl.rockylinux.org/pub/rocky/9/BaseOS/x86_64/kickstart/ \
             --nographics \
             -x 'inst.ks=http://10.0.0.137/CentOS/kickstart/rocky9.cfg ksdevice=ens2 ip=dhcp console=ttyS0,9600'

This starts off well enough but then…

[  OK  ] Reached target System Initialization.
[  OK  ] Reached target Basic System.
[    6.087558] IPv6: ADDRCONF(NETDEV_CHANGE): enp1s0: link becomes ready
[***   ] A start job is running for nm-wait-�ne-initrd.service (16s / no limit)

It hangs here for a long time… eventually it moves on

[  OK  ] Finished nm-wait-online-initrd.service.
         Starting dracut initqueue hook...

And it hangs here again. Eventually it fails

[  199.704567] dracut-initqueue[1054]: Warning: dracut-initqueue: timeout, still waiting for following initqueue hooks:
[  199.707335] dracut-initqueue[1054]: Warning: /lib/dracut/hooks/initqueue/finished/devexists-\x2fdev\x2froot.sh: "[ -e "/dev/root" ]"
[  199.709730] dracut-initqueue[1054]: Warning: /lib/dracut/hooks/initqueue/finished/kickstart.sh: "[ -e /tmp/ks.cfg.done ]"
[  199.712005] dracut-initqueue[1054]: Warning: /lib/dracut/hooks/initqueue/finished/nm.sh: "[ -f /tmp/nm.done ]"
[  199.714195] dracut-initqueue[1054]: Warning: /lib/dracut/hooks/initqueue/finished/wait_for_disks.sh: "[ "$main_loop" -ge "10" ]"
[  199.716576] dracut-initqueue[1054]: Warning: /lib/dracut/hooks/initqueue/finished/wait_for_settle.sh: "[ -f /tmp/settle.done ]"
[  199.719097] dracut-initqueue[1054]: Warning: dracut-initqueue: starting timeout scripts

And lots more errors follow.

Now if I use the older pc-i440fx-rhel7.6.0 machine type then the bulld completes and everything is happy.

Even more odd, if I then virsh edit the XML file and change the machine type (and the associated pci definition to pci)

    <type arch='x86_64' machine='q35'>hvm</type>
...
    <controller type='pci' index='0' model='pcie-root'/>

then the new VM still boots cleanly.

So it appears to be only on initial install that the hang occurs.

Any ideas why?

For complete reference, the kickstart file is pretty simple; most of it isn’t relevant to the problem because we’re not even getting that far!

text
url --url https://dl.rockylinux.org/pub/rocky/9/BaseOS/x86_64/os
repo --name=AppStream --mirrorlist https://mirrors.rockylinux.org/mirrorlist?repo=AppStream-9&arch=x86_64

poweroff

lang en_US.UTF-8
keyboard us

network --onboot yes --device eth0 --bootproto dhcp --ipv6 auto

rootpw  --iscrypted $6$Tyeahyeahyeah
firewall --disabled 
selinux --disabled  

timezone --utc America/New_York

zerombr
clearpart --all --initlabel
part /boot --fstype=ext4 --asprimary --size=1024
part swap --asprimary --size=1024
part / --fstype=ext4 --asprimary --grow --size=1

%packages
@^minimal-environment
wget
ksh
dos2unix
logwatch
tar
postfix
bind-utils
bc
-iw*-firmware
%end

%addon com_redhat_kdump --disable --reserve-mb='auto'
%end

I have used (am still using) virt-manager for VM creation on libvirt.
On AlmaLinux 9 host it shows the two chipsets and six firmware options:

  • BIOS
  • UEFI
  • UEFI OVMF_CODE.secboot
  • UEFI OVMF_CODE
  • UEFI OVMF.amdsev
  • UEFI OVMF.inteltdx

(The “UEFI” seems to be alias for UEFI OVMF_CODE.secboot)
Of the q35 guests that I have only one is with “BIOS” and that VM definition was
manually edited from i440fx (like you did) as it had been defined on CentOS 7 host.

I don’t recall seeing the dracut issues on my UEFI (OVMF_CODE) guests,
but have seen it with installer somewhere. The issue is probably on boot, before
Anaconda processes the kickstart file.

Hmm, setting eufi is worth a try…

--machine q35 --boot uefi

Different error message, but same failure point! A 60 second pause at nm-wait-online-initrd and then…

[  OK  ] Finished nm-wait-online-initrd.service.
         Starting dracut initqueue hook...
[   65.074699] systemd-gpt-auto-generator[1077]: EFI loader partition unknown, exiting.
[   65.074701] systemd-gpt-auto-generator[1077]: (The boot loader did not set EFI variable LoaderDevicePartUUID.)

and finally back to the same errors

[  200.068408] dracut-initqueue[1056]: Warning: dracut-initqueue: timeout, still waiting for following initqueue hooks:
[  200.071708] dracut-initqueue[1056]: Warning: /lib/dracut/hooks/initqueue/finished/devexists-\x2fdev\x2froot.sh: "[ -e "/dev/root" ]"