Jak scalić dowolną migawkę z bazą vdi w Virtualbox

14

Spartaczyłem przeniesienie maszyny wirtualnej z jednego dysku twardego na drugi. Teraz zostaję z podstawowym vdi i całą masą migawek.

Moje kroki

  • Skopiowałem stary katalog VM na nowy dysk twardy
  • Usunąłem starą maszynę wirtualną i dodałem nową maszynę wirtualną za pomocą polecenia Machine-> dodaj i podaj stary plik XML
  • Nie można dodać podstawowego pliku vdi z powodu konfliktu, dlatego zmieniono identyfikator UUID podstawowego vdi za pomocą

    VBOXMANGE.EXE internalcommands sethduuid  <path/to/vdi>
    
  • Spróbuj przywrócić migawkę, ale wygląda na to, że maszyna wirtualna szuka migawek na starym dysku twardym (który jest sformatowany i zniknął)

To jest błąd (nazwa sieciowa):

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}

Stary dysk twardy to dysk H: nowy to dysk N:

Jak mogę zmodyfikować migawki / N:\vm\ft.vdimaszynę wirtualną, aby wyszukać podstawowe vdi? Ogólnie ustawiłem już domyślne ustawienia VirtualBox (domyślna lokalizacja migawek vm / vm).

A jeśli nie, to jak mogę połączyć stary zrzut z bazowym vdi, biorąc pod uwagę, że jedyne, co się zmieniło, to UUID podstawowego vdi?

jmathew
źródło

Odpowiedzi:

10

Oto jak rozwiązałem mój problem.

Najpierw cofnąłem zmianę UUID w moim podstawowym pliku VDI, używając skryptu autorstwa jordoncm

Potem próbowałem po prostu zmienić ścieżki w pliku vbox, aby pasowały do ​​nowej lokalizacji. To nie działało, ponieważ pojawiły się różne różne błędy i nawet nie byłem w stanie dodać maszyny wirtualnej przy użyciu pliku vbox.

Znalazłem więc ten artykuł na blogu autorstwa Petera Portera, który zasugerował:

ponieważ każdy plik .vdi zawiera tylko te sektory zmienione od ostatniego pliku .vdi, kopiowanie plików .vdi w porządku chronologicznym powinno dać nam plik .vdi zawierający pełną kopię wszystkich wcześniejszych migawek.

...

Użyj komendy „VBoxManage clonehd”, aby utworzyć nowy plik .vdi na podstawie oryginału, a następnie dodaj każdy kolejny plik za pomocą argumentu „–existing”, aby po prostu dodać dane do istniejącego pliku .vdi, który budujesz. Poniższa lista poleceń oparta jest na moim powyższym przykładzie:

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

To da ci plik „Machine-full.vdi”, który reprezentuje pełny stan twojego komputera w stanie aktywnym bez żadnego związku z nadrzędnymi plikami .vdi. Możesz teraz użyć tego pliku „Machine-full.vdi” na nowej maszynie wirtualnej lub edytować istniejącą maszynę wirtualną, usuwając stary plik .vdi i dodając ten .vdi.

Z drobnymi poprawkami, które wydawały mi się działać:

To jest dysk twardy i jego migawki:

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

Oto polecenia, które uruchomiłem (przepraszam, że niektóre zostały odcięte od okien ...):

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

Bzdura wydaje się, że muszę dodać wpis w VirtualBox.xml w MediaRegistry-> HardDisks, ale muszę upewnić się, że dodałem do niego każdą migawkę w kolejności chronologicznej po każdej kopii. Więc to tak:

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

I resztę tego, co zrobiłem na wypadek, gdyby pomógł komukolwiek innemu:

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

A potem po prostu utworzyłem nową maszynę wirtualną, używając ft_full.vdi jako podstawy. Dopasowano pozostałe ustawienia w panelu ustawień GUI.

jmathew
źródło
1
Wydaje się, że można to zrobić znacznie szybciej superuser.com/questions/590968/...
Andrey Regentov
4

Właśnie przeszedłem przez ten ból głowy i jest na pozór głupie rozwiązanie. Szkoda, że ​​dotarcie tutaj zajęło mi cały dzień.

Jeśli spojrzysz na wewnętrzne polecenia VBoxManage.exe dumphdinfo , zobaczysz, że każdy VDI ma informacje o swoim rodzicu. Tak więc stworzyłem pustą maszynę i dodałem „uszkodzony” Parent HD jako dysk dodatkowy. To umieściło go w Media Managerze.

Następnie dodałem kontroler SATA do pustej maszyny wirtualnej i dodałem migawkę warstwy 3. Kliknij OK. Edytuj ponownie i dodaj migawkę warstwy 2, kliknij OK. Edytuj, dodaj ujęcie warstwy 1.

Dzięki temu są one pojedynczymi dyskami w maszynie wirtualnej, ale w programie Media Manager wszystkie są ze sobą połączone.

Ostatnim krokiem jest po prostu usunięcie bankowej maszyny wirtualnej i dodanie starej maszyny wirtualnej. Zrobione ... i tak, to takie głupie / proste.

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
źródło
Uproszczenie polegało na tym, że po prostu upuściłem plik nadrzędny, a następnie plik dysku migawki z menedżera plików do menedżera dysków wirtualnych. Następnie mogłem otworzyć plik .vbox (musiałem skomentować dwa wiersze, które odnoszą się do udostępnionego folderu, który nie istniał w mojej instalacji linux.
zoechi
0

Stara nazwa ścieżki (na H:dysku) może być po prostu określona w .vboxpliku maszyny wirtualnej, który jest tylko plikiem XML. Jeśli tak, możesz zapisać kopię tego pliku, edytować nazwę ścieżki, aby była nową nazwą ścieżki (tą na N:dysku) i sprawdzić, czy to rozwiąże problem.

Fran
źródło
1
Zmieniłem odpowiedni atrybut w węźle <HardDisk> i ponownie dodałem maszynę wirtualną. Zwraca jednak błąd: A differencing image of snapshot {xxx} could not be found. Could not find an open hard disk with UUID {yyy}
jmathew
Przyszło mi do głowy, że może uda mi się ustawić UUID z powrotem na stary identyfikator dysku. Czy to jest możliwe?
jmathew
Użyłem