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.


Tal vez pueda interesarte


Compartí este artículo