From qcow to vmdk and vdi

virtualizationPuò capitare di dover convertire le immagini utilizzate col nostro virtualizzatore (nel mio caso KVM con QEMU) nel formato utilizzato da un’altro e viceversa.

Di seguito parlerò delle operazioni da svolgere nel caso in cui ci si trovi a dover migrare un’immagine disco dal formato qcow (utilizzato da qemu) al formato vmdk (utilizzato da VMware) e vdi (utilizzato da VirtualBox), negli esempi che seguiranno è stato utilizzato come sistema operativo linux sia dal guest che dall’host.

Magari alcuni di voi si chiederanno perché esempi con linux come host e guest? Semplice! lato host godremo della praticità e della capacità di sintesi della shell, lato guest eviteremo problemi con hal, acpi e apic che invece affliggono le varie versioni di Windows, inutili da risolvere ai fini di questo howto. Comunque anche se sull’host avete Windows quanto segue è sempre valido, vi basta solo avviare il prompt dei comandi!

NOTA: se il vostro problema è la conversione da vmdk a qcow e vdi potreste trovare interessante il post gemello “from-vmdk-to-qcow-and-vdi“.

NOTA: se siete interessati alla conversione da vdi a qcow date un’occhiata a questo post del buon Noko.

From qcow to vmdk

Una breve parentesi: se volete visualizzare le caratteristiche di un file immagine il comando qemu-img col parametro info seguito dal nome del file immagine permette di mostrare alcune informazioni, formato, dimensione massima, spazio realmente occupato e dimensioni dei cluster. Ecco un esempio:

paolomargara@mrcrow:~$ qemu-img info lennybox.img
image: lennybox.img
file format: qcow
virtual size: 3.0G (3221225472 bytes)
disk size: 2.9G
cluster_size: 4096

In questo particolare caso la conversione di formato è molto semplice da ottenere, è sufficiente utilizzare qemu-img con l’opzione convert, seguito dal nome dell’immagine che vogliamo convertire, seguito a sua volta dal parametro -O e dal nome del formato dell’immagine risultante (nel nostro caso vmdk) ed infine il nome dell’immagine risultante. Ecco un esempio:

paolomargara@mrcrow:~$ qemu-img convert lennybox.img -O vmdk lennybox.vmdk

Una volta effettuata la conversione il risultato è il seguente:

paolomargara@mrcrow:~$ qemu-img info lennybox.vmdk
(VMDK) image open: flags=0x2 filename=lennybox.vmdk
image: lennybox.vmdk
file format: vmdk
virtual size: 3.0G (3221225472 bytes)
disk size: 2.8G

Ora siamo pronti per avviare la nostra macchina virtuale con VMware oppure con un altro virtualizzatore in grado di supportare questo formato (lo stesso QEMU o VirtualBox giusto per citarne un paio).

From qcow to vdi

La conversione da qcow a vdi richiede qualche passaggio in più rispetto a quanto visto in precedenza. Per questo esempio l’immagine di partenza è la stessa utilizzata nell’esempio precedente, di seguito le informazioni principali:

paolomargara@mrcrow:~$ qemu-img info lennybox.img
image: lennybox.img
file format: qcow
virtual size: 3.0G (3221225472 bytes)
disk size: 2.9G
cluster_size: 4096

Per passare da qcow a vdi e necessario effettuare una conversione intermedia al formato raw. L’immagine raw non è altro che il contenuto dell’immagine della macchina virtuale in binario (simile concettualmente ad un dd). Come è evidenziato dall’output di qemu-img eseguito col parametro convert, l’immagine occupa esattamente lo spazio del disco virtuale come ogni dd che si rispetti.

paolomargara@mrcrow:~$ qemu-img convert lennybox.img -O raw /media/sda5/lennybox.raw
paolomargara@mrcrow:~$ qemu-img info /media/sda5/lennybox.raw
image: /media/sda5/lennybox.raw
file format: raw
virtual size: 3.0G (3221225472 bytes)
disk size: 3.0G

Ora è possibile effettuare la conversione a vdi con il comado VBoxManage (fornito con il package di VirtualBox) seguito dal parametro convertdd, dal nome dell’immagine sorgente e di quella di origine.

paolomargara@mrcrow:~$ VBoxManage convertdd /media/sda5/lennybox.raw /media/sda5/lennybox.vdi
VirtualBox Command Line Management Interface Version 1.6.0
(C) 2005-2008 Sun Microsystems, Inc.
All rights reserved.

Converting VDI: from DD image file="/media/sda5/lennybox.raw" to file="/media/sda5/lennybox.vdi"...
Creating fixed image with size 3221225472 bytes (3072MB)...

Equivalente del parametro info di qemu-img è il parametro showvdiinfo di VBoxManage. Ecco il suo output a mostrare il successo dell’operazione appena compiuta, da notare che lo spazio occupato è esattamente la dimensione massima dell’immagine del disco:

paolomargara@mrcrow:~$ VBoxManage showvdiinfo /media/sda5/lennybox.vdi
VirtualBox Command Line Management Interface Version 1.6.0
(C) 2005-2008 Sun Microsystems, Inc.
All rights reserved.

UUID:                 2413e42a-ba0a-47c6-7881-4ab5361c1e1f
Registered:           yes
Accessible:           yes
Size:                 3072 MBytes
Current size on disk: 3072 MBytes
Type:                 standard
Storage type:         Virtual Disk Image (VDI)
In use by VM:         a985a9dd-6541-4a04-59ac-84c9616e4d92
Path:                 /media/sda5/lennybox.vdi

A questo punto è possibile effettuare un ridimensionamento a quella che è la dimensione realmente occupata dai dati contenuti all’interno dell’immagine…

paolomargara@mrcrow:~$ VBoxManage modifyvdi /media/sda5/lennybox.vdi compact
VirtualBox Command Line Management Interface Version 1.6.0
(C) 2005-2008 Sun Microsystems, Inc.
All rights reserved.

Shrinking '/media/sda5/lennybox.vdi': 0%..........10%.........20%.........30%.........40%.........50%.........60%.........70%.........80%.........90%.........100%

Ecco infine il risultato finale, da notare la differenza fra size e Current size on disk.

paolomargara@mrcrow:~$ VBoxManage showvdiinfo /media/sda5/lennybox.vdi
VirtualBox Command Line Management Interface Version 1.6.0
(C) 2005-2008 Sun Microsystems, Inc.
All rights reserved.

UUID:                 2413e42a-ba0a-47c6-7881-4ab5361c1e1f
Registered:           yes
Accessible:           yes
Size:                 3072 MBytes
Current size on disk: 2945 MBytes
Type:                 standard
Storage type:         Virtual Disk Image (VDI)
In use by VM:         a985a9dd-6541-4a04-59ac-84c9616e4d92
Path:                 /media/sda5/lennybox.vdi

Ora siamo pronti per avviare la nostra macchina virtuale all’interno di VirtualBox!

Related post:

2 Comments

  1. Noko says:

    Ma spiegami: qemu è in grado di avviare immagini VMDK nativamente, evinco dal post, ma vmware in quale formato salva di default? Il fatto è che volevo appunto tentare di avviare delle immagini fatte con vmware usando qemu, ma non ci ho mai perso del tempo dietro per capire se e come si poteva fare…

  2. MRG says:

    Qemu è in grado di avviare le immagini vmdk quando sono su singolo file, il fatto è che se eventualmente hai immagini “multipart” per avviarle hai bisogno di compattarle in un’unico file.
    VMWare salva in vmdk vmx a secondadelle versioni.