.: Daniel Melanchthon :.

Banging your head against a wall uses 150 Calories an hour.

Wie funktioniert das Booten von VHDs?

Wie funktioniert das Booten von VHDs?

  • Comments 6
  • Likes

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.

Comments
  • Schöne klare Beschreibung.

    Windows 7 in so eine VHD zu installieren ist einfach.

    Aber: Ist es auch möglich Vista (oder sogar XP) in eine VHD Datei zu installieren?

    Normal ist das nicht möglich - beim ersten reboot fehlt Vista wohl der "vhddisk.sys" Treiber.

    Aber (Gedankenexperiment):

    Irgendwo habe ich mal eine Anleitung gelesen, daß man den Treiber "vhddisk.sys" auch in Vista integrieren kann, so daß man auch mit Vista auf VHDs zugreifen kann.

    Angenommen man hat Vista und Windows 7 real installiert. Zusätzlich Windows 7 in einer VHD-Datei. Wenn man in Vista den "vhddisk.sys" Treiber integriert, wäre dann folgendes möglich:

    Mit Windows 7 greift man auf die VHD-Datei zu (über die "Datenträgerverwaltung"). Dann löscht man den Inhalt der VHD-Datei und kopiert sein Vista (mit "vhddisk.sys" Treiber) in die Windows 7 VHD-Datei ...

  • Hallo ersteinmal.

    Die VHD Integration inkl. VHD-Boot ist, wie ich finde, eines der spannensten Features von Win7. Wird es wohl irgentwann eine Möglichkeit geben frühere Versionen zu booten?

    Schönen Gruß

    Frank

  • Das Booten aus einer VHD heraus klappt erst ab Windows 7/Windows Server 2008 R2. Du kannst zwar mit dem Treiber experimentieren - ob das Erfolg hat, wage ich zu bezweifeln und wenn, ist es keine unterstützte Umgebung.

  • Das Booten aus einer VHD heraus klappt erst ab Windows 7/Windows Server 2008 R2. Du kannst zwar mit dem Treiber experimentieren - ob das Erfolg hat, wage ich zu bezweifeln und wenn, ist es keine unterstützte Umgebung.

  • dmelanchthon> ob das Erfolg hat, wage ich zu bezweifeln

    Bange machen gilt nicht.

    dmelanchthon> und wenn, ist es keine unterstützte Umgebung.

    Das interessiert mich wenig.

    Habe jetzt meinen vorgeschlagenen Weg getestet - funktioniert aber nicht.

    Nach dieser Anleitung

    http://www.tech-recipes.com/rx/3595/windows-xpvista-how-to-attach-a-vhd-file/

    habe ich die VHD-Unterstützung in Vista integriert. Funktioniert auch - ich kann in Vista VHD-Dateien mounten.

    Habe dann unter Windows 7 eine bootfähige Windows 7 VHD angelegt und kann von dieser mittels Windows 7 Bootmenü booten. Dann habe ich diese VHD-Datei in Windows 7 gemounted, den Inhalt gelöscht und durch den Inhalt der Vista-Partition (mit VHD mount Möglichkeit) ersetzt. Aber: Booten von dieser VHD-Datei geht nicht.

    Resümee 1:

    Obwohl die Vista-Partition das VHD-Mounten unterstützt, läßt sich davon nicht booten. Die Treiberunterstützung für das Mounten von VHDs wird wohl zu "spät" eingebunden. Vermutlich wird bei Windows 7 die VHD-Unterstützung schon zu einem sehr frühen Stadium eingebunden oder ist im schon im Kernel integriert. Andererseits: Zum laden des Kernels in der VHD-Datei muß die VHD-Unterstützung ja schon aktiv sein …

    Und weiter:

    "Microsoft Virtual PC 2007" arbeitet ja ebenfalls mit VHD-Dateien. Dafür gibt's von Microsoft mehrere fertige VHDs zum download; z.B. mit Vista oder XP. Auch diese habe ich ausprobiert - auch von diesen läßt sich nicht direkt booten.

    Resümee 2:

    Vermutlich wird im Falle von "Microsoft Virtual PC 2007" die VHD-Unterstützung durch die Software "Microsoft Virtual PC 2007" bereitgestellt.

  • Ergänzende Frage: Du schreibst, daß in Phase 5 "der virtuelle SCSI Miniport-Treiber vhddisk.sys" gestartet wird. Wo ist diese Datei ? Ich kann sie weder unter Windows 7 noch in der VHD-Datei finden.

Your comment has been posted.   Close
Thank you, your comment requires moderation so it may take a while to appear.   Close
Leave a Comment