Cómo combinar una instantánea arbitraria en vdi base en Virtualbox

14

Fallé la transferencia de una máquina virtual de un disco duro a otro. Ahora me quedo con la base vdi y un montón de instantáneas.

Mis pasos

  • Copié el antiguo directorio de VM en el nuevo HDD
  • Se eliminó la VM anterior y se agregó una nueva VM utilizando Machine-> add y proporcionando el archivo XML anterior
  • No se pudo agregar el archivo base vdi debido a un conflicto, por lo que se cambió el UUID de base vdi con

    VBOXMANGE.EXE internalcommands sethduuid  <path/to/vdi>
    
  • Intenta revertir a una instantánea, pero parece que la máquina virtual está buscando las instantáneas en el disco duro antiguo (que está formateado y desapareció)

Este es el error (en red es el nombre):

Failed to restore the snapshot networked of the virtual machine lfs.

Could not open the medium 'H:\vm\ft.vdi'.

VD: error VERR_PATH_NOT_FOUND opening image file 'H:\vm\ft.vdi' (VERR_PATH_NOT_FOUND).

Result Code: E_FAIL (0x80004005)
Component: Medium
Interface: IMedium {53f9cc0c-e0fd-40a5-a404-a7a5272082cd}

El disco duro antiguo era la unidad H: el nuevo es la unidad N:

¿Cómo puedo modificar las instantáneas / VM para buscar N:\vm\ft.vdiel vdi base? Ya he establecido la configuración predeterminada en VirtualBox en general (ubicación de instantánea vm / vm predeterminada).

O si no es así, ¿cómo puedo fusionar la antigua instantánea con el vdi base dado que las únicas cosas que han cambiado es el UUID del vdi base?

jmathew
fuente

Respuestas:

10

Así es como resolví mi problema.

Primero deshice cambiar el UUID en mi archivo VDI base usando el script de jordoncm

Luego intenté simplemente cambiar las rutas en el archivo vbox para que coincida con la nueva ubicación. Eso no funcionó ya que aparecieron varios errores diferentes y ni siquiera pude agregar la VM usando el archivo vbox.

Entonces encontré este artículo de blog de Peter Porter que sugirió:

Como cada .vdi contiene solo aquellos sectores modificados desde el último .vdi, copiar los .vdi en orden cronológico debería proporcionarnos un .vdi que contenga una copia completa de todas las instantáneas anteriores.

...

Use el comando "VBoxManage clonehd" para crear un nuevo archivo .vdi basado en su original, luego agregue en cada archivo posterior usando el argumento "–existente" para simplemente agregar los datos al .vdi existente que está creando. La siguiente lista de comandos se basa en mi ejemplo anterior:

VBoxManage clonehd Machine.vdi Machine-full.vdi

VBoxManage clonehd Instantáneas {UUID1} .vdi Machine-full.vdi

VBoxManage clonehd Instantáneas {UUID2} .vdi Machine-full.vdi

VBoxManage clonehd Instantáneas {UUID3} .vdi Machine-full.vdi

VBoxManage clonehd Instantáneas {UUID4} .vdi Machine-full.vdi

Esto le dará un archivo "Machine-full.vdi" que representa el estado completo de su máquina en el estado activo sin ninguna relación con los archivos .vdi primarios. Ahora puede usar este archivo "Machine-full.vdi" en una nueva máquina virtual o editar su VM existente, eliminando el archivo .vdi anterior y agregando este .vdi.

Con un poco de ajustes que parecían funcionar para mí:

Este es el disco duro y sus instantáneas:

<HardDisk uuid="{ed1428ca-76be-440a-894b-e666b50f5c86}" location="H:/vm/ft.vdi" format="VDI" type="Normal">
          <HardDisk uuid="{8d8be78f-6648-4503-bee3-8810cb853a99}" location="Snapshots/{8d8be78f-6648-4503-bee3-8810cb853a99}.vdi" format="VDI">
            <HardDisk uuid="{cce0ee4f-5052-4be7-81ff-47ea08202716}" location="Snapshots/{cce0ee4f-5052-4be7-81ff-47ea08202716}.vdi" format="VDI">
              <HardDisk uuid="{c297d4b9-972d-4b07-a839-5d76ee8d0387}" location="Snapshots/{c297d4b9-972d-4b07-a839-5d76ee8d0387}.vdi" format="VDI">
                <HardDisk uuid="{8e9ca914-648f-464c-b515-2606c644d7f0}" location="Snapshots/{8e9ca914-648f-464c-b515-2606c644d7f0}.vdi" format="VDI"/>
              </HardDisk>
            </HardDisk>
          </HardDisk>
        </HardDisk>

Estos son los comandos que ejecuté (lo siento, algunos de ellos están cortados en sus ventanas ...):

C:\Program Files\Oracle\VirtualBox>VBoxManage clonehd N:\vm\ft.vdi N:\vm\ft_full.vdi
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone hard disk created in format 'VDI'. UUID: a7fb5e25-c248-4644-a898-f1e26f6570a4

C:\Program Files\Oracle\VirtualBox>VBoxManage clonehd "N:\vm\VirtualBox       VMs\lfs\Snapshots\{8d8be78f-6648-4503
VBoxManage.exe: error: Parent medium with UUID {ed1428ca-76be-440a-894b-e666b50f5c86} of the medium 'N:\vm\Vi
03-bee3-8810cb853a99}.vdi' is not found in the media registry ('C:\Users\   <user>/.VirtualBox\VirtualBox.xml')
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component Medium, interface    IMedium, callee IUnknow
Context: "OpenMedium(Bstr(pszFilenameOrUuid).raw(), enmDevType, AccessMode_ReadWrite,   fForceNewUuidOnOpen, pM
xManageDisk.cpp

