Wie funktioniert das Booten von VHDs?

Die Unterstützung des Bootens von VHDs ist eine der Neuerung in Windows 7, die mich am meisten begeistert. Alle, die zum Beispiel wie ich regelmäßig Demorechner auf einen definierten Stand zurücksetzen müssen und die die gesamten technischen Möglichkeiten der lokalen Hardware ausnutzen wollen (zum Beispiel Multitouch, UMTS-Modem, etc.), werden daran nicht mehr vorbei kommen.

VHD steht dabei für Virtual Hard Disk und stellt ein offenes Container-Format da, welches bisher zum Betreiben von virtuellen Computern genutzt wurde. Mit Windows 7 wird der Bootmanager dahingehend erweitert, dass man das Betriebssystem, Treiber und die benötigte Software nicht mehr zwingend auf der lokalen Festplatte installieren muss, sondern stattdessen einen VHD-Container nutzen kann. Damit kann man Funktionen aus der Virtualisierung wie Differencing Disks auch mit einer lokalen Installation nutzen.

Ich selbst habe zum Beispiel neben meiner Arbeitsinstallation eine zweite Partition für VHD-Images konfiguriert. Darauf liegt eine VHD-Datei mit einer Demoumgebung, die ich direkt booten kann. Mit Hilfe von Differencing Disks kann ich problemlos Änderungen an der gesamten Demoumgebung rückgängig machen, indem ich nach der Demo die Datei, welche die Änderungen enthält, gegen eine leere austausche. Steffen skizzierte die Grundzüge der Lösung in seinem Artikel Devirtualisierung mit VHD Boot.

Um zu verstehen, wie das Booten von VHDs funktioniert, schauen wir als erstes auf den normalen Bootprozess. Zusammengefasst lässt der sich folgendermaßen beschreiben:

  1. Wenn der Computer gestartet wird, initialisiert das BIOS die Hardware und lädt den Master Boot Record (MBR) von Sektor 0 der Festplatte.
  2. Der MBR lädt den Bootmanager des Betriebssystems.
  3. Der Bootmanager bietet dem Anwender die Auswahl verschiedener Bootoptionen.
  4. Nach Auswahl des Anwenders oder nach einem Timeout lädt der Bootmanager den gewünschten Bootloader mit den entsprechenden Optionen.
  5. Der Bootloader wiederum lädt die Systemkonfiguration und alle notwendigen Dateien für den Start des Betriebssystems (Kernel, HAL, Boottreiber, etc.).
  6. Nachdem alle Bootdateien in den Hauptspeicher geladen wurden, übergibt der Bootloader die Kontrolle an den geladenen Kernel.
  7. Der Kernel initialisiert alle zum Booten vorgesehenen Treiber und lädt den Rest des Betriebssystems.

Um nun von einer VHD anstelle einer lokalen Festplattenpartition booten zu können, muss dieser Prozess leicht verändert werden. Der VHD Bootprozess arbeitet im Bootmanager und im Bootloader als Filter für alle Dateizugriffe (file block IO). Immer wenn ein solcher Zugriff erkannt wird, erfolgt dieser nicht direkt gegen die Festplatte, sondern durchläuft einen Filter, der prüft, ob das Ziel des Zugriffs eine gültige VHD ist. Sollte dem so sein, leitet der Filter alle Lese-, Schreib- und Schließoperationen in die VHD um.

Dabei konvertiert der Bootfilter Lese- und Schreibzugriffe vom logischen Offset auf einen physikalischen Offset innerhalb der VHD-Datei, führt die Operation in der physikalischen VHD-Datei durch und gibt das Ergebnis an die aufrufende Instanz zurück. Wenn der Zugriff auf die VHD-Datei geschlossen wird, werden alle bis dahin allokierten Ressourcen wieder freigegeben.

Grundlage für den Zugriff ist der virtuelle SCSI Miniport-Treiber vhddisk.sys. Er wird während der ersten Phase des Bootprozesses in 5. gestartet. Wenn alle Boottreiber inklusive vhddisk initialisiert wurden, greift der Kernel auf die Bootloader-Information zu, die in 4. festgelegt wurden. Er kann jetzt erkennen, ob der Bootvorgang von einer VHD-Datei erfolgen soll.

Wenn das der Fall ist, extrahiert der Kernel den vollständigen Pfad zu der VHD-Datei und sendet ein IOCTL-Kommando an vhddisk mit der Aufgabe, die VHD-Datei in das System einzubinden (englisch: mounten [Hier muss ich immer an eine Lokalisierung von Novell Netware 5 denken, wo es mal hieß: Das Laufwerk wird gebergt!]).

Hier ein kleines Schaubild:

image

Durch das Einbinden wird die VHD-Datei jetzt wie eine SCSI-Festplatte dem System gegenüber dargestellt. Nachdem der Vorgang beendet wurde, behandelt das Betriebssystem die neu hinzugekommene Festplatte wie eine reguläre SCSI-Festplatte und der Bootprozeß läuft, wie gewohnt, weiter.

Wie macht man das ganze jetzt?

Um eine bestehende VHD-Datei in den Bootmanager von Windows 7 aufzunehmen, gibt man an einer administrativen Kommandozeile ein:

bcdedit /set {guid} device vhd=[locate]\windows7.vhd
bcdedit /set {guid} osdevice vhd=[locate]\windows7.vhd

Wenn die Hardwareumgebung sich dabei ändert und man die Installation in der VHD mit Sysprep generalisiert hatte, sollte man die Erkennung der HAL beim nächsten Booten der VHD einschalten:

bcdedit /set {guid} detecthal on

Man kann aber auch eine schon vorhandene Installation um den Windows 7 Bootmanager erweitern, um darüber VHD-Dateien als Bootgeräte einzubinden. Das geht am einfachsten aus einer in den hauptspeicher geladenen Windows PE-Version. Dafür reicht ein Booten von einer Windows 7 Installationsquelle. Dort geht man in die Computerreparaturoptionen und öffnet eine Kommadozeile. Hier geht man dann folgendermaßen vor:

  1. Kopieren der VHD-Datei auf die lokale Festplatte:
    copy y:\windows7.vhd c:\
  2. Temporäres Einbinden der VHD-Datei als Laufwerk:
    diskpart
    select vdisk file=c:\windows7.vhd
    attach vdisk
    assign letter=v
    exit
  3. Kopieren der Bootumgebung der VHD-Datei und der Boot Configuration Data (BCD) Konfiguration mit Bcdboot aus dem \Windows-Ordner der VHD auf die physikalische Systempartition. Bei PCs mit einem normalen BIOS ist das die aktive Partition auf der ersten Festplatte:
    cd /d v:\windows\system32
    bcdboot v:\windows

BCDboot importiert dabei automatisch die existierende Bootkonfiguration und in das Auswahlmenü. Danach integriert man die VHD in das Bootmenü wie schon schon angegeben.

Wer eine eigene Installation erzeugen möchte, kann das direkt unter Windows 7 oder Windows Server 2008 R2 machen. Einfach im Diskmanager eine VHD-Datei erzeugen und mit Imagex (findet man im WAIK) das gewünschte Betriebssystem aus einem Windows-Installationsimage (.wim) anwenden:

imagex /apply <pathtowim> 1 r:\

Weitere Informationen und eine Anleitung findet man im Screencast Windows 7 VHD Boot sowie in den Artikeln Deploy a Virtual Hard Disk for Native Boot und Add a Native-Boot Virtual Hard Disk to the Boot Menu.