10. Juli 2012

Erfahrung mit der Installation von Windows 7 auf KVM für den Team Foundation Server

Für unsere Entwicklungsdienste Jenkins, Confluence, JIRA, Subversion, Artifactory und Team Foundation Server haben wir uns von Anfang an dazu entschieden, die Software nicht direkt auf die Hardware zu installieren, sondern gleich virtualisierte Rechner zu verwenden. Gestartet sind wir damals mit Debian Lenny und VMWare Server. Für dieses Jahr stand nun der Wechsel auf Debian Squeeze mit KVM an. Meine Erfahrung mit der Installation von Windows 7 auf KVM für den Team Foundation Server möchte ich hier mit euch teilen.
Geschäftsführer

Autor:in

Thomas Jäger

2024 Blogbeitrag Accso

Nachdem Debian Lenny seit Februar 2012 keine Sicherheitsupdates mehr erhält und VMWare für das Produkt VMWare Server bereits Mitte 2011 den Support eingestellt hat wurde es dringend Zeit, eine neue Virtualisierungslösung zu finden. Als erster Kandidat kam natürlich der Nachfolger des VMWare Server, VMWare ESXi in Frage. Da ESXi jedoch eine bare metal Lösung ist und direkt auf die Hardware aufsetzt, gestaltet sich diese Lösung als nicht optimal: Die gemieteten Server stehen im Rechenzentrum 400km entfernt und mal schnell für eine Installation rüberfahren geht nicht. Eine Lösung mit virtueller serieller Konsole und eingelegter CD wäre zwar möglich, aber aufwendig und kostet extra. Das Software-RAID müsste durch ein Hardware-RAID ausgetauscht werden, aber der Umbau der bestehenden Server kommt eigentlich nicht in Frage. In Summe: Die Flexibilität einer Virtualisierungslösung mit einem Debian als Wirt soll bestehen bleiben. Wir entschieden uns für KVM. Stellt sich natürlich die Frage: Wie installiert man nun Windows auf KVM?

Wichtige Vorbedingung zur Installation war für mich, dass die Administration durch einen Windows-Rechner ohne X11 mit Putty erfolgen kann: damit scheiden die üblichen Beschreibungen im Netz mit virt-manager aus. Diese Anleitung geht also davon aus, dass auf dem Administrationsrechner Putty und UltraVNC installiert ist. Statt UltraVNC kann man natürlich auch jeden anderen VNC Client verwenden. Da ich bislang gute Erfahrung mit UltraVNC gemacht habe, ist es dabei geblieben.

Bevor es überhaupt los geht, muss man Wirtssystem die notwendigen Pakete installieren:

# kvm (fetches a lot of stuff)
aptitude install qemu-kvm libvirt-bin virtinst

Während das erste Paket (qemu-kvm) die eigentliche Virtualisierung enthält, findet man in den beiden anderen Paketen Programme, um kvm einfach konfigurieren und starten zu können. Man arbeitet also nicht direkt mit KVM sondern mit den abstrakteren Tools von libvirt.

Die ersten Versuche

Bevor diese Anleitung entstanden ist, sind eine Vielzahl von Versuchen Windows 7 performant zu installieren gescheitert. Die erste Installation habe ich mit den Standardeinstellungen von libvirt vorgenommen: Also einer Installation mit voll virtualisierter Festplatte und Netzwerkkarte. Das Auspacken von Windows 7 auf die Festplatte dauerte damit gefühlt eine Ewigkeit. Dies konnte nur noch geschlagen werden durch die extrem langsame Netzwerkperformance. Da ich es von VMWare gewohnt war, dass das Gastbetriebssystem ohne die VMWare Tools ebenfalls sehr langsam ist, habe ich im nächsten Versuch die virtio-Treiber von Redhat/Fedora genutzt. Die Netzwerkperformance ist damit zwar deutlich besser geworden, aber die Festplatte werkelte immer noch sehr langsam vor sich hin. Des Rätsels Lösung war dann schließlich die Cache-Einstellung der Festplatte: Ohne Cache erreicht das System endlich die gewünschte Performance. Lange Rede, kurzer Sinn. Es geht los.

Die Installation

Zuerst holt man sich die aktuellen Treiber (von Redhat):

wget 

Mit diesen kann man dann das Kommandozeilentool virt-install mit den folgenden Parametern aufrufen:

# In der Shell von libvirt (virsh) steht der Rechner unter win7 zur Verfügung
-n win7

# Der Rechner soll 4GB Speicher bekommen
-r 4096

# Zwei virtuelle CPUs sollen zur Verfügung stehen
--vcpus=2

# Die 25GB große Festplatte im raw-Format wird an einem SCSI-virtio Bus angeboten
--disk /opt/kvm/images/win7.img,size=25,device=disk,bus=virtio

# Die Treiberdatei-ISO wird als virtuelles CD-ROM zur Verfügung gestellt
--disk path=/opt/kvm/install/virtio-win-0.1-22.iso,device=cdrom,perms=ro

# Netzwerkkarte vom Modell virtio wählen
-w network=default,model=virtio

