Come unire istantanee arbitrarie in vdi di base in Virtualbox


14

Ho fallito il trasferimento di una VM da un disco rigido all'altro. Ora sono rimasto con il vdi di base e un sacco di istantanee.

I miei passi

  • Copia della vecchia directory VM sul nuovo HDD
  • Eliminata la vecchia VM e aggiunta nuova VM usando Machine-> add e fornendo il vecchio file XML
  • Impossibile aggiungere il file vdi di base a causa di un conflitto, quindi ho cambiato l'UUID di vdi di base con

    VBOXMANGE.EXE internalcommands sethduuid  <path/to/vdi>
    
  • Tentativo di eseguire il rollback a un'istantanea, ma sembra che la VM stia cercando le istantanee sul vecchio HDD (che è formattato e sparito)

Questo è l'errore (in rete è il nome):

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}

Il vecchio HDD era l'unità H: il nuovo è l'unità N:

Come posso modificare le istantanee / VM per cercare N:\vm\ft.vdiil vdi di base? Ho già impostato le impostazioni predefinite in VirtualBox in generale (posizione dell'istantanea vm / vm predefinita).

O se non come posso unire la vecchia istantanea con il vdi di base dato che l'unica cosa che è cambiata è l'UUID del vdi di base?

Risposte:


10

Ecco come ho risolto il mio problema.

Per prima cosa ho annullato la modifica dell'UUID sul mio file VDI di base usando lo script di jordoncm

Quindi ho provato semplicemente a cambiare i percorsi nel file vbox in modo che corrispondessero alla nuova posizione. Ciò non ha funzionato quando sono comparsi vari errori diversi e non sono stato nemmeno in grado di aggiungere la VM usando il file vbox.

Così ho trovato questo articolo del blog di Peter Porter che ha suggerito:

poiché ogni .vdi contiene solo quei settori modificati rispetto all'ultimo .vdi, copiando i .vdi in ordine cronologico dovremmo inviarci un .vdi contenente una copia completa di tutte le istantanee precedenti.

...

Usa il comando "VBoxManage clonehd" per creare un nuovo file .vdi basato sul tuo originale, quindi aggiungi ogni file successivo usando l'argomento "–existing" per aggiungere semplicemente i dati al .vdi esistente che stai costruendo. Il seguente elenco di comandi si basa sul mio esempio sopra:

VBoxManage clonehd Machine.vdi Machine-full.vdi

VBoxManage clonehd Istantanee {UUID1} .vdi Machine-full.vdi

VBoxManage clonehd Istantanee {UUID2} .vdi Machine-full.vdi

VBoxManage clonehd Istantanee {UUID3} .vdi Machine-full.vdi

VBoxManage clonehd Istantanee {UUID4} .vdi Machine-full.vdi

Questo ti darà un file "Machine-full.vdi" che rappresenta lo stato completo della tua macchina nello stato attivo senza alcuna relazione con i file .vdi padre. È ora possibile utilizzare questo file "Machine-full.vdi" su una nuova macchina virtuale o modificare la VM esistente, rimuovendo il vecchio file .vdi e aggiungendo questo .vdi.

Con un po 'di modifiche che sembravano funzionare per me:

Questo è il disco rigido e le sue istantanee:

<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>

Questi sono i comandi che ho eseguito (mi dispiace che alcuni di essi siano tagliati fuori dalle sue finestre ...):

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

Sembra che devo aggiungere una voce in VirtualBox.xml in MediaRegistry-> HardDisks, ma devo assicurarmi di aggiungere ogni istantanea ad esso in ordine cronologico dopo ogni copia. Quindi è così:

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

E il resto di quello che ho fatto nel caso in cui aiuta qualcun altro:

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

E poi ho semplicemente creato una nuova macchina virtuale usando ft_full.vdi come base. Corrisponde al resto delle impostazioni nel riquadro delle impostazioni della GUI.


1
Sembra che tu possa farlo molto più velocemente superuser.com/questions/590968/…
Andrey Regentov,

4

Ho appena avuto questo mal di testa e c'è una soluzione apparentemente stupida. Peccato che mi ci sia voluto un giorno intero per arrivare qui.

Se dai un'occhiata ai comandi interni dumphdinfo di VBoxManage.exe puoi vedere che ogni VDI ha informazioni sul suo genitore. Quindi, quello che ho fatto è stato creare una macchina vuota e ho aggiunto Parent HD "rotto" come unità secondaria. Ciò lo ha inserito in Media Manager.

Quindi, ho aggiunto un controller SATA alla VM vuota e ho aggiunto l'istantanea di livello 3. Clicca ok Modifica di nuovo e aggiungi un'istantanea di livello 2, fai clic su OK. Modifica, aggiungi istantanea di livello 1.

Ciò li rende unità individuali all'interno della VM, ma all'interno di Media Manager sono tutte collegate tra loro.

Il passaggio finale è semplicemente eliminare la VM della banca e aggiungere la vecchia VM. Fatto ... e sì, è così stupido / semplice.

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}

Una semplificazione è stata che ho semplicemente lasciato cadere il genitore e quindi il file del disco dello snapshot dal file manager al gestore del disco virtuale. Quindi ho potuto aprire il file .vbox (ho dovuto commentare due righe che fanno riferimento alla cartella condivisa che non esisteva nella mia installazione di Linux.
Zoechi,

0

Il vecchio percorso ( H:sull'unità) può essere semplicemente specificato nel .vboxfile per la VM, che è solo un file XML. In tal caso, è possibile salvare una copia di quel file, modificare il nome percorso come nuovo nome percorso (quello N:sull'unità) e vedere se risolve il problema.


1
Ho modificato l'attributo pertinente nel nodo <HardDisk> e ho aggiunto nuovamente la VM. Tuttavia restituisce l'errore: A differencing image of snapshot {xxx} could not be found. Could not find an open hard disk with UUID {yyy}
jmathew,

Mi viene in mente forse potrei semplicemente reimpostare l'UUID sul vecchio uuid del disco. È possibile?
jmathew,

Ho
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.