Installing Windows 10 on KVM (with Fedora Core)

Tried with libvirt 1.2.18, qemu-kvm 2.4.1.

Step 1 : virtio drivers

Get and install the Windows Virtio Drivers, but unless you have a windows build system set up you're better off getting the binaries Fedora provides. The important file is virtio-win.iso. It should end up in /usr/share/virtio-win. If it ends up somewhere else on your system, change the location in the snippet below referenced by the --disk command line argument. I used verion 0.1.102 and had no issues.

Step 2 : use virt-install

Use the following command line to create the new instance and start the installation :

virt-install \
    --name=windows10
    --ram=8192 \
    --cpu=host
    --vcpus=2 \
    --os-type=windows \
    --os-variant=win8.1 \
    --disk /dev/mapper/vms-win10,bus=virtio \
    --disk /tmp/en_windows_10_enterprise_x64_dvd_6851151.iso,device=cdrom,bus=ide \
    --disk /usr/share/virtio-win/virtio-win.iso,device=cdrom,bus=ide \
    --network bridge=virbr0 \
    --graphics vnc,listen=0.0.0.0

All command line arguments are fairly straightforward. My goal here is to install to the logical volume win10 in the volume group vms. Fedore Cora instantiates this at /dev/mapper/volumegroup-volumename. Just make sure the qemu user is authorized to read the installation iso.

Step 3 : install windows

It's fairly straightforward, except Windows by default has no way to see the drive you want to install to. That's what the virtio drivers are for.

Screenshot windows 10 installer with no drives available to install
Screenshot of windows 10 installer with no drives available to install

Click on Load Driver and browse for the Windows 8.1 viostor driver. Remember amd64 = 64 bits Windows and x86 = 32 bits.

Screenshot windows 10 installer browsing for Virtio driver
Screenshot of windows 10 installer browsing for Virtio driver

After Windows has installed the driver, Drive 0 will be available to install to.

Step 4 : install the display driver

With the regular VGA driver inside QEMU the maximum resolution is limited to 2560x1600 (for the full list of supported video modes, see vbe-tables-gen.c in the VGA bios rom implementation of QEMU) Larger screen sizes are supported through the QXL virtual graphics driver in QEMU in combination with SPICE as the client side viewer.

Within virt-manager it is simple enough to switch output to SPICE and the virtual video adapter to QXL. However the default 16MiB Video RAM can't be changed through the user interface. 4k resolutions need at least 64MiB (4 bytes per pixel). Therefore we use the command line tools to edit the libvirt XML description of the virtual machine.

# virsh edit windows10

    ...
    <video>
      <model type='qxl' ram='131072' vram='131072' vgamem='65536' heads='1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    ...

The final step is installing the right driver in the guest OS. Windows 8 or later require drivers following the Windows Display Driver Model, so the standard qxl driver won't work. You will need the qxl-dod driver for which binaries are available here.