# Windows 7 als Zielrechner
--os-type windows --os-variant win7

# Das Installationsmedium (Ein Image von Windows 7, in diesem Fall
# ein Professional mit 64bit, SP1)
-c /opt/kvm/install/SW_DVD5_Win_Pro_7w_SP1_64BIT_German_-2_MLF_X17-59263.ISO

# Es soll eine vollständige Virtualisierung erfolgen (keine
# Paravirtualisierung, was im Fall Windows auf Linux auch gar
# nicht möglich wäre
--hvm

# Der virtuelle Monitor soll per VNC auf dem Default-Port erscheinen
--vnc

# Es soll keine virtuelle serielle Konsole geöffnet werden. Bei Linux
# noch recht nützlich. Bei Windows nicht mehr... ;)
--noautoconsole

Zusammenfassend:

virt-install --connect qemu:///system -n win7 -r 4096 --vcpus=2 
  --disk /opt/kvm/images/win7.img,size=25,device=disk,bus=virtio 
  --os-type windows --os-variant win7 
  --disk path=/opt/kvm/install/virtio-win-0.1-22.iso,device=cdrom,perms=ro 
  -c /opt/kvm/install/SW_DVD5_Win_Pro_7w_SP1_64BIT_German_-2_MLF_X17-59263.ISO 
  -w network=default,model=virtio 
  --hvm --vnc --noautoconsole
Starting install...
Creating storage file win7.img   |  25 GB     00:00
Creating domain...               |    0 B     00:00
Domain installation still in progress. Waiting for installation to complete.

Um nun einen Installationsscreen von Windows zu bekommen kann man sich nun per UltraVNC den virtuellen Monitor auf seinen Desktop holen. Hierzu kann man in Putty entsprechend einen Tunnel konfigurieren:

20120710 Pu TTY Configuration

Der Tunnel zeigt auf den Port 5900 + Displaynummer. Die Display-Nummer ermittelt man dabei über die virsh:

virsh $ list
Id Name                 State
----------------------------------
3 win7                  running

virsh $ vncdisplay win7

:0

Im obigen Fall ist es also der Port 5900 (5900+0). Danach verbindet man den UltraVNC:

20120710 Ultra VNC Viewer X64 1 0 9 6

Zuerst war es nicht möglich, mit der Maus zu arbeiten: die Maus bewegte sich zwar, aber ein Mausklick hatte keine Wirkung. Erst nach Deaktivierung der Option Emulate 3 Buttons:

20120710 Connection Options

war es möglich, ganz normal mit der Maus zu arbeiten.

An dieser Stelle ergibt sich ein merkwürdiges Phänomen: Scheinbar wird bei libvirt die über virtio konfigurierte Festplatte nicht als Boot-Device markiert und damit findet Windows keine Festplatte zur Installation. Man muss also den Installationsvorgang beim erstem Mal abbrechen (entweder aus der Windowsinstallation heraus oder die nicht so sanfte Variante des destroy in der virsh) und die libvirt Konfiguration ändern. Die Konfigurationsdatei öffnet man am besten aus virsh heraus (zum Editieren sollte man den vi ein bisschen kennen):

virsh $ edit win7

Dort ergänzt man das CD-ROM als Bootdevice. Ja, verwirrend: libvirt startet initial KVM mit CD-ROM als Bootdevice und ohne die Festplatte; die Konfiguration listet nach Abbruch dann aber nur die Festplatte als Bootdevice, aber nicht das CD-ROM… Der geänderte Abschnitt sollte dann so aussehen:

  ...

    hvm

  ...

An dieser Stelle sollte man auch die Performance-Bremse Cache aus der Konfiguration ausbauen. Weiter unten in der Konfiguration setzt man den Festplatten-Cache auf none:

  ...

    
  ...

Eine sehr gute Beschreibung des Cache-Verhaltens und dieser Option kann man in dem Artikel KVM I/O slowness on RHEL 6 nachlesen.

Die Installation kann dann endlich von vorne beginnen. Der Gast wird über virsh gestartet:

virsh $ start win7

Jetzt durchläuft man die Installation wieder regulär bis zur Auswahl der Festplatte:

20120710 QEMU win7

Da der SCSI-Treiber noch nicht bekannt ist, kann man über Treiber laden > Durchsuchen den Treiber aus dem Treiberimage auswählen. Diese befinden sich unter E:Win7amd64:

20120710 QEMU win7 2

Ausgewählt wird dort der SCSI-Controller:

20120710 QEMU win7 2012 06 17 22 11 51

Die reguläre Installation kann dann beginnen:

20120710 QEMU win7 2012 06 17 22 13 19

Wenn die Installation abgeschlossen ist, wird der Gerätemanager aufgerufen. Die Netzwerkkarte dürfte noch unbekannt sein:

20120710 QEMU win7 2012 06 17 22 43 37

Hier verfährt man analog zu dem Treiber für den SCSI-Controller und erhält schließlich eine funktionierende Netzwerkkarte:

20120710 QEMU win7

Das war es! Windows 7 läuft nun in KVM.