Tuve la necesidad de duplicar una imagen de disco VDI (Virtual Disk Image) de VirtualBox. Sin embargo, al tratar de utilizar el disco copiado, surgió un error. Esto se debe a que VirtualBox no permite utilizar UUID de discos repetidos (deben ser únicos).
Los UUID (Universally Unique Identifier) son identificadores únicos universales. Permiten identificar un medio o dispositivo mediante un identificador numérico (valga la redundancia). Por definición deben ser únicos dentro de un mismo sistema.
La solución rápida a este problema consiste en asignar un nuevo UUID al disco copiado.
Tengo las siguientes imágenes de disco VDI en un directorio:
root@hal9000:/data/VM# ls -l *.vdi -rw------- 1 emi emi 1445986304 Feb 4 09:30 devuan_beowulf.vdi -rw------- 1 emi emi 12509511680 Apr 24 2019 Devuan.vdi -rw------- 1 emi emi 1491075072 Feb 4 10:05 monitor.vdi -rw------- 1 emi emi 1445986304 Feb 4 10:04 servidor.vdi -rw------- 1 emi emi 12416188416 Dec 11 2018 w7.vdi
El utilitario vboxmanage
(también referido como VBoxManage
) es, en los sistemas GNU/Linux, un enlace simbólico al script VBox
. El comando interno dumphdinfo
permite obtener información de un disco virutal:
root@hal9000:/data/VM# VBoxManage internalcommands dumphdinfo monitor.vdi --- Dumping VD Disk, Images=1 Dumping VD image "monitor.vdi" (Backend=VDI) Dumping VDI image "monitor.vdi" mode=r/o uOpenFlags=9 File=0x0055dba1af2210 Header: Version=00010001 Type=1 Flags=0 Size=17179869184 Header: cbBlock=1048576 cbBlockExtra=0 cBlocks=16384 cBlocksAllocated=1420 Header: offBlocks=1048576 offData=2097152 Header: Geometry: C/H/S=1024/255/63 cbSector=512 Header: uuidCreation={3c1d903d-f7c8-45d8-90d8-5b30e63aa7c4} Header: uuidModification={8b5bf00c-6f5d-4e02-a147-3f079865c0f3} Header: uuidParent={00000000-0000-0000-0000-000000000000} Header: uuidParentModification={00000000-0000-0000-0000-000000000000} Image: fFlags=00000000 offStartBlocks=1048576 offStartData=2097152 Image: uBlockMask=000FFFFF cbTotalBlockData=1048576 uShiftOffset2Index=20 offStartBlockData=0
En esta salida, el uuid es el valor (numérico y separado con guiones) almacenado en la variable uuidCreation
.
root@hal9000:/data/VM# VBoxManage internalcommands dumphdinfo servidor.vdi --- Dumping VD Disk, Images=1 Dumping VD image "servidor.vdi" (Backend=VDI) Dumping VDI image "servidor.vdi" mode=r/o uOpenFlags=9 File=0x0055e3d9515150 Header: Version=00010001 Type=1 Flags=0 Size=17179869184 Header: cbBlock=1048576 cbBlockExtra=0 cBlocks=16384 cBlocksAllocated=1377 Header: offBlocks=1048576 offData=2097152 Header: Geometry: C/H/S=1024/255/63 cbSector=512 Header: uuidCreation={3c1d903d-f7c8-45d8-90d8-5b30e63aa7c4} Header: uuidModification={fea304e5-bf53-49f7-a521-6b4dcbb61d75} Header: uuidParent={00000000-0000-0000-0000-000000000000} Header: uuidParentModification={00000000-0000-0000-0000-000000000000} Image: fFlags=00000000 offStartBlocks=1048576 offStartData=2097152 Image: uBlockMask=000FFFFF cbTotalBlockData=1048576 uShiftOffset2Index=20 offStartBlockData=0
Se observa que ambos discos VDI (monitor.vdi
y servidor.vdi
) tienen el mismo uuid "3c1d903d-f7c8-45d8-90d8-5b30e63aa7c4".
El disco monitor.vdi
está actualmente en uso en una máquina virtual. El disco servidor.vdi
es la copia que se desea agregar. Sin embargo, al tener el mismo uuid, falla al intentar agregarlo desde el gestor de medios virtuales del host:

