Practical, copy-paste friendly guide for Proxmox/KVM environments. Covers new installs, converting existing Windows guests, and automation for scale.
Core principles (remember these)
- Prepare drivers before switching controllers. Install virtio drivers in the guest (or inject into the image) before you change disk/network to virtio.
- Inject into the image for scale. For mass deployments, inject drivers into the Windows install.wim (unattended ISO) — far more reliable than manual installs.
- Watch Secure Boot / signing. Unsigned drivers or mismatched signatures will block installs under Secure Boot. Plan to use signed drivers or disable Secure Boot in controlled environments.
Scenario A — New Windows installs (interactive quick method)
- Attach the
virtio-win ISO to the VM’s CD-ROM in Proxmox.
- In Windows Setup, when no disk is shown → click Load driver → point to
viostor (or appropriate folder for your arch). The installer will then see the disk.
- After install, install other virtio drivers (
netkvm, balloon, guest-agent).
Good for single or a few manual installs.
Scenario B — Converting an existing Windows VM to virtio (minimal downtime)
Safer flow that avoids a full reinstall:
- In Proxmox, temporarily set the VM’s disk to IDE/SATA (leave NIC as-is). Boot Windows.
- Mount the
virtio-win ISO in the running Windows guest.
- Install drivers (storage, network, balloon, etc.) using
pnputil or Device Manager. Example PowerShell:
Assuming virtio ISO is D:
Install all drivers under D:\ for subfolders (modern Windows)
pnputil /add-driver D:*.inf /subdirs /install
Or more explicit:
Get-ChildItem -Path "D:\viostor\w10\amd64\" -Filter *.inf -Recurse |
ForEach-Object { pnputil /add-driver $_.FullName /install }
- Reboot and verify.
- In Proxmox, switch disk back to
virtio-scsi-pci and NIC to virtio, then boot and verify.
If something breaks, revert to IDE and troubleshoot via logs.
Scenario C — Unattended / Template / Bulk deployments (recommended for scale)
Method 1 — Inject virtio drivers into the install.wim (recommended)
Workflow (high level):
- Mount
install.wim with DISM.
- Inject drivers from your
virtio-win folder into the WIM image index you plan to use.
- Commit, rebuild ISO, and use
autounattend.xml for fully unattended installs (no manual “Load driver” step).
Key commands:
Mount the WIM (adjust paths & index)
dism /Mount-Wim /WimFile:"D:\sources\install.wim" /index:1 /MountDir:C:\WIM
Inject drivers (recurse through virtio folder)
dism /Image:C:\WIM /Add-Driver /Driver:E:\virtio-win\ /Recurse
Commit & unmount
dism /Unmount-Wim /MountDir:C:\WIM /Commit
Advantages: installer always sees virtio storage and NIC drivers → truly unattended.
Method 2 — First-boot driver install (template approach)
- Create a sysprep’d template VM that includes a first-boot script.
- On first boot, run a PowerShell script that installs drivers from an attached ISO or network share and then reboots. Example
first-boot snippet:
Install all INF drivers under mounted D: and log output
$log = "C:\Windows\Logs\virtio-install.log"
pnputil /add-driver "D:*.inf" /subdirs /install 2>&1 | Out-File -FilePath $log -Encoding utf8
Optional: remove ISO, set flags, then reboot
shutdown /r /t 10
This is simpler than WIM injection but means first boot must run scripts reliably and may need reboots.
One-line summary
For reliability at scale: inject virtio drivers into the install.wim (best); for converting existing VMs: install drivers inside the running guest then switch to virtio; for quick single installs: load drivers from virtio-win during setup.