2009-01-18 10 views
49

Ich habe einige Bilder von alten Linux im flachen Dateiformat verteilt, können sie von virtuellen Maschinen verwendet werden, aber ich muss sie mit Sun Virtual Box ausführen. Virtual Box kann keine Bilder in diesem Format verwenden, daher muss ich diese Bilder von einer flachen Datei in ein .vmdk-Dateiformat konvertieren. Gibt es eine Möglichkeit, dies zu tun?Wie konvertiert man ein unformatiertes Raw-Disk-Image in vmdk für virtualbox oder vmplayer?

+0

potentiell nützlich zu erstellen: http://en.wikipedia.org/wiki/Physical-to-Virtual – isuldor

+1

Vorsicht bei der Verwendung von '' 'qemu-img''' zum Konvertieren von Bildern zur Verwendung mit VMWare Fusion - Fusion mag keine Festplatten, deren Größe nicht genau dem Megabyte entspricht. Wenn Sie ein solches Bild haben, stellen Sie sicher, dass Sie zuerst die Größe auf das nächste Megabyte ändern und dann in das vmdk-Format konvertieren.Wenn Sie dies nicht tun, wird eine vmdk-Datei erstellt, die zur Installationszeit an eine VM angehängt werden kann. Versuche, sie später zu einer VM hinzuzufügen, führen jedoch dazu, dass die Schaltfläche "Anwenden" nicht funktioniert. – Anon

+1

Danke für diesen Kommentar. Ich hatte Mühe herauszufinden, warum der 'Apply'-Button nicht funktionierte. Ich brauchte ein paar Minuten, um herauszufinden, wie die Dateigröße auf das nächste Megabyte erhöht werden kann. Hier ist, wie ich es gemacht habe. Meine Datei musste um 600 Kilobyte erweitert werden. Dieser Befehl hat die Arbeit "dd if =/dev/zero count = 600 bs = 1k >> image.dd" –

Antwort

73

apt-get install qemu (installiert QEMU auf Debian/Ubuntu)

dann den folgenden Befehl ausführen: qemu-img convert -O vmdk imagefile.dd vmdkname.vmdk

Ich bin eine flache Scheibe Bild unter der Annahme ist eine dd-Stil Bild. Die Konvertierungsoperation verarbeitet auch zahlreiche andere Formate.

+4

Kann es sein, dass ein Disk-Image oder ein Partitions-Image ebenfalls verwendet werden könnte? –

+3

Es ist ausreichend, qemu-utils zu installieren (apt-get install qemu-utils). Diese Lösung funktioniert gut (wenn auch ein wenig langsam ..) – akw

+0

Ich habe ein Bash-Skript erstellt, um den Prozess zu automatisieren - siehe meine Antwort @krosenvold - danke das hat gut funktioniert –

1

Vielleicht sollten Sie mit Starwind V2V Converter versuchen, können Sie es von hier bekommen - http://www.starwindsoftware.com/converter. Es unterstützt auch IMG-Disk-Format und führt Sektor-für-Sektor-Konvertierung zwischen IMG, VMDK oder VHD in und von jedem von ihnen, ohne Änderungen am Quellbild vorzunehmen. Dieses Werkzeug ist kostenlos :)

6

Verwenden Sie unter Windows https://github.com/Zapotek/raw2vmdk, um rohe Dateien, die von dd oder winhex erstellt wurden, in vmdk zu konvertieren. raw2vmdk v0.1.3.2 hat einen Fehler - nachdem die vmdk-Datei erstellt wurde, bearbeite die vmdk-Datei und behebe den Pfad zur Rohdatei (in meinem Fall anstelle von D: \ Temp \ flash_16gb.raw (erstellt von winhex)) Pfad war D: Tempflash_16gb.raw). Dann öffne es in einer virtuellen VMware-Maschine Version 6.5-7 (5.1 weigerte sich, die vmdk-Festplatte anzuhängen). howgh!

+0

warum nicht-kommentierte downvote? – xhafan

71

Da die Frage VirtualBox erwähnt, arbeitet diese zur Zeit:

VBoxManage convertfromraw imagefile.dd vmdkname.vmdk --format VMDK 

Run es ohne Argumente für ein paar interessanten Details (vor allem des --variant flag):

VBoxManage convertfromraw 
+3

IMHO ist dies eine sauberere Lösung, da es nur Vbox-Tools benötigt, und Vbox soll schon da sein. –

+4

+1 und VBoxManage kann auch verwendet werden, um den anderen Weg zu konvertieren (virtual-image zu rohen) 'VBoxManage clonehd --format room vmdiskimage.vmdk imagefile.dd' – karmakaze

+0

+1, weil die Verwendung von virtuellen Box-Tools ist es wahrscheinlicher, dass es funktioniert mit virtueller Box (falls es irgendwelche merkwürdigkeiten gibt über die Art, wie es Dinge macht) – MikeKulls

1

