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/loop0p
4 ans Ende von /dev/loop0p
3 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.