Windows 7 fails to install on KVM with qemu

kvm-switchqemuUbuntuvirtual machinewindows 7

I'm trying to install Windows 7 as the guest OS in a virtual machine hosted by my 64-bit Ubuntu Karmic box. I get to the point of selecting my language settings and clicking 'install now', but a short while later I get a blue screen of death.

I've tried a few variations, including using the 32-bit version of Windows 7, which fails very quickly. The virt-install command I've tried includes this:

sudo virt-install --connect qemu:///system -n ksm-win7 -r 2048 \
--disk path=/home/kief/VM-Images/ksm-win7.qcow2,size=50 \
-c /var/Software/Windows7/Full/64bit/SW_DVD5_SA_Win_Ent_7_64BIT_English_Full_MLF_X15-70749.ISO \
--vnc --os-type windows --os-variant vista --hvm

The limited info I could find suggested that 'Vista' should work as the –os-variant, I haven't found any values specific to Windows 7.

Here's my blue screen:

BSOD

I've found very little by Googling, so I'm guessing this isn't a case of KVM simply not supporting Windows 7.

Update:

I have been able to successfully create a Windows 7 VM using the graphical "Virtual Machine Manager" app, although I don't really understand the cause of the problem with the VM created with virt-install. Comparing the configuration files under /etc/libvirt/qemu provides some clues, although I don't know enough to interpret them properly. The interesting differences in the two VM configurations are:

--- win7-virt-install.xml
+++ win7-vmm.xml
-<domain type='qemu'>
+<domain type='kvm'>
@@ -21 +21 @@
-    <emulator>/usr/bin/qemu-system-x86_64</emulator>
+    <emulator>/usr/bin/kvm</emulator>
@@ -23 +23 @@
-      <source file='/home/kief/VM-Images/ksm-win7.qcow2'/>
+      <source file='/var/lib/libvirt/images/ksm-win7x64.img'/>

I'm not sure if this means the working VM is not using qemu at all, or if there is some other difference in the way it's used with kvm.

Update2:

So I've answered my own question (mostly) below. A KVM VM needs to use KVM's own CPU emulation rather than qemu's in order for me to get Windows 7 installed. I'm not sure whether there is something that can be done to get it working on a qemu-emulation CPU, or whether a newer version will support it. But at least it is possible to get it running on a KVM VM.

Best Answer

Here's the easy way

Unless you have some specific why you'd install a GuestOS using virt-install, here's the 'easy' way to do it without virt-install.

I have a working VM with Windows 7 installed. Here's how I created it.

Step 1: Create the virtual disk image

qemu-img create -f qcow2 vdisk.img 100g

This creates a virtual disk in the qcow2 format. Setting the partition size to 100g (gigabytes) will not allocate 100gb of physical hard disk space. The virtual partition will only take as much space as the data it contains. The 100g just makes it so you'll (hopefully) never need to increase the size. Increasing a qcow2 image's default size is still a pain in the a** to do.

Step 2: Install the OS

If you're using an actual physical cd-rom to load the OS, use the following command.

sudo kvm -m 750 -cdrom /dev/sr0 -boot d vdisk.img

If you're using a disk image to load the OS, use this command.

sudo kvm -m 750 -cd-rom /path/to/image/image.iso -boot d vdisk.img

Here's the breakdown of the commands:

  • kvm - calls the kernel virtual machine (obvious)
  • -m 750 - allocates 750mb of memory for the virtual machine
  • -cd-rom sets up the cd-rom. For a physical disk use same disk as your HostOS. For a image, provide a path to the image file.
  • -boot d boots the virtual machine from the cd-rom

I set the memory footprint for the initial load to 750 to be conservative so I can be sure that the install finishes without running out of memory. For subsequent loads I usually set it to 512.

Note: AFIAK, the kvm command only works in more recent versions of Debian/Ubuntu or their derivatives. If it doesn't work the equivalent (and more common) command is qemu-system-x86_64 or qemu-kvm for 32 bit.

After you've gone through the whole install process the VM should reboot into a working OS. To load the VM again just launch this command:

kvm -m 512 vdisk.img

With whatever command line switches you need to mount additional physical disks, hardware, etc. To find info on command line switches check kvm --help.

If you don't understand the difference between 'paravirtualization' and 'native virtualization' Matthias' has already made a great explanation of the differences.

For a more 'in depth' explanation of this process read this article.

Related Question