Cet article est un mémo de toutes les commandes qui me sont régulièrement utiles quand je manipule des machines virtuelles VirtualBox, VMware et KVM. L'utilitaire qemu-img du paquet qemu-utils (sous Debian) a bien évolué et c'est l'outil de prédilection pour les conversions ; on peut se passer de l'utilitaire VBoxManage (qui fait partie de VirtualBox).
La première approche c'est de créer une VM VirtualBox avec le type de disque natif VDI et de convertir le disque au format QCOW2 avec qemu-img :
qemu-img convert -f vdi -O qcow2 vm-disk.vdi vm-disk.qcow2
Mais si la finalité c'est de mettre au point la VM sous VirtualBox avant de l'installer sous KVM (dans un Proxmox par exemple), on peut plutôt créer une VM VirtualBox directement avec le type de disque QEMU (QCOW) dans VirtualBox.
Ensuite, il reste à convertir le disque du format QCOW vers QCOW2 :
qemu-img convert -O qcow2 vm-disk.qcow vm-disk.qcow2
Le format natif des disques VMware est VMDK. L'utilitaire VBoxManage permet de convertir un fichier VMDK en VDI.
VBoxManage clonehd --format VDI vm-disk.vmdk vm-disk.vdi
Mais qemu-img reste la voie royale pour faire le même boulôt :
qemu-img convert -f vmdk -O vdi vm-disk.vmdk vm-disk.vdi
D'abord exporter la machine au format OVF puis convertir le disque avec l'ami qemu-img :
qemu-img convert -f vmdk -O qcow2 vm-disk.vmdk vm-disk.qcow2
Ensuite, on peut créer une VM avec des caractéristiques semblables dans KVM et attacher le disque.
Lorsque la machine virtuelle a été créée depuis une machine physique par le tryptique : clonezilla / restauration virtualbox / conversion KVM, il se peut que la configuration logique des interfaces réseaux (/etc/network/interfaces sous Debian ou /etc/sysconfig/network-scripts/ifcfg-??? sous RedHat / CentOS) ne correspondent plus aux interfaces physiques. Dans ce cas il faut adapter la configuration UDEV qui s'occupe de réaliser cette correspondance sur la plupart des distributions en éditant le fichier /etc/udev/rules.d/70-persistent-net.rules :
# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.
# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="32:94:32:76:50:6d", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="6a:79:37:a3:24:32", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="fa:a8:8e:cc:fd:69", ATTR{type}=="1", KERNEL=="eth*", NAME="eth2"
# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="ce:1c:8c:c2:fd:f7", ATTR{type}=="1", KERNEL=="eth*", NAME="eth3"
Il ne s'agit pas de modifier la taille du disque virtualisé mais de réduire son encombrement sur le disque hôte par du compactage.
Depuis le système GNU/Linux virtualisé, on nullifie (horrible ce mot) l'espace libre :
dd if=/dev/zero of=/bigemptyfile bs=4096k
rm -rf /bigemptyfile
On stoppe la VM et on utilise vboxmanage pour compacter le disque :
vboxmanage modifyhd disk.vdi --compact
Et pour Ms Windows ? je ne sais pas et ça ne m'intéresse pas (troll inside)