Convertir un ova en vhd
Il est possible que vous ayez un jour dans votre vie, le besoin de convertir un fichier ova (VMWare ou VirtualBox) en fichier vhd(x) (Hyper-v). Voici une solution.
Pré-requis
Avant de commencer, il va falloir installer quelques petits outils :
- Microsoft Virtual Machine Converter
- 7-zip (ou autres outils pour extraire des fichiers)
Extraire le vmdk
La première étape va être d’extraire le fichier vmdk du fichier ova. Heureusement pour nous, un fichier ova n’est pas très compliqué à ouvrir et il suffit d’avoir un logiciel comme 7-zip pour récupérer le fichier.
On voit que le fichier ova se compose d’une fichier ovf et d’un fichier vmdk. Il suffit donc d’extraire le vmdk qui correspond à notre disque dur et le tour est joué !
Utiliser MVMC
Le principe
Il suffit maintenant d’utiliser le petit outil Microsoft Virtual Machine Converter pour arriver à nos fins.
Je ne vais pas vous faire l’affront de vous expliquer comment on l’installe, il n’y a rien de difficile. Il suffit de faire next, next, next, finish 😉
Lançons ensuite une console powershell en mode administrateur et importons le module qui a été installé avec MVMC.
1 |
Import-Module "C:\Program Files\Microsoft Virtual Machine Converter\MvmcCmdlet.psd1" |
Dans ce module, il y a plusieurs fonctions mais principalement, celle qui va nous intéresser est ConvertTo-MvmcVirtualHardDisk
Cette fonction a besoin de deux paramètres
- SourceLiteralPath : Le chemin de notre VMDK
- DestinationLiteralPath : Le chemin du VHD qui va être créé
Auxquels on peut ajouter :
- VhdFormat : Le format du VHD que l’on souhaite, à savoir « Vhd » ou « Vhdx »
- VhdType : Le type de VHD que l’on souhaite, à savoir « FixedHardDisk » ou « DynamicHardDisk » (il y a d’autres options mais celles-ci sont les principales)
Si vous ne vous souvenez pas ce qu’il est possible de mettre comme valeur pour chaque paramètres, n’oubliez pas l’auto-completion avec la tabulation, ça peut aider 😉
Parfois, pour une même machine virtuelle, vous pouvez avoir plusieurs disques vmdk. Il faut alors indiquer le premier disque qui n’est pas numéroté et l’utilitaire se chargera du reste.
Notre commande va ressembler par exemple à ça
1 |
ConvertTo-MvmcVirtualHardDisk -SourceLiteralPath "C:\XXX\YYY.vmdk" -DestinationLiteralPath "C:\Vhds" -VhdType DynamicHardDisk -VhdFormat Vhdx |
Et c’est parti pour la conversion ! Il n’y a pas forcément de feedback visuel et la conversion peut prendre quelques minutes donc n’hésitez pas à aller prendre un café en attendant 😉
La dur réalité
Le problème
Comme ça on pourrait se dire que c’est chouette et que tout fonctionne du premier coup…. Mais nous sommes en informatique et c’est donc rarement le cas 😉
Il est possible que vous ayez des erreurs lorsque vous lancez la conversion, du style :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
ConvertTo-MvmcVirtualHardDisk : The entry YYY is not a supported disk database entry for the descriptor. Au caractère Ligne:1 : 1 + ConvertTo-MvmcVirtualHardDisk -SourceLiteralPath "C:\XXX ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : WriteError: (Microsoft.Accel...nversionService:DriveConversionService) [ConvertTo-MvmcVi rtualHardDisk], VmdkDescriptorParseException + FullyQualifiedErrorId : DiskConversion,Microsoft.Accelerators.Mvmc.Cmdlet.Commands.ConvertToMvmcVirtualHardDiskC ommand ConvertTo-MvmcVirtualHardDisk : Une ou plusieurs erreurs se sont produites. Au caractère Ligne:1 : 1 + ConvertTo-MvmcVirtualHardDisk -SourceLiteralPath "C:\XXX ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : WriteError: (Microsoft.Accel...nversionService:DriveConversionService) [ConvertTo-MvmcVi rtualHardDisk], AggregateException + FullyQualifiedErrorId : DiskConversion,Microsoft.Accelerators.Mvmc.Cmdlet.Commands.ConvertToMvmcVirtualHardDiskC ommand |
Ok j’ai l’impression de m’être fait insulté en danois.
Alors oui c’est pas top niveau compréhension et on se dit qu’on est pas sorti des ronces….
Bon le problème pour faire court c’est quoi ? Et ben il y a dans le « descriptor », une valeur qui ne plait pas. Il va donc falloir la supprimer.
La solution
Et fort heureusement, une solution pas trop compliquée existe. Il va falloir un peu d’huile de coude et un autre petit utilitaire : Dsfok
Ce petit utilitaire permet de récupérer ou d’enregistrer un bloc de données à n’importe quel endroit dans un fichier. Ce qui semble pas mal dans notre cas de figure.
Nous allons donc d’abord extraire le « descriptor » du fichier avec la commande suivante
1 |
.\dsfo.exe "C:\XXX\YYY.vmdk" 512 1024 descriptor1.txt |
Il s’agit ensuite d’éditer le fichier descriptor1.txt et d’enlever ce qui ne va pas. Si on regarde un exemple de fichier comme suit
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# Disk DescriptorFile version=1 CID=XXXXXXX parentCID=ffffffff createType="streamOptimized" # Extent description RDONLY 83886080 SPARSE "XXXXXX.vmdk" # The disk Data Base #DDB ddb.virtualHWVersion = "4" ddb.adapterType="ide" ddb.geometry.cylinders="16383" ddb.geometry.heads="16" ddb.geometry.sectors="63" ddb.geometry.biosCylinders="1024" ddb.geometry.biosHeads="255" ddb.geometry.biosSectors="63" ddb.uuid.image="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" ddb.uuid.parent="00000000-0000-0000-0000-000000000000" ddb.uuid.modification="00000000-0000-0000-0000-000000000000" ddb.uuid.parentmodification="00000000-0000-0000-0000-000000000000" ddb.comment="" |
On peut tranquillement mettre en commentaire tout ce qui concerne le uuid et le comment (en placant un # au début de chacune des lignes qu’on veut commenter).
Les dernières lignes sont donc comme suit après édition
1 2 3 4 5 |
# ddb.uuid.image="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" # ddb.uuid.parent="00000000-0000-0000-0000-000000000000" # ddb.uuid.modification="00000000-0000-0000-0000-000000000000" # ddb.uuid.parentmodification="00000000-0000-0000-0000-000000000000" # ddb.comment="" |
Il y a des valeurs « null » à la fin du fichier. Il n’est pas nécessaire d’y toucher.
On sauvegarde la nouvelle version du fichier et on exécute maintenant une commande pour écrire ce nouveau descriptor dans notre fichier vmdk.
1 |
.\dsfi.exe "C:\XXX\YYY.vmdk" 512 1024 descriptor1.txt |
Et voilà notre vmdk doit être opérationnel. Nous pouvons de nouveau lancer notre commande pour convertir notre vmdk en vhd et ça devrait fonctionner. Les lignes qu’on doit commenter peuvent varier en fonction des vmdk. Il est parfois nécessaire de chercher un peu le soucis avant de trouver la bonne ligne à commenter.
Vous pouvez maintenant créer votre machine virtuelle Hyper-v et attacher le disque Vhd à celle-ci !
Hello,
ton tuto à effectivement fonctionné pour convertir un ova en VHDX,
Merci !
Mais ^^ :
le disque virtuel original contient MAC OS. et l’ordinateur virtuel fraichement créée ne veut pas booter sur le disque converti VHDX.
(j’ai fais une VM de 2éme génération, et j’ai aussi essayé avec une VM de 1ere génération)
Ma question :
as-tu une solution à mon problème ?