Como mesclar instantâneos arbitrários na base vdi no Virtualbox

14

Eu estraguei uma transferência de uma VM de um disco rígido para outro. Agora estou com o vdi de base e um monte de instantâneos.

Meus passos

  • Copie o antigo diretório da VM para o novo HDD
  • Excluiu a VM antiga e adicionou a nova VM usando o recurso de adicionar > fornecendo o arquivo XML antigo
  • Não foi possível adicionar o arquivo vdi de base devido a conflitos, então, o UUID da base vdi foi alterado com

    VBOXMANGE.EXE internalcommands sethduuid  <path/to/vdi>
    
  • Tentativa de reverter para um instantâneo, mas parece que a VM está procurando os instantâneos no disco rígido antigo (que foi formatado e foi embora)

Este é o erro (em rede é o 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}

O HD antigo era o drive H: o novo é o drive N:

Como posso modificar os instantâneos / VM para procurar em N:\vm\ft.vdi para o vdi de base? Eu já defini as configurações padrão no VirtualBox em geral (padrão de localização de snapshot vm / vm).

Ou, se não, como eu posso mesclar o velho snap shot com a base vdi, dado que as únicas coisas que mudaram é o UUID da base vdi?

    
por jmathew 16.06.2012 / 22:35

3 respostas

10

Veja como resolvi meu problema.

Primeiro eu desfiz a alteração do UUID no meu arquivo VDI de base usando o script jordoncm

Então, tentei simplesmente alterar os caminhos no arquivo vbox para corresponder ao novo local. Isso não funcionou porque vários erros diferentes apareceram e eu nem consegui adicionar a VM usando o arquivo vbox.

Então, encontrei este artigo do blog de Peter Porter que sugeriu:

as each .vdi contains only those sectors changed from the last .vdi, copying the .vdi’s in chronological order should net us a .vdi containing a full copy of all prior snapshots.

...

Use the “VBoxManage clonehd” command to create a new .vdi file based on your original, then add in each subsequent file using the “–existing” argument to simply add the data to existing .vdi you’re building. The following list of commands are based off my example above:

VBoxManage clonehd Machine.vdi Machine-full.vdi

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

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

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

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

This will give you a “Machine-full.vdi” file that represents the full state of your machine in the active state without any relationship to the parent .vdi files. You can now use this “Machine-full.vdi” file on a new virtual machine or edit your existing VM, removing the old .vdi file and adding this .vdi.

Com um pouco de ajustes que pareciam funcionar para mim:

Este é o disco rígido e seus instantâneos:

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

Estes são os comandos que eu executei (desculpe, alguns deles são cortados de suas janelas ...):

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

Porcaria parece que eu preciso adicionar uma entrada no VirtualBox.xml em MediaRegistry- > HardDisks, mas tenho que me certificar de adicionar cada instantâneo a ele em ordem cronológica após cada cópia. Então é assim:

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

E o resto do que eu fiz no caso de ajudar alguém:

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 então eu simplesmente criei uma nova VM usando o ft_full.vdi como sua base. Correspondeu o resto das configurações no painel de configurações da GUI.

    
por 17.06.2012 / 07:47
3

Acabei de passar por essa dor de cabeça e há uma solução aparentemente estúpida. Pena que demorei um dia inteiro para chegar aqui.

Se você der uma olhada nos comandos internos do VBoxManage.exe, dumphdinfo , verá que cada VDI tem informações sobre seu pai. Então, o que eu fiz foi criar uma máquina em branco e adicionar HD Parent "quebrado" como uma unidade secundária. Isso colocou no Media Manager.

Em seguida, adicionei um controlador SATA à VM em branco e adicionei a captura instantânea da camada 3. Clique OK. Edite novamente e adicione o instantâneo da camada 2, clique em ok. Edite, adicione o instantâneo da camada 1.

Isso os torna drives individuais dentro da VM, mas dentro do Media Manager eles estão todos conectados uns aos outros.

A etapa final é simplesmente excluir a VM do banco e adicionar sua VM antiga. Feito ... e sim, é tão estúpido / simples.

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}
    
por 24.07.2012 / 06:15
0

O nome do caminho antigo (na unidade H: ) pode ser simplesmente especificado no arquivo .vbox da VM, que é apenas um arquivo XML. Nesse caso, você pode salvar uma cópia desse arquivo, editar o nome do caminho para ser o novo nome de caminho (o da unidade N: ) e ver se ele resolve o problema.

    
por 17.06.2012 / 01:44

Tags