krosenvold Antwort inspirierte den folgenden Skript, das Folgendes tut:

  • Holen Sie sich die Dd-Dump über SSH f rom ein Remote-Server (als gz-Datei)
  • entpacken Sie die Dump
  • wandeln es

das Skript VMWare anlauffähigen und überprüft die Existenz der Zwischendateien. Es verwendet auch pv und qemu-img -p, um den Fortschritt jedes Schrittes anzuzeigen.

In meiner Umgebung 2 x Ubuntu 12.04 LTS die Schritte unternommen haben:

  • 3 Stunden, um eine 47-GByte-Festplatte Dump einer Partition 60 GByte zu bekommen
  • 20 Minuten zu einer 60 GByte dd-Datei zu entpacken
  • 45 Minuten die vmware-Datei
#!/bin/bash 
# get a dd disk dump and convert it to vmware 
# see http://stackoverflow.com/questions/454899/how-to-convert-flat-raw-disk-image-to-vmdk-for-virtualbox-or-vmplayer 
# Author: wf 2014-10-1919 

# 
# get a dd dump from the given host's given disk and create a compressed 
# image at the given target 
# 
# 1: host e.g. somehost.somedomain 
# 2: disk e.g. sda 
# 3: target e.g. image.gz 
# 
# http://unix.stackexchange.com/questions/132797/how-to-use-ssh-to-make-a-dd-copy-of-disk-a-from-host-b-and-save-on-disk-b 
getdump() { 
    local l_host="$1" 
    local l_disk="$2" 
    local l_target="$3" 
    echo "getting disk dump of $l_disk from $l_host" 
    ssh $l_host sudo fdisk -l | egrep "^/dev/$l_disk" 
    if [ $? -ne 0 ] 
    then 
    echo "device $l_disk does not exist on host $l_host" 1>&2 
    exit 1 
    else 
    if [ ! -f $l_target ] 
    then 
     ssh $l_host "sudo dd if=/dev/$disk bs=1M | gzip -1 -" | pv | dd of=$l_target 
    else 
     echo "$l_target already exists" 
    fi 
    fi 
} 

# 
# optionally install command from package if it is not available yet 
# 1: command 
# 2: package 
# 
opt_install() { 
    l_command="$1" 
    l_package="$2" 
    echo "checking that $l_command from package $l_package is installed ..." 
    which $l_command 
    if [ $? -ne 0 ] 
    then 
    echo "installing $l_package to make $l_command available ..." 
    sudo apt-get install $l_package 
    fi 
} 

# 
# convert the given image to vmware 
# 1: the dd dump image 
# 2: the vmware image file to convert to 
# 
vmware_convert() { 
    local l_ddimage="$1" 
    local l_vmwareimage="$2" 
    echo "converting dd image $l_image to vmware $l_vmwareimage" 
    # convert to VMware disk format showing progess 
    # see http://manpages.ubuntu.com/manpages/precise/man1/qemu-img.1.html 
    qemu-img convert -p -O vmdk "$l_ddimage" "$l_vmwareimage" 
} 

# 
# show usage 
# 
usage() { 
    echo "usage: $0 host device" 
    echo "  host: the host to get the disk dump from e.g. frodo.lotr.org" 
    echo "   you need ssh and sudo privileges on that host" 
    echo " 
    echo " device: the disk to dump from e.g. sda" 
    echo "" 
    echo " examples: 
    echo "  $0 frodo.lotr.org sda" 
    echo "  $0 gandalf.lotr.org sdb" 
    echo "" 
    echo " the needed packages pv and qemu-utils will be installed if not available" 
    echo " you need local sudo rights for this to work" 
    exit 1 
} 

# check arguments 
if [ $# -lt 2 ] 
then 
    usage 
fi 

# get the command line parameters 
host="$1" 
disk="$2" 

# calculate the names of the image files 
ts=`date "+%Y-%m-%d"` 
# prefix of all images 
# .gz the zipped dd 
# .dd the disk dump file 
# .vmware - the vmware disk file 
image="${host}_${disk}_image_$ts" 

echo "$0 $host/$disk -> $image" 

# first check/install necessary packages 
opt_install qemu-img qemu-utils 
opt_install pv pv 

# check if dd files was already loaded 
# we don't want to start this tedious process twice if avoidable 
if [ ! -f $image.gz ] 
then 
    getdump $host $disk $image.gz 
else 
    echo "$image.gz already downloaded" 
fi 

# check if the dd file was already uncompressed 
# we don't want to start this tedious process twice if avoidable 
if [ ! -f $image.dd ] 
then 
    echo "uncompressing $image.gz" 
    zcat $image.gz | pv -cN zcat > $image.dd 
else 
    echo "image $image.dd already uncompressed" 
fi 
# check if the vmdk file was already converted 
# we don't want to start this tedious process twice if avoidable 
if [ ! -f $image.vmdk ] 
then 
    vmware_convert $image.dd $image.vmdk 
else 
    echo "vmware image $image.vmdk already converted" 
fi 
+0

für MacOS können Sie apt-get install mit sudo port install ändern und anstelle von qemu-utils benötigen Sie qemu dann ... –