How to run Windows 11 on Incus under Arch Linux
This guide shows how to create a Windows 11 virtual machine in Incus, using Arch Linux as the host operating system.
By the end, you will have:
- Windows 11 running with KVM acceleration;
- UEFI firmware and Secure Boot;
- a virtual TPM 2.0 device;
- VirtIO networking and devices;
- a graphical console through SPICE;
- commands to start, stop, resize, and delete the VM.
This procedure assumes an
x86_64computer with hardware virtualization support. On Intel processors, this feature is usually called VT-x; on AMD processors, it is usually called AMD-V or SVM.
1. Check processor virtualization support
Check whether the processor reports virtualization support:
lscpu | grep -E 'Virtualization|Virtualização'You can also search directly for the processor extensions:
grep -Eoc '(vmx|svm)' /proc/cpuinfoA result greater than 0 indicates that the processor provides the required extension.
Check whether the KVM device exists:
ls -l /dev/kvmIf /dev/kvm does not exist, verify that virtualization is enabled in UEFI/BIOS and load the module corresponding to your processor:
# Intel
sudo modprobe kvm_intel
# AMD
sudo modprobe kvm_amdTo confirm that the modules are loaded:
lsmod | grep kvm2. Install Incus and the graphical client
Update the system and install Incus and virt-viewer:
sudo pacman -Syu incus virt-viewerThe virt-viewer package provides the remote-viewer command, which Incus uses to open the virtual machine's graphical SPICE console.
Enable the Incus socket:
sudo systemctl enable --now incus.socketTo start instances configured for automatic startup during boot, also enable the service:
sudo systemctl enable incus.service3. Allow your user to manage Incus
Add your user to the incus-admin group:
sudo usermod -aG incus-admin "$USER"Membership in this group grants administrative privileges equivalent to root over Incus. Log out of the graphical session and log back in to apply the new group membership.
To apply it temporarily in the current terminal, you can also use:
newgrp incus-adminTest access:
incus info4. Initialize Incus
Run the configuration wizard:
incus admin initFor a simple local installation, these choices are usually appropriate:
Would you like to use clustering? no
Would you like to configure a new storage pool? yes
Name of the new storage pool: default
Name of the storage backend: dir
Would you like to create a new local network bridge? yes
Name of the new bridge: incusbr0
IPv4 address: auto
IPv6 address: auto
Would you like the server to be available over the network? no
Would you like stale cached images to be updated automatically? yes
Would you like a YAML "init" preseed to be printed? noChoosing the storage backend
The dir backend is simple and works well for testing. For frequent use, snapshots, and better volume management, you can choose btrfs, lvm, or zfs, provided the host is already prepared for it.
Check the configuration that was created:
incus storage list
incus network list
incus profile show default5. Download the required images
Create a directory for the ISO files:
mkdir -p "$HOME/VMs/iso"
cd "$HOME/VMs/iso"Windows 11 ISO
Download the official Windows 11 ISO from Microsoft's website and save it, for example, as:
~/VMs/iso/Windows11.isoThis guide assumes the x86_64 edition of Windows 11 on an x86_64 Arch Linux host.
VirtIO driver ISO
Download the stable VirtIO driver image maintained by the Fedora project:
curl -L \
-o "$HOME/VMs/iso/virtio-win.iso" \
https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.isoVirtIO drivers are primarily used for networking, storage, memory ballooning, and other paravirtualized devices.
6. Create the Windows 11 VM
Create an empty virtual machine named win11:
incus init win11 --empty --vmTell Incus that the guest operating system is Windows:
incus config set win11 image.os=WindowsThis makes Incus adjust Windows-specific details such as the local-time hardware clock, compatible devices, and IOMMU behavior.
Set the VM resources:
incus config set win11 limits.cpu=4
incus config set win11 limits.memory=8GiBIncrease the main disk to 80 GiB:
incus config device override win11 root size=80GiBReasonable minimum values:
| Resource | Practical minimum | Recommended |
|---|---|---|
| CPU | 2 cores | 4 or more |
| Memory | 4 GiB | 8 GiB or more |
| Disk | 64 GiB | 80–128 GiB |
7. Add a virtual TPM 2.0 device
Windows 11 normally requires TPM 2.0. Incus provides a software-emulated TPM:
incus config device add win11 vtpm tpmFor virtual machines, do not use
path=/dev/tpm0. That option is intended for exposing TPM devices to containers. The VM uses the virtual TPM created and managed by Incus itself.
Check whether the device was added:
incus config device show win118. Configure UEFI and Secure Boot
Incus VMs use UEFI. Keep Secure Boot enabled:
incus config set win11 security.secureboot=trueOn most recent installations, this is already the default behavior. The command makes the setting explicit.
9. Attach the ISO files
Attach the Windows ISO with the higher boot priority:
incus config device add win11 windows-iso disk \
source="$HOME/VMs/iso/Windows11.iso" \
readonly=true \
boot.priority=10Also attach the VirtIO driver ISO:
incus config device add win11 virtio-iso disk \
source="$HOME/VMs/iso/virtio-win.iso" \
readonly=true \
boot.priority=5Check the complete configuration:
incus config show win11 --expanded10. Start the installation
Start the VM:
incus start win11Open the graphical console:
incus console win11 --type=vgaWhen the screen asks you to press a key to boot from the installation media, press any key.
In
remote-viewer, pressCtrl+Altto release the keyboard and mouse captured by the VM window.
11. Install Windows 11
Follow the installer normally.
If the installer does not show the disk
In recent Incus versions, the main disk is usually presented through a controller that the Windows installer recognizes. If no drive appears:
- Click Load driver;
- open the
virtio-winISO drive; - locate the folder compatible with Windows 11
amd64; - try the
vioscsistorage driver first; - if necessary, try
viostor.
The paths usually look similar to:
vioscsi\w11\amd64
viostor\w11\amd64The directory structure may vary slightly between VirtIO ISO versions.
If the installer requires an internet connection
The VirtIO network adapter may not have a driver yet. There are two options.
Option A: load the network driver
In the installer, load the driver located approximately at:
NetKVM\w11\amd64Option B: create a local account during installation
On the network requirement screen, press:
Shift + F10In the terminal, run:
OOBE\BYPASSNROThe VM will restart. After that, the installer may show an option to continue without internet access.
This command belongs to the Windows installer and may change or stop working in future releases. Prefer installing the
NetKVMdriver whenever possible.
12. Install all VirtIO drivers
After signing in to Windows:
- open File Explorer;
- open the VirtIO driver CD/DVD drive;
- run the installer available in the root directory, usually
virtio-win-guest-tools.exe; - complete the installation;
- restart Windows.
This package installs the main VirtIO drivers and helper tools.
After restarting, check Device Manager. No important devices should remain with a yellow warning icon.
13. Install the Incus agent in Windows
The agent allows commands such as incus exec, incus file push, and incus file pull to work inside the VM.
Add the agent configuration disk:
incus config device add win11 agent disk source=agent:configRestart the VM:
incus restart win11In Windows, open the new CD drive associated with Incus and run the agent installer available on it. Then restart the system again.
Check it from the host:
incus info win11When the agent is active, Incus will be able to retrieve more information from the guest.
One possible test is:
incus exec win11 -- cmd.exe /c ver14. Remove the ISO files after installation
Stop the VM:
incus stop win11Remove the Windows installer ISO:
incus config device remove win11 windows-isoYou can also remove the VirtIO ISO after installing the drivers:
incus config device remove win11 virtio-isoKeep the agent device because it provides the agent and its configuration to Windows.
Start the VM again:
incus start win11
incus console win11 --type=vga15. Start the VM automatically with the host
To start Windows automatically after Incus starts:
incus config set win11 boot.autostart=trueOptionally, define a priority and delay:
incus config set win11 boot.autostart.priority=10
incus config set win11 boot.autostart.delay=15Make sure the Incus service is enabled:
sudo systemctl enable incus.service16. Useful commands
List instances
incus listOpen the graphical console
incus console win11 --type=vgaStart
incus start win11Shut down normally
incus stop win11Force shutdown
Use this only when Windows is not responding:
incus stop win11 --forceRestart
incus restart win11Change CPU and memory
It is safer to stop the VM before making major changes:
incus stop win11
incus config set win11 limits.cpu=6
incus config set win11 limits.memory=12GiB
incus start win11Create a snapshot
incus snapshot create win11 before-updateList snapshots:
incus snapshot list win11Restore a snapshot:
incus stop win11
incus snapshot restore win11 before-update
incus start win11Delete the VM
incus stop win11 --force
incus delete win1117. Share an Arch Linux folder with Windows
Sharing host directories with VMs depends on the agent and the appropriate drivers. A simple and predictable alternative is to share the folder over the network using Samba.
Another option is to add a disk device, but support and the mounting procedure inside Windows depend on the sharing mechanism provided by the installed Incus version and drivers.
For important data, prefer:
- Samba over the
incusbr0network; - an SFTP/SSH server;
- a separate virtual disk;
- application-based synchronization such as Syncthing.
18. Remote access through RDP
After installing the network drivers, find the VM's IP address:
incus list win11Enable Remote Desktop in Windows. Then, on Arch Linux, use a client such as FreeRDP or Remmina.
Example with FreeRDP:
sudo pacman -S freerdp
xfreerdp3 /v:VM_IP_ADDRESS /u:YOUR_USERNAME /dynamic-resolutionWindows 11 Home normally does not provide a native RDP server; Pro and higher editions include this feature.
19. Troubleshooting
Error: Failed to connect to local Incus
Check the socket:
systemctl status incus.socket
sudo systemctl restart incus.socketAlso check whether the user belongs to the correct group:
idAfter joining the group, fully log out of the session and log back in.
/dev/kvm does not exist
Check:
lscpu | grep -E 'Virtualization|Virtualização'
lsmod | grep kvmEnable VT-x, AMD-V, or SVM in UEFI/BIOS.
The VM is very slow
Check whether it is actually using KVM:
incus info win11 --show-logAlso verify:
- that
/dev/kvmexists; - that virtualization is enabled in the firmware;
- that the host is not running inside another VM without nested virtualization;
- that enough free memory is available;
- that the VirtIO drivers are installed in Windows.
Windows does not detect TPM 2.0
Check the device:
incus config device show win11The configuration should contain something similar to:
vtpm:
type: tpmDo not add path=/dev/tpm0 to a VM TPM device. Stop the VM, remove the incorrect configuration, and recreate the device:
incus stop win11 --force
incus config device remove win11 vtpm
incus config device add win11 vtpm tpm
incus start win11Secure Boot-related error
Check:
incus config get win11 security.securebootFor Windows 11, try to keep:
incus config set win11 security.secureboot=trueIf you are using a modified or unsigned ISO, or an incompatible old installation, temporarily disabling Secure Boot may help with diagnosis:
incus stop win11
incus config set win11 security.secureboot=false
incus start win11This reduces the integrity guarantees of the boot process and is not the recommended configuration for a normal Windows 11 installation.
The VGA console does not open
Confirm that the SPICE client is installed:
sudo pacman -S virt-viewerThen run:
incus console win11 --type=vgaThe VM does not receive an IP address
First, install the NetKVM driver from the VirtIO ISO. Then check the Incus network:
incus network show incusbr0
incus config device show win11
incus list win11The VM normally inherits an interface connected to the incusbr0 bridge from the default profile.
20. Complete configuration sequence
After Incus, storage, and networking have been initialized, the creation process can be summarized as follows:
VM=win11
WIN_ISO="$HOME/VMs/iso/Windows11.iso"
VIRTIO_ISO="$HOME/VMs/iso/virtio-win.iso"
incus init "$VM" --empty --vm
incus config set "$VM" image.os=Windows
incus config set "$VM" limits.cpu=4
incus config set "$VM" limits.memory=8GiB
incus config set "$VM" security.secureboot=true
incus config device override "$VM" root size=80GiB
incus config device add "$VM" vtpm tpm
incus config device add "$VM" windows-iso disk \
source="$WIN_ISO" readonly=true boot.priority=10
incus config device add "$VM" virtio-iso disk \
source="$VIRTIO_ISO" readonly=true boot.priority=5
incus config device add "$VM" agent disk source=agent:config
incus start "$VM"
incus console "$VM" --type=vga