Install a Windows VM (Server & 11)¶
Installing Windows from an ISO needs two things that Linux guests don't: the VirtIO storage driver (Windows Setup can't see a virtio disk without it) and UEFI + Secure Boot + TPM (required by Windows 11, recommended for Server). MFCloud wires up the firmware, Secure Boot, and a virtual TPM automatically when you set OS Type = Windows — you only have to load one driver during Setup.
Do it once, then clone
The ISO install below is a one-time exercise. Afterwards, turn the VM into a Golden Image Template and every future Windows VM boots straight to the desktop in seconds — no ISO, no driver step.
Prerequisites¶
- A genuine Windows ISO (Server 2022/2025/2019, or Windows 11) uploaded to a datastore the target node can reach.
- The VirtIO driver ISO staged on the node (one-time per node) — see below.
- The target node has KVM acceleration (
/dev/kvm). Check the VM's Summary → Acceleration field after deploy: it must read KVM, not TCG. See Troubleshooting.
Stage the VirtIO driver ISO (one-time per node)¶
MFCloud auto-attaches the VirtIO driver CD to every Windows VM if the file is present on the node.
Automatic (recommended): set a cluster's OS Class to Windows or Mixed and MFCloud stages it on every member node automatically — on Add Host, on cluster Create/Edit save, and on demand via the Stage virtio-win on Nodes button (dashboard toolbar). Nodes that already have it are skipped instantly.
Manual (one node, e.g. before the cluster's OS Class is set):
curl -L -o /var/lib/libvirt/images/virtio-win.iso \
https://fedora-virt.repo.nfrance.com/virtio-win/direct-downloads/stable-virtio/virtio-win.iso
ls -lh /var/lib/libvirt/images/virtio-win.iso # expect ~750 MB
Don't use the fedorapeople.org URL
The canonical fedorapeople.org/groups/virt/virtio-win/... path is unreachable from this lab's network (packets silently dropped on 80/443, not refused — upstream/firewall issue, not the node). The nFrance mirror above serves the identical path layout and is the one that actually works here.
Note
This is per node either way. To make it fleet-wide without per-host curling, use the automatic path above.
1. Deploy with Windows settings¶
Inventory → Virtual Machines → Deploy VM, then:
| Field | Value | Why |
|---|---|---|
| OS Template | your Windows ISO | The installer (not virtio-win.iso — that attaches automatically). |
| OS Type | Windows | Triggers VirtIO driver CD, vTPM, q35, UEFI, Hyper-V enlightenments. |
| Windows Version | Auto (or 11 for Windows 11) | Auto → UEFI + q35. Pick 11 only for Windows 11 media. |
| Machine Type | Auto → q35 | Required for UEFI + Secure Boot. |
| Firmware | Auto → UEFI | Required for Windows 11; recommended for Server. |
| Secure Boot | Auto → On | Enrolled Microsoft keys + vTPM 2.0. Turn Off only for unsigned/remastered ISOs. |
| Memory | ≥ 4096 MB | Server 2022 floor is 2 GB; Setup is unhappy near it. |
| Disk | ≥ 40 GB | Server 2022 needs ~32 GB minimum. |
Click Deploy, then open the VM's Summary panel and confirm:
- Acceleration: KVM, and
- two CD-ROM devices (your Windows ISO and
virtio-win.iso).
2. Boot the installer¶
Open the Web Console and click into the screen to capture the keyboard.
Catch the boot prompt
With KVM the VM boots fast. When you see "Press any key to boot from CD or DVD…", tap a key within ~5 seconds. Miss it and the console shows a black screen / "Guest has not initialized the display" — just reboot the VM (Ctrl+Alt+Del) and catch it next time.
3. Load the VirtIO storage driver¶
At "Where do you want to install?" the list is empty: "We couldn't find any drives." That's expected — load the driver:
- Click Load driver → Browse.
- Select the VirtIO CD-ROM (the drive containing
viostor,NetKVM,Balloonfolders — not the one withsources/boot, that's the Windows ISO). - Browse to the folder for your Windows version (see table), click OK.
- Select "Red Hat VirtIO SCSI controller" → Next.
The disk appears in the list → select it → Next to install.
| Windows version | Driver folder |
|---|---|
| Server 2025 | viostor\2k25\amd64 |
| Server 2022 | viostor\2k22\amd64 |
| Server 2019 | viostor\2k19\amd64 |
| Server 2016 | viostor\2k16\amd64 |
| Windows 11 | viostor\w11\amd64 |
| Windows 10 | viostor\w10\amd64 |
Tip
If the driver list is empty after browsing, uncheck "Hide drivers that aren't compatible with this computer." Or just point Browse at the CD root and let Setup search all subfolders.
4. Finish the install¶
Let Windows copy files and reboot. For Server, pick "Desktop Experience" if you want a GUI (plain Standard/Datacenter = headless Core).
5. Load the network driver (Windows 11 OOBE)¶
Partway through first boot, Windows 11 Setup shows "Let's connect you to a network" with its own Install driver button — and there's no visible way to skip past it without either a working NIC or this driver, since the VirtIO NIC has no built-in Windows 11 driver either:
- Click Install driver.
- Browse to the VirtIO CD-ROM — same disc as Step 3, different folder this time.
- Navigate to
NetKVM\w11\amd64, select it. - The adapter appears, OOBE detects the network, and Next unlocks.
| Windows version | Driver folder |
|---|---|
| Server 2025 | NetKVM\2k25\amd64 |
| Server 2022 | NetKVM\2k22\amd64 |
| Server 2019 | NetKVM\2k19\amd64 |
| Server 2016 | NetKVM\2k16\amd64 |
| Windows 11 | NetKVM\w11\amd64 |
| Windows 10 | NetKVM\w10\amd64 |
Note
Server editions (and some Windows 10 builds) instead offer "I don't have internet" / "Continue with limited setup" on this screen — if you see that option, you can skip ahead and pick up the network driver after login via virtio-win-guest-tools.exe (Step 6) instead of loading it here.
6. Install the guest tools¶
After first login, open the VirtIO CD in Explorer and run virtio-win-guest-tools.exe. This installs:
- NetKVM — the network driver (the NIC won't work until this is in),
- Balloon — dynamic memory,
- qemu-guest-agent — so the IP address, hostname, and "Guest Agent: running" populate in the MFCloud Summary panel.
If you already finished setup without running guest tools¶
If you skipped this step (or virtio-win-guest-tools.exe isn't on the ISO — some minimal builds only ship bare driver folders), Device Manager → Other devices will show 2–3 unrecognized devices instead of one. Don't use the "Search automatically" / "Search for updated drivers on Windows Update" option — it only checks Windows Update and will never find these, even with the CD mounted. Use the manual path for each device:
- Right-click the device → Update driver → Browse my computer for drivers.
- Browse to the VirtIO CD-ROM drive, into the folder for the matching device and Windows version:
| Other devices entry | Driver folder |
|---|---|
| Ethernet Controller (NIC) | NetKVM\<version>\amd64 |
| Display/Video adapter | qxl\<version>\amd64 (or viogpudo\<version>\amd64 on newer builds) |
| PCI Device / System Device (balloon) | Balloon\<version>\amd64 |
| PCI Simple Communications Controller (serial) | vioserial\<version>\amd64 |
- Click Next to install, repeat for each remaining device, then reboot.
This fixes the NIC and display but not the guest agent — for IP/hostname to populate in the Summary panel you still need to run qemu-ga-x86_64.msi from the CD's guest-agent folder.
7. Verify Secure Boot & TPM¶
In the guest, press Shift+F10 for a command prompt:
msinfo32→ BIOS Mode: UEFI, Secure Boot State: Ontpm.msc→ a ready TPM 2.0
This is what makes the VM Windows 11–compliant and lets BitLocker / Credential Guard arm.
Skip all of this next time¶
Once the VM is installed with guest tools:
- (Recommended) Sysprep it:
C:\Windows\System32\Sysprep\sysprep.exe→ OOBE + Generalize + Shutdown, so each clone gets a unique SID. - Convert it to a Golden Image Template.
New Windows VMs then clone from the template — already driver'd, no ISO, no Load-driver step.
Troubleshooting¶
| Symptom | Cause & fix |
|---|---|
| "We couldn't find any drives" persists | The VirtIO driver isn't loaded (Step 3). If there's no VirtIO CD to browse to, virtio-win.iso wasn't staged on the node — stage it and re-deploy. |
| Black screen / "Guest has not initialized the display" | Usually just means the guest hasn't gotten far enough to draw a frame yet — most often because you missed the "Press any key to boot from CD" prompt (reboot with Ctrl+Alt+Del and tap a key when it appears). If it persists for many minutes with no progress at all, check Acceleration below — on TCG, Windows Setup can take a very long time to reach its first video mode. |
| Summary shows Acceleration: TCG (very slow) | The node has no /dev/kvm. Enable VT-x / AMD-V (Intel) or SVM Mode (AMD) in the host firmware — some boards report the CPU flag in /proc/cpuinfo even while SVM/VT-x is locked off, so check dmesg \| grep -i kvm for "not supported by CPU" to confirm. If the node is itself a VM, enable nested virtualization on its hypervisor and expose hardware virtualization to the guest. Either way, re-deploy (or just power-cycle) the VM after the fix — it won't pick up KVM on a VM that's already running. |
| OOBE stuck on "Let's connect you to a network" with no skip option | Expected on Windows 11 — load the NetKVM driver right there via Install driver (Step 5). |
| No network after install (already past OOBE) | Run virtio-win-guest-tools.exe (Step 6). Already past install with no guest-tools run? See If you already finished setup without running guest tools — and don't bother with the Windows Update driver search, it won't find these. |
| A remastered/unsigned ISO won't boot | Set Secure Boot = Off (or Firmware = BIOS) at deploy time. |