Crap parece que necesito agregar una entrada en VirtualBox.xml en MediaRegistry-> HardDisks, pero tengo que asegurarme de agregarle cada instantánea en orden cronológico después de cada copia. Entonces es así:

Copy VM
Add entry to VirtualBox.xml
Copy VM ...

Y el resto de lo que hice en caso de que ayude a alguien más:

C:\Program Files\Oracle\VirtualBox>VBoxManage clonehd --existing "N:\vm\VirtualBox   VMs\lfs\Snapshots\{8d8be78
_full.vdi
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone hard disk created in format 'VDI'. UUID: a7fb5e25-c248-4644-a898-f1e26f6570a4

C:\Program Files\Oracle\VirtualBox>VBoxManage clonehd --existing "N:\vm\VirtualBox   VMs\lfs\Snapshots\{cce0ee4f-5052-4be7-81ff-47ea08202716}.vdi" N:\vm\ft_full.vdi
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone hard disk created in format 'VDI'. UUID: a7fb5e25-c248-4644-a898-f1e26f6570a4

C:\Program Files\Oracle\VirtualBox>VBoxManage clonehd --existing "N:\vm\VirtualBox VMs\lfs\Snapshots\{c297d4b9-972d-4b07-a839-5d76ee8d0387}.vdi" N:\vm\ft_full.vdi
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone hard disk created in format 'VDI'. UUID: a7fb5e25-c248-4644-a898-f1e26f6570a4

C:\Program Files\Oracle\VirtualBox>VBoxManage clonehd --existing "N:\vm\VirtualBox VMs\lfs\Snapshots\{8e9ca914-648f-464c-b515-2606c644d7f0}.vdi" N:\vm\ft_full.vdi
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone hard disk created in format 'VDI'. UUID: a7fb5e25-c248-4644-a898-f1e26f6570a4

Y luego simplemente creé una nueva VM usando ft_full.vdi como base. Coincidió con el resto de la configuración en el panel de configuración de GUI.

jmathew
fuente
1
Parece que usted podría hacerlo mucho más rápido superuser.com/questions/590968/...
Andrey Regentov
4

Acabo de pasar por este dolor de cabeza y hay una solución aparentemente estúpida. Lástima que me llevó un día completo llegar aquí.

Si observa los comandos internos de VBoxManage.exe dumphdinfo , puede ver que cada VDI tiene información sobre su padre. Entonces, lo que hice fue crear una máquina en blanco y agregar Parent HD "roto" como unidad secundaria. Eso lo colocó en Media Manager.

Luego, agregué un controlador SATA a la VM en blanco y agregué la instantánea de la capa 3. Haga clic en Aceptar. Edite nuevamente y agregue la instantánea de la capa 2, haga clic en Aceptar. Edite, agregue la captura instantánea de la capa 1.

Esto los convierte en unidades individuales dentro de la VM, pero dentro de Media Manager están todos unidos entre sí.

El último paso es simplemente eliminar la máquina virtual del banco y agregar su máquina virtual anterior. Hecho ... y sí, es así de estúpido / simple.

c:\Program Files\Oracle\VirtualBox>VBoxManage.exe internalcommands dumphdinfo D:
\Virtual_box\Virtual_box_HD_C.vdi

1 Header: uuidCreation={13ea5785-58db-4ad9-8459-9b13d89a3aaa}
1 Header: uuidModification={b1bfd84d-6fcc-4640-80fc-b7c1a6b929cb}
1 Header: uuidParent={19ed1b87-d127-402d-b463-59899c683a47}
  2 Header: uuidCreation={19ed1b87-d127-402d-b463-59899c683a47}
  2 Header: uuidModification={709f1fad-68a3-47c7-9336-f3409fcae95b}
  2 Header: uuidParent={436c1ffd-04ee-4d6b-968c-de95e65d8a5a}
    3 Header: uuidCreation={436c1ffd-04ee-4d6b-968c-de95e65d8a5a}
    3 Header: uuidModification={049d869e-89c2-48aa-b0cc-eb324895f3b9}
    3 Header: uuidParent={e09c65f4-828d-4a53-8ecc-20365d43a52e}
      4 Header: uuidCreation={e09c65f4-828d-4a53-8ecc-20365d43a52e}
      4 Header: uuidModification={6c397704-fe65-4661-b60f-767e207ffb58}
      4 Header: uuidParent={00000000-0000-0000-0000-000000000000}
Nunca coma solo
fuente
Una simplificación fue que simplemente eliminé el archivo principal y luego el archivo de disco de instantánea del administrador de archivos al administrador de disco virtual. Entonces podría abrir el archivo .vbox (tuve que comentar dos líneas que hacen referencia a la carpeta compartida que no existía en mi instalación de Linux.)
zoechi
0

El antiguo nombre de ruta (en la H:unidad) simplemente puede especificarse en el .vboxarchivo de la VM, que es solo un archivo XML. Si es así, puede guardar una copia de ese archivo, editar el nombre de ruta para que sea el nuevo nombre de ruta (el que está en la N:unidad) y ver si soluciona el problema.

Fran
fuente
1
Cambié el atributo relevante en el nodo <HardDisk> y volví a agregar la VM. Sin embargo, devuelve el error: A differencing image of snapshot {xxx} could not be found. Could not find an open hard disk with UUID {yyy}
jmathew
Se me ocurre que quizás pueda volver a configurar el UUID en el disco uuid anterior. ¿Es eso posible?
jmathew
Utilicé el script de este caballero para restablecer el uuid: Configuración del UUID de un VDI de VirtualBox
jmathew