Como mesclar instantâneo arbitrário no vdi base no Virtualbox

14

Eu estraguei a transferência de uma VM de um disco rígido para o outro. Agora fiquei com o vdi base e um monte de snapshots.

Meus passos

  • Diretório antigo da VM copiado para o novo HDD
  • Excluída VM antiga e adicionada nova VM usando o Machine-> add e fornecendo o antigo arquivo XML
  • Não foi possível adicionar o arquivo vdi base devido a um conflito; portanto, alterou o UUID do vdi base com

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

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 disco rígido antigo era a unidade H: a nova unidade N:

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

Ou, se não for assim, como posso mesclar a captura instantânea antiga com o vdi base, uma vez que as únicas coisas que mudaram é o UUID do vdi base?

jmathew
fonte

Respostas:

10

Aqui está como eu resolvi meu problema.

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

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

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

Como cada arquivo .vdi contém apenas os setores alterados do último arquivo .vdi, copiar os arquivos .vdi em ordem cronológica deve gerar um arquivo .vdi contendo uma cópia completa de todos os instantâneos anteriores.

...

Use o comando “VBoxManage clonehd” para criar um novo arquivo .vdi com base no seu original e adicione cada arquivo subsequente usando o argumento “–existing” para simplesmente adicionar os dados ao .vdi existente que você está construindo. A seguinte lista de comandos é baseada no meu exemplo acima:

VBoxManage clonehd Machine.vdi Machine-full.vdi

Instantâneos do clonehd do VBoxManage {UUID1} .vdi Machine-full.vdi

Instantâneos do clonehd do VBoxManage {UUID2} .vdi Machine-full.vdi

Instantâneos do clonehd do VBoxManage {UUID3} .vdi Machine-full.vdi

Instantâneos do clonehd do VBoxManage {UUID4} .vdi Machine-full.vdi

Isso fornecerá um arquivo "Machine-full.vdi" que representa o estado completo da sua máquina no estado ativo, sem qualquer relação com os arquivos .vdi pai. Agora você pode usar esse arquivo “Machine-full.vdi” em uma nova máquina virtual ou editar sua VM existente, removendo o arquivo .vdi antigo e adicionando esse .vdi.

Com um pouco de ajustes que pareceu 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 estão cortados nas 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 eu tenho que ter certeza 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 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 simplesmente criei uma nova VM usando o ft_full.vdi como base. Correspondeu ao restante das configurações no painel de configurações da GUI.

jmathew
fonte
1
Parece que você poderia fazê-lo muito mais rápido superuser.com/questions/590968/...
Andrey Regentov
4

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 no comando interno do VBoxManage.exe dumphdinfo, poderá ver que cada VDI possui informações sobre seu pai. Então, o que fiz foi criar uma máquina em branco e adicionar o HD Pai "quebrado" como uma unidade secundária. Isso o colocou no Media Manager.

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

Isso os torna unidades individuais dentro da VM, mas no Media Manager elas estão todas conectadas uma à outra.

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}
NeverEatAlone
fonte
Uma simplificação foi que eu simplesmente soltei o pai e o arquivo de disco de captura instantânea do gerenciador de arquivos para o gerenciador de disco virtual. Então eu poderia abrir o arquivo .vbox (eu tinha que comentar duas linhas que fazem referência para a pasta compartilhada que não existia na minha instalação do Linux.
zoechi
0

O nome do caminho antigo (na H:unidade) pode simplesmente ser especificado no .vboxarquivo 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 do caminho (aquele na N:unidade) e ver se ele resolve o problema.

Fran
fonte
1
Alterei o atributo relevante no nó <HardDisk> e adicionei novamente a VM. No entanto ele retorna o erro: A differencing image of snapshot {xxx} could not be found. Could not find an open hard disk with UUID {yyy}
jmathew
Ocorre-me que talvez eu possa apenas definir o UUID de volta para o uuid de disco antigo. Isso é possível?
jmathew
Usado roteiro deste cavalheiro para definir a volta uuid: Definir o UUID de um VirtualBox VDI
jmathew