joatandev

← Back to blog

Windows 11 VM on Omarchy (Arch) — setup summary and issues

· 3 min read

I set up a Windows 11 guest on Omarchy (Arch-based) with QEMU/KVM and virt-manager, primarily for Visual Studio 2022, WinForms, and other Windows-only tooling. No GPU passthrough — VirtIO and SPICE are enough for desktop responsiveness.

This post is a setup record and a troubleshooting log for the networking problems that took the longest to sort out.

Host and VM configuration

ItemValue
Host OSOmarchy (Arch-based)
HypervisorQEMU/KVM
Managervirt-manager
Libvirt connectionSystem (sudo virsh required)
VM namewin11
FirmwareUEFI (OVMF)
CPUhost-passthrough, 6 vCPUs
RAM12 GB
Disk128 GB qcow2
NetworkVirtual network default

Windows 11 installed successfully. The NIC was later switched from e1000e to virtio after the guest tools were in place.

Problems encountered

1. No network during Windows setup

Windows could not finish OOBE without Internet. From the setup screen:

  1. Shift + F10 to open a command prompt
  2. Run OOBE\BYPASSNRO
  3. Restart and continue offline

That cleared the network requirement so install could finish.

2. DHCP not working

After boot the guest showed a link-local address (169.254.x.x), and ipconfig /renew hung forever.

On the host, the usual pieces looked fine:

sudo virsh net-list --all
# default  active  yes

ip addr show virbr0
# 192.168.122.1/24

sudo ss -lunp | grep :67
# dnsmasq listening

So libvirt’s default network and DHCP daemon were up, but the guest still got nothing useful.

3. UFW blocked DHCP

Allowing DHCP on the libvirt bridge fixed address assignment immediately:

sudo ufw allow in on virbr0 to any port 67 proto udp

The VM then received a 192.168.122.x address.

4. DHCP worked, Internet did not

With a lease, ping 1.1.1.1 still failed. Disabling the firewall made outbound traffic work instantly:

sudo ufw disable

UFW was clearly interfering with libvirt NAT/forwarding, not just DHCP.

5. UFW forward and NAT rules

I changed /etc/default/ufw:

DEFAULT_FORWARD_POLICY="ACCEPT"

and added a MASQUERADE rule in /etc/ufw/before.rules for the default libvirt subnet out through the host Wi‑Fi interface:

*nat
:POSTROUTING ACCEPT [0:0]

-A POSTROUTING -s 192.168.122.0/24 -o wlan0 -j MASQUERADE

COMMIT

Then re-enabled UFW. Connectivity was still inconsistent.

6. Bridge issue: vnet not enslaved to virbr0

While the VM was running:

sudo virsh domiflist win11
# interface: vnet3

but the bridge itself looked dead:

ip addr show virbr0
# NO-CARRIER, state DOWN

sudo bridge link
# vnet3 was NOT listed as master virbr0

The tap device existed, yet it was not attached to virbr0. That explains why NAT/firewall tweaks alone felt flaky — the guest was not actually on the bridge.

7. Manual bridge attachment

Enslaving the tap device fixed it immediately:

sudo ip link set vnet3 master virbr0

virbr0 went LOWER_UP, and networking started working. The remaining host-side question is why libvirt is not automatically attaching vnetX to virbr0 after certain network/firewall changes.

VirtIO

Downloaded virtio-win.iso, ran virtio-win-guest-tools.exe inside the guest, then changed the NIC model from e1000e to virtio. Drivers installed cleanly and networking continued to work.

Current status

Working:

  • Windows 11
  • Internet
  • VirtIO NIC
  • VirtIO guest tools
  • KVM acceleration

Outstanding:

The vnetX interface sometimes needs a manual ip link set … master virbr0 after network or firewall changes. That attachment should be automatic via libvirt, so there is likely a host-side issue involving libvirt, bridge handling, or firewall interaction still to investigate.

Goal for this VM

Primary use:

  • Visual Studio 2022
  • WinForms development
  • .NET development
  • General Windows-only tooling

No GPU passthrough planned; good desktop responsiveness with VirtIO/SPICE is enough.