如何在 Virtualbox 中将任意快照合并到基本 vdi

如何在 Virtualbox 中将任意快照合并到基本 vdi

我把虚拟机从一个硬盘传输到另一个硬盘时出错了。现在我只剩下基本 vdi 和一大堆快照。

我的脚步

  • 将旧虚拟机目录复制到新硬盘
  • 删除旧 VM,并使用 Machine->add 添加新 VM,并提供旧 XML 文件
  • 由于冲突,无法添加基本 vdi 文件,因此使用以下方法更改了基本 vdi 的 UUID:

    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:

我如何修改快照/VM 以查找N:\vm\ft.vdi基本 vdi?我已经在 VirtualBox 中设置了默认设置(默认 vm/vm 快照位置)。

或者如果不是这样,我该如何将旧快照与基本 vdi 合并,因为唯一改变的是基本 vdi 的 UUID?

答案1

以下是我解决问题的方法。

首先,我使用以下命令撤销了基础 VDI 文件上的 UUID 更改脚本由 jordoncm 编写

然后我尝试简单地更改 vbox 文件中的路径以匹配新位置。但这种方法行不通,因为弹出了各种不同的错误,我甚至无法使用 vbox 文件添加虚拟机。

所以我找到了这个Peter Porter 的博客文章谁建议:

由于每个 .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

糟糕,看来我需要在 MediaRegistry->HardDisks 下的 VirtualBox.xml 中添加一个条目,但我必须确保在每次复制后按时间顺序将每个快照添加到其中。所以它是这样的:

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 作为基础创建了一个新的 VM。匹配 GUI 设置窗格中的其余设置。

答案2

我刚刚经历了这种头痛,现在有一个看似愚蠢的解决方案。可惜我花了一整天才找到这里。

如果你看一下VBoxManage.exe 内部命令 dumphdinfo 您可以看到每个 VDI 都有关于其父级的信息。因此,我所做的就是创建一台空白机器,并添加“损坏的”父级 HD 作为辅助驱动器。将其放入媒体管理器中。

然后,我在空白虚拟机中添加了一个 SATA 控制器,并添加了第 3 层快照。单击确定。再次编辑并添加第 2 层快照,单击确定。编辑,添加第 1 层快照。

这使得它们成为虚拟机内的单独驱动器,但在媒体管理器内部,它们都相互连接。

最后一步,只需删除银行 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}

答案3

旧路径名(H:驱动器上的路径名)可能只是在虚拟机的文件中指定.vbox,该文件只是一个 XML 文件。如果是这样,您可以保存该文件的副本,将路径名编辑为新路径名(驱动N:器上的路径名),然后看看是否能解决问题。

相关内容