2009-01-18 9 views
49

Tengo algunas imágenes de Linux distribuido en formato de archivo plano, pueden ser usadas por máquinas virtuales bochs, pero necesito ejecutarlas con Sun Virtual Box. Virtual Box no puede usar imágenes en este formato, por lo que necesito convertir estas imágenes de un archivo plano a formato de archivo .vmdk. ¿Hay alguna manera de hacer esto?Cómo convertir imágenes planas de discos en vmdk para virtuales o vmplayer?

+0

potencialmente útil: http://en.wikipedia.org/wiki/Physical-to-Virtual – isuldor

+1

Una palabra de advertencia al usar '' 'qemu-img''' para convertir imágenes para usar con VMWare Fusion - Fusion no le gustan los discos que no tienen el tamaño exacto del megabyte. Si tiene una imagen así, asegúrese de cambiar el tamaño al megabyte más cercano primero y luego conviértalo al formato vmdk.De lo contrario, se generará una vmdk que se puede conectar a una VM en el momento de la instalación, pero cualquier intento de agregarla a una VM en un momento posterior dará como resultado que el botón Aplicar no funcione. – Anon

+1

Gracias por este comentario. Estaba luchando para descubrir por qué el botón 'Apply' no funcionaba. Me llevó unos minutos descubrir cómo aumentar el tamaño del archivo al megabyte más cercano. Así es como lo hice. Mi archivo debe expandirse en 600 kilobytes. Este comando hizo el trabajo 'dd if =/dev/zero count = 600 bs = 1k >> image.dd' –

Respuesta

73

apt-get install qemu (QEMU instala en Debian/Ubuntu)

A continuación, ejecute el siguiente comando: qemu-img convert -O vmdk imagefile.dd vmdkname.vmdk

Estoy asumiendo una imagen de disco plano es una imagen de estilo dd. La operación de conversión también maneja muchos otros formatos.

+4

¿Debería ser una imagen de disco o también se podría usar una imagen de partición? –

+3

Es suficiente instalar qemu-utils (apt-get install qemu-utils). Esta solución funciona bien (aunque un poco lenta ...) – akw

+0

Creé un script bash para automatizar el proceso - ver mi respuesta @krosenvold - gracias, esto funcionó muy bien –

1

Tal vez deberías probar usar Starwind V2V Converter, puedes obtenerlo aquí - http://www.starwindsoftware.com/converter. También es compatible con el formato de disco IMG y realiza la conversión sector por sector entre IMG, VMDK o VHD en y desde cualquiera de ellos sin realizar ningún cambio en la imagen de origen. Esta herramienta es gratuita :)

6

En Windows, use https://github.com/Zapotek/raw2vmdk para convertir archivos raw creados por dd o winhex a vmdk. raw2vmdk v0.1.3.2 tiene un error: una vez que se crea el archivo vmdk, edite el archivo vmdk y corrija la ruta al archivo sin formato (en mi caso en lugar de D: \ Temp \ flash_16gb.raw (creado por winhex) el generado la ruta fue D: Tempflash_16gb.raw). Luego, ábralo en una máquina virtual vmware versión 6.5-7 (5.1 se negaba a adjuntar el disco duro vmdk). ¡cómo!

+0

¿por qué no downvote no comentado? – xhafan

71

Dado que la cuestión menciona VirtualBox, esto se trabaja actualmente:

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

ejecutarlo sin argumentos a favor de algunos detalles interesantes (sobre todo la bandera --variant): respuesta

VBoxManage convertfromraw 
+3

En mi humilde opinión esta es una solución más limpia ya que solo necesita las herramientas de Vbox, y se supone que vbox ya está allí. –

+4

+1 y VBoxManage también se pueden usar para convertir de la otra manera (imagen virtual a raw) 'VBoxManage clonehd --format raw vmdiskimage.vmdk imagefile.dd' – karmakaze

+0

+1 porque usar herramientas de caja virtual es más probable que lo haga funcionar con cuadro virtual (en caso de que haya alguna rareza sobre la forma en que hace las cosas) – MikeKulls

1

de krosenvold inspiró la siguiente secuencia de comandos que hace lo siguiente:

  • obtener el dd volcado a través de ssh f rom un servidor remoto (como archivo gz)
  • descomprimir el vertedero
  • convertirlo en VMware

la secuencia de comandos se puede reiniciar y se comprueba la existencia de los archivos intermedios. También usa pv y qemu-img -p para mostrar el progreso de cada paso.

En mi entorno de 2 x Ubuntu 12.04 LTS los pasos tomaron:

  • de 3 horas para obtener un volcado del disco 47 Gbyte de una partición de 60 Gbyte
  • de 20 minutos para descomprimir un archivo dd 60 Gbyte
  • 45 minutos en crear el archivo VMware
#!/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

para MacOS es posible que desee cambiar apt-get install con sudo port install y en lugar de qemu-utils necesita qemu entonces ... –

Cuestiones relacionadas