VirtualBox et le problème du “Cannot register hard disk because … UUID … already exists”

Lorsque vous dupliquez un disque virtuel (copier/coller d’un fichier vdi ou vhd) pour l’utiliser dans virtualbox, vous allez être confronté au problème de l’identifiant du disque qui doit être unique.

Pour éviter d’être confronté au problème vous pouvez utiliser la commande permettant de cloner un disque fournie dans l’outil VBoxManage en ligne de commande. Cette commande lors de la copie du disque va changer l’UUID du disque de manière à ne pas avoir ce problème.

VBoxManage clonehd chemin_disque_source chemin_disque_a_copier

Mais bien souvent on effectue d’abord la copie du disque et ensuite on se rend compte du problème. Le plus simple est alors de changer cet UUID sur la copie, ce qui est souvent bien moins long que de lancer une commande ‘clonehd’ du disque. Et la encore une commande existe pour simplement changer l’UUID d’un disque existant :

VBoxManage internalcommands sethduuid chemin_du_disque_copié

VirtualBox Headless et ajouter des périphériques USB sous Windows

Un petit script pour répondre a une problématique, comment ajouter en script un périphérique USB à une machine Virtuelle à l’aide de VirtualBox ?

Si vous exploitez une machine déportée pour héberger vos machines virtuelles, vous utilisez sans doute VBoxHeadless et un accès TSE pour accéder à ces dernières.

Mais comment connecter vos périphériques USB lorsque vous n’avez plus d’interface graphique ? Dans VirtualBox une série d’exécutables en ligne de commande est prévu pour effectuer des actions sur ces machines.

Dans ce cas précis, VBoxManage va nous servir.

Voici les commandes que vous utiliserez :


C:\VBox>VBoxManage list usbhost

Host USB Devices:

UUID: 00f631b2-118c-40f3-a5b6-9c5cc654c743
VendorId: 0x041e (041E)
ProductId: 0x401d (401D)
Revision: 0.1 (0001)
Manufacturer: Creative
Product: Creative WebCam NX Ultra
Current State: Available

l’utilisation de la commande :

VBoxManage controlvm "nom de ma vm" usbattach 00f631b2-118c-40f3-a5b6-9c5cc654c743

permet d’attacher la webcam à la machine virtuelle. Mais cet UUID change régulièrement donc difficile de créer un script simple.

J’ai donc créé un javascript vous permettant à partir du nom du produit d’ajouter le périphérique usb à la machine virtuelle.


cscript InstallByUUID.wsf "Creative WebCam NX Ultra" "nom de ma vm"

Contenu du script ( InstallByUUID.wsf ) :

<job>
<script language="JScript">

        var tmppath = "c:\\temp";
        var wtattach = "";

        var lastUUID = "";
        var producttofind = "";
        var found = false;

        function FindUUID(lineinfo)
        {
                if (lineinfo.indexOf('UUID:')==0)
                {
                        lastUUID = lineinfo.substring(20,56);
                }
                if (lineinfo.indexOf('Product:')==0)
                {
                        var product = lineinfo.substring(20);
                        if (product == producttofind)
                                found = true;
                }
        }

        if (WScript.Arguments.length<2)         {                 WScript.echo("InstallByUUID.wsf [ProductNameofUSBItem] [NameOfVmToAttach]");                 exit(0);         }                  producttofind = WScript.Arguments(0);                          var objShell = WScript.CreateObject("WScript.Shell");         objShell.Run('cmd /C ""c:\\Program Files\\Oracle\\VirtualBox\\VBoxManage.exe" list usbhost > '+tmppath+'\\usbatach.txt"', 0, 1);

        var objFileSystem = WScript.CreateObject("Scripting.FileSystemObject");
        var objFile = objFileSystem.OpenTextFile(tmppath+'\\usbatach.txt');
        while ((!objFile.AtEndOfStream)&&(!found))
        {
                FindUUID( objFile.ReadLine( ));
        }
        objFile.Close();

        objFileSystem.DeleteFile(tmppath+'\\usbatach.txt');

        if (!found)
        {
                WScript.echo(producttofind +' n\'a pas été trouvé');
        }

        var runcmd = 'cmd /C ""c:\\Program Files\\Oracle\\VirtualBox\\VBoxManage.exe" controlvm "'+WScript.Arguments(1)+'" usbattach '+lastUUID+'"';
        objShell.Run(runcmd, 0, 1);
        //WScript.echo(runcmd);
</script>
</job>