Windows 10 PC in Virtualbox VM wandeln

Dieser Artikel beschreibt in groben Zügen was man machen muss um die bestehende Installation eines Windows PCs in eine Virtualbox VM zu wandeln. Als Host für die VM wird ein Linux Manjaro verwendet.

Festplatte des Windows PCs via SSH auf den Linux PC sichern

Windows PC von einem Linux Live USBStick booten (z.B. Linux Manjaro). Im Live Linux muss die Option user_allow_other in der /etc/fuse.conf aktiviert werden (Es darf kein Rautenzeichen # vor user_allow_other stehen).

Nun kann man einen Ordner vom Linux PC im Live Linux mounten und mit dd die Windows PC Festplatte auf den Linux PC sichern.

sshfs user@linuxHost:/home/user/vm /mnt -o allow_other
sudo dd if=/dev/nvme0n1 of=/mnt/windows.img bs=8M status=progress

Je nach Größe der Windowsfestplatte kann das nun etwas dauern, ein Gigabit Netzwerk schafft effektiv ~115MB/s, dann dauert es bei einer 1TB Festplatte ca. 3 Stunden. Das erzeugte Festplattenimage sieht dann z.B. so aus:

user@linuxHost> gdisk -l windows.img
GPT fdisk (gdisk) version 1.0.9

Partition table scan:
  MBR: MBR only
  BSD: not present
  APM: not present
  GPT: not present


***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory. 
***************************************************************

Disk windows.img: 1953525168 sectors, 931.5 GiB
Sector size (logical): 512 bytes
Disk identifier (GUID): 6E90C8D4-D488-4BA5-A3BA-153F82B186E3
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 1953525134
Partitions will be aligned on 2048-sector boundaries
Total free space is 13677 sectors (6.7 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048       788598783   376.0 GiB   0700  Microsoft basic data
   3      1889644544      1891700735   1004.0 MiB  2700  Windows RE
   4      1891700736      1953517567   29.5 GiB    0700  Microsoft basic data
   5       788600832       988524543   95.3 GiB    0700  Microsoft basic data
   6       988526592      1889644543   429.7 GiB   0700  Microsoft basic data

dd Festplatten Kopie in ein Virtualbox VDI Datei wandeln

Wenn das kopieren abgeschlossen ist, kann man auf dem Linux Host die /home/user/vm/windows.img Datei bearbeiten, z.B. unnötige Partitionen löschen, Partitionen verkleinern oder Partitionen verschieben.

In diesem Beispiel war die Windows Festplatte 931.5 GiB groß, ich habe mit gparted folgendes gemacht:

  • /dev/loop0p6 gelöscht
  • /dev/loop0p2 (Extended Parition) auf die Größe von /dev/loop0p5 geschrumpft
  • /dev/loop0p3 ans Ende von /dev/loop0p2 gezogen
  • /dev/loop0p4 ans Ende von /dev/loop0p3 gezogen

Dadurch war am Ende der windows.img Datei nun 429.69GiB ungenutzter Speicher.

Mit truncate kann man den ungenutzten Speicher am Ende der windows.img Datei abtrennen.

Alle genutzten Befehle können dem folgenden Shelllog entommen werden. Im Beispiel unten ist das Ende der letzten Partition bei Block 1052397567, da addieren wir 100 Blöcke drauf (um evtl. ein nötiges GPT Backup noch ans Ende packen zu können, das braucht mindestens 33 Blöcke) und multiplizieren es mit der Blocksize:
(1052397567 + 100) * 512 = 538827605504
Vor dem truncate Kommando steht in der gdisk Ausgabe:
Total free space is 901131629 sectors (429.7 GiB)
Nach dem truncate Kommando steht in der gdisk Ausgabe:
Total free space is 4128 sectors (2.0 MiB)

user@linuxHost> gdisk -l windows.img
GPT fdisk (gdisk) version 1.0.9

Partition table scan:
  MBR: MBR only
  BSD: not present
  APM: not present
  GPT: not present


***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory. 
***************************************************************

Disk windows.img: 1953525168 sectors, 931.5 GiB
Sector size (logical): 512 bytes
Disk identifier (GUID): 6EA79013-1AFB-4A37-B8DE-DEA21C1F180B
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 1953525134
Partitions will be aligned on 2048-sector boundaries
Total free space is 901131629 sectors (429.7 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048       788598783   376.0 GiB   0700  Microsoft basic data
   3       988524544       990580735   1004.0 MiB  2700  Windows RE
   4       990580736      1052397567   29.5 GiB    0700  Microsoft basic data
   5       788600832       988524543   95.3 GiB    0700  Microsoft basic data

user@linuxHost> sudo losetup --show --find --partscan windows.img
user@linuxHost> sudo gparted /dev/loop0
user@linuxHost> sudo losetup -d /dev/loop0
user@linuxHost> truncate --size=538827605504 windows.img
user@linuxHost> gdisk -l windows.img
GPT fdisk (gdisk) version 1.0.9

Partition table scan:
  MBR: MBR only
  BSD: not present
  APM: not present
  GPT: not present


***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory. 
***************************************************************

Disk windows.img: 1052397667 sectors, 501.8 GiB
Sector size (logical): 512 bytes
Disk identifier (GUID): AE3E8BBF-5FAA-48C8-8EE7-7A0ED0B85215
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 1052397633
Partitions will be aligned on 2048-sector boundaries
Total free space is 4128 sectors (2.0 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048       788598783   376.0 GiB   0700  Microsoft basic data
   3       988524544       990580735   1004.0 MiB  2700  Windows RE
   4       990580736      1052397567   29.5 GiB    0700  Microsoft basic data
   5       788600832       988524543   95.3 GiB    0700  Microsoft basic data

Die so verkleinerte windows.img Datei kann nun in eine Virtualbox VM gewandelt werden:

vboxmanage convertdd windows.img windows.vdi --format VDI --variant Fixed

Die erzeugte windows.vdi Datei kann dann in einer Virtualbox VM als boot Festplatte eingebunden werden. Das Windows in der VM erkennt das es nun nicht mehr auf der Hardware läuft und muss in der Regel neu aktiviert werden.

Die VDI Datei kann noch weiter geschrumpft werden, indem man die VM bootet und sdelete in einer powershell/cmd ausführt:

c:> c:\temp\sdelete64.exe -z c:
c:> c:\temp\sdelete64.exe -z d:

Dadurch werden alle ungenutzten Blöcke im Dateisystem der VM mit Nullen überschrieben. Wenn das erledigt ist, muss man die VM wieder ausschalten und kann nun die windows.vdi Datei auf dem Linux Host komprimieren lassen:

vboxmanage modifymedium disk windows.vdi --compact

Das komprimieren ist mehr oder weniger nur temporär. Wenn viele Daten in der VM geschrieben/gelöscht werden, dann wird die windows.vdi Datei worst-case wieder auf die volle Größe anwachsen. Ist aber sehr hilfreich wenn man die VM archivieren will.