El error arrojado es "Cannot register the hard disk X because a hard disk Y with UUID abc already exists."

Esto significa que ya existe un disco con el mismo UUID.
Para resolver este inconveniente, es necesario entonces cambiar el uuid de la copia por uno nuevo. A tal fin, se dispone del comando "sethduuid":
root@hal9000:/data/VM# VBoxManage internalcommands sethduuid servidor.vdi UUID changed to: a821680d-48a0-46d0-94b2-6925314c6723
De esta forma se establece un nuevo uuid. Notar el nuevo valor de la variable uuidCreation
:
root@hal9000:/data/VM# VBoxManage internalcommands dumphdinfo servidor.vdi --- Dumping VD Disk, Images=1 Dumping VD image "servidor.vdi" (Backend=VDI) Dumping VDI image "servidor.vdi" mode=r/o uOpenFlags=9 File=0x0055f0fcc0fa30 Header: Version=00010001 Type=1 Flags=0 Size=17179869184 Header: cbBlock=1048576 cbBlockExtra=0 cBlocks=16384 cBlocksAllocated=1377 Header: offBlocks=1048576 offData=2097152 Header: Geometry: C/H/S=1024/255/63 cbSector=512 Header: uuidCreation={a821680d-48a0-46d0-94b2-6925314c6723} Header: uuidModification={fea304e5-bf53-49f7-a521-6b4dcbb61d75} Header: uuidParent={00000000-0000-0000-0000-000000000000} Header: uuidParentModification={00000000-0000-0000-0000-000000000000} Image: fFlags=00000000 offStartBlocks=1048576 offStartData=2097152 Image: uBlockMask=000FFFFF cbTotalBlockData=1048576 uShiftOffset2Index=20 offStartBlockData=0
Cómo clonar un disco VDI
De forma correcta, para evitar este inconveniente. Se debe recurrir al comando interno "clonemedium":
emi@hal9000:/data/VM$ vboxmanage clonemedium disk devuan_beowulf.vdi nuevo.vdi 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100% Clone medium created in format 'VDI'. UUID: f3efd111-293c-4514-a6f9-8ac976bf7682
Este comando copia un archivo VDI estableciendo un nuevo uuid:
emi@hal9000:/data/VM$ vboxmanage internalcommands dumphdinfo nuevo.vdi | grep uuid Header: uuidCreation={f3efd111-293c-4514-a6f9-8ac976bf7682} Header: uuidModification={fea304e5-bf53-49f7-a521-6b4dcbb61d75} Header: uuidParent={00000000-0000-0000-0000-000000000000} Header: uuidParentModification={00000000-0000-0000-0000-000000000000}
A su vez lo agrega automáticamente a la biblioteca de medios virtuales:
emi@hal9000:/data/VM$ vboxmanage list hdds | grep "^UUID\|Location\|^$" UUID: 3c1d903d-f7c8-45d8-90d8-5b30e63aa7c4 Location: /data/VM/devuan_beowulf.vdi UUID: f3efd111-293c-4514-a6f9-8ac976bf7682 Location: /data/VM/nuevo.vdi UUID: 315b1280-3ed2-43e7-a288-dffc84cb49dc Location: /data/VM/Devuan/Devuan.vdi UUID: 1a983bf9-9a1d-474b-9f3e-33f8485eac9a Location: /data/VM/Devuan/test.vdi UUID: a530f241-6726-4781-93cb-06fa883af3aa Location: /data/VM/monitor.vdi UUID: a821680d-48a0-46d0-94b2-6925314c6723 Location: /data/VM/servidor.vdi

Para más información, consultar la ayuda de VBox
ejecutando vboxmanage help
.