Wie konvertiere ich ein mehrteiliges VMDK-Disk-Image in qcow2?

7

Ich habe ein VMDK-Image, das als mehrere Dateien vorhanden ist:

2.0G guest-s001.vmdk  1.8G guest-s003.vmdk  128K guest-s005.vmdk
2.0G guest-s002.vmdk  1.7G guest-s004.vmdk  4.0K guest.vmdk

Bei der Ausführung qemu-imgan das qcow2 - Format zu konvertieren, die Eingabedatei (en) soll ich angeben? Nur guest.vmdkalle oder so guest-*.vmdk?

ændrük
quelle

Antworten:

12

In der Vergangenheit musste ich sie zuerst in Rohbilder konvertieren, sie miteinander verketten und dann das resultierende Rohbild in qcow2 konvertieren:

qemu-img convert guest-s001.vmdk guest-s0001.raw
qemu-img convert guest-s002.vmdk guest-s0002.raw
qemu-img convert guest-s003.vmdk guest-s0003.raw
qemu-img convert guest-s004.vmdk guest-s0004.raw
qemu-img convert guest-s005.vmdk guest-s0005.raw
cat guest-s0001.raw guest-s0002.raw guest-s0003.raw guest-s0004.raw guest-s0005.raw > guest.raw
qemu-img convert guest.raw guest.qcow2

Keine Panik, wenn mehr als nur die letzte Datei kleiner als 2146762752 Byte ist. Einige VMware-Produkte erstellen VMDK-Bereiche mit unterschiedlichen Größen. Die Größe sollte dem 512-fachen der Anzahl der Sektoren entsprechen, die in der Extent-Beschreibung in der vmdk-Hauptdatei aufgeführt sind (lesbar mit einem beliebigen Texteditor oder "cat").

Es kann auch möglich sein, dies alles auf einmal zu tun, aber ich habe dies nicht versucht:

qemu-img convert guest-s001.vmdk guest-s002.vmdk guest-s003.vmdk guest-s004.vmdk guest-s005.vmdk guest.qcow2

Oder wenn es sich nicht um zusammenhängende Disk-Images handelt, bin ich mir nicht sicher, was ich vorschlagen soll. :) :)

Viel Glück!


Ein schnelles Terminal-Skript zum gleichzeitigen Konvertieren aller Bilder wäre:

for i in *.vmdk; do qemu-img convert -f vmdk $i -O raw $i.raw; done
cat *.raw > tmpImage.raw
qemu-img convert tmpImage.raw finalImage.qcow2
rm *.raw
Kees Cook
quelle
qemu-img convert guest-s001.vmdk guest-s002.vmdk guest-s003.vmdk guest-s004.vmdk guest-s005.vmdk guest.qcow2 Diese Methode ist möglich, schnell und komfortabel !!!! Vielen Dank :)
Liebe es. Erwägen Sie, "IFS = \ n;" zu Ihrer for-Schleife, nur für den Fall, dass die vmdk-Dateien Leerzeichen in den Namen haben. IFS=\n ; for i in *.vmdk; do qemu-img convert -f vmdk $i -O raw $i.raw; done && cat *.raw > tmpImage.raw && qemu-img convert tmpImage.raw finalImage.qcow2 && rm *.raw
Lon Kaut
3

Ich sehe aus wie der Befehl qemu-img jetzt erweitert wurde. Ich habe gerade eine Reihe von mehrteiligen VMware-Images mit dem folgenden Befehl in qcow2 konvertiert:

$ qemu-img convert <base of the image without the S0001,2etc>.vmdk new-image.qcow2
Stuart
quelle
1

Ich versuche dies in roh umzuwandeln:

find . -type f -iname <guest-name>\*-f0\*vmdk -exec qemu-img convert {} {}.raw \;

Dann zu verketten:

cat <guest-name>*-f0[0-1][1-9]*raw >> <guest-name>.raw

Dann zu konvertieren:

qemu-img convert <guest-name>.raw -O qcow2 <guest-name>.qcow2
Dwight Spencer
quelle
Wow, das hat alles vermasselt, was größer oder kleiner als Zeichen ist. :( Mach dir nicht die Mühe damit.
Ich habe Ihren Beitrag so bearbeitet, dass er korrekt angezeigt wird. Hier ist die Erklärung.
ændrük
1

Ich hätte das paralleltun können, aber hier ist eine, die das Verzeichnis macht:

ls *s0??.vdmk | xargs -n 2 -I % qemu-img convert % %.img

Und dann:

cat *.img >> imagename.raw

Der lsTeil vor der Pipe druckt alle vdmk, die am Ende einen s0und zwei Platzhalter haben. Der xargsBefehl ermöglicht es ihm %, das Ende des qemu-imgBefehls zweimal als Variable zu ersetzen .

Andrew Galford
quelle
1

Hier ist eine einfache Möglichkeit, dies in einer Zeile unter Verwendung von Arrays zu tun :

files=(*s0??.vmdk); qemu-img convert -f vmdk -O qcow2 ${files[@]} ${files%-s001.vmdk}.qcow2;
ScienceMan
quelle
0

Eine Option ist die Verwendung eines Platzhalters im Namen von Bildern:

qemu-img convert my-multipart-image*.vmdk my-image.qcow2
coffman21
quelle