Как объединить произвольный снимок в базу vdi в Virtualbox

14

Я испортил перенос виртуальной машины с одного жесткого диска на другой. Теперь у меня осталось базовое видео и целая куча снимков.

Мои шаги

  • Скопировал старый каталог VM на новый жесткий диск
  • Удалил старую ВМ и добавил новую ВМ, используя Machine-> add и предоставив старый XML-файл
  • Не удалось добавить базовый файл vdi из-за конфликта, поэтому изменил UUID базового vdi с помощью

    VBOXMANGE.EXE internalcommands sethduuid  <path/to/vdi>
    
  • Попытка выполнить откат к снимку, но, похоже, виртуальная машина ищет снимки на старом жестком диске (который отформатирован и ушел)

Это ошибка (сетевое имя):

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}

Старый жесткий диск - это диск H: новый - диск N:

Как я могу изменить снимки / виртуальную машину, чтобы искать N:\vm\ft.vdiбазовый VDI? Я уже установил настройки по умолчанию в VirtualBox в целом (расположение моментального снимка по умолчанию для vm / vm).

Или если нет, то как я могу объединить старый снимок с базовым vdi, учитывая, что единственное, что изменилось, это UUID базового vdi?

jmathew
источник

Ответы:

10

Вот как я решил свою проблему.

Сначала я отменил изменение UUID в моем базовом файле VDI, используя скрипт от jordoncm

Затем я попытался просто изменить пути в файле vbox в соответствии с новым местоположением. Это не сработало, так как появлялись различные ошибки, и я даже не смог добавить виртуальную машину с помощью файла vbox.

Таким образом, я нашел эту статью в блоге Питера Портера, который предложил:

поскольку каждый .vdi содержит только те сектора, которые были изменены с последнего .vdi, копирование .vdi в хронологическом порядке должно дать нам .vdi, содержащий полную копию всех предыдущих снимков.

...

Используйте команду «VBoxManage clonehd», чтобы создать новый файл .vdi на основе вашего оригинала, а затем добавьте в каждый последующий файл, используя аргумент «-existing», чтобы просто добавить данные в существующий .vdi, который вы создаете. Следующий список команд основан на моем примере выше:

VBoxManage clonehd Machine.vdi Machine-full.vdi

VBoxManage clonehd Снимки {UUID1} .vdi Machine-full.vdi

VBoxManage clonehd Снимки {UUID2} .vdi Machine-full.vdi

VBoxManage clonehd Снимки {UUID3} .vdi Machine-full.vdi

VBoxManage clonehd Снимки {UUID4} .vdi Machine-full.vdi

Это даст вам файл «Machine-full.vdi», который представляет полное состояние вашего компьютера в активном состоянии без какого-либо отношения к родительским файлам .vdi. Теперь вы можете использовать этот файл «Machine-full.vdi» на новой виртуальной машине или отредактировать существующую виртуальную машину, удалив старый файл .vdi и добавив этот .vdi.

С небольшой настройкой, которая, казалось, сработала для меня:

Это жесткий диск и его снимки:

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

Это команды, которые я выполнил (извините, некоторые из них отрезаны от окон ...):

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

Дерьмо, кажется, мне нужно добавить запись в VirtualBox.xml в MediaRegistry-> HardDisks, но я должен обязательно добавлять каждый снимок к нему в хронологическом порядке после каждой копии. Так вот как это:

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

И остальное, что я сделал в случае, если это поможет кому-то еще:

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

А потом я просто создал новую виртуальную машину, используя в качестве основы ft_full.vdi. Соответствует остальным настройкам в панели настроек графического интерфейса.

jmathew
источник
1
Похоже, что вы могли бы сделать это намного быстрее superuser.com/questions/590968/…
Андрей Регентов
4

Я только что прошел через эту головную боль, и есть, казалось бы, глупое решение. Жаль, что мне потребовался целый день, чтобы добраться сюда.

Если вы посмотрите внутренние команды VBoxManage.exe dumphdinfo, вы увидите, что каждый VDI имеет информацию о своем родителе. Итак, я создал пустой компьютер и добавил «сломанный» Parent HD в качестве дополнительного диска. Это поместило это в Media Manager.

Затем я добавил контроллер SATA на пустую виртуальную машину и добавил снимок уровня 3. Нажмите ОК Снова отредактируйте и добавьте снимок слоя 2, нажмите ОК. Редактировать, добавить слой 1 снимок.

Это делает их отдельными дисками внутри виртуальной машины, но внутри Media Manager они все связаны друг с другом.

Последний шаг, просто удалите банк VM и добавьте свою старую VM. Готово ... и да, это так глупо / просто.

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
источник
Упрощение состояло в том, что я просто отбросил родительский, а затем файл снимка диска из файлового менеджера в менеджер виртуальных дисков. Затем я мог открыть файл .vbox (мне пришлось закомментировать две строки, которые ссылаются на общую папку, которой не было в моей установке Linux.
zoechi
0

Старый путь (на H:диске) может быть просто указан в .vboxфайле для виртуальной машины, который является просто файлом XML. Если это так, вы можете сохранить копию этого файла, отредактировать путь к новому пути (тот, что на N:диске) и посмотреть, решит ли он проблему.

Fran
источник
1
Я изменил соответствующий атрибут в узле <HardDisk> и заново добавил виртуальную машину. Однако он возвращает ошибку: A differencing image of snapshot {xxx} could not be found. Could not find an open hard disk with UUID {yyy}
Jmathew
Это происходит со мной, может быть, я могу просто установить UUID обратно на старый диск UUID. Это возможно?
Jmathew
Использовал сценарий этого джентльмена, чтобы установить обратно uuid: Установка UUID VDI VirtualBox
jmathew