如何将任意快照合并到 Virtualbox 中的基础 vdi 中

jma*_*hew 14 virtualbox

我拙劣地将虚拟机从一个硬盘转移到另一个硬盘。现在我只剩下基本的 vdi 和一大堆快照。

我的脚步

  • 将旧 VM 目录复制到新硬盘
  • 使用 Machine->add 删除旧 VM 并添加新 VM 并提供旧的 XML 文件
  • 由于冲突,无法添加基础 vdi 文件,因此将基础 vdi 的 UUID 更改为

    VBOXMANGE.EXE internalcommands sethduuid  <path/to/vdi>
    
    Run Code Online (Sandbox Code Playgroud)
  • 尝试回滚到快照,但似乎 VM 正在寻找旧硬盘上的快照(已格式化并消失)

这是错误(网络是名称):

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}
Run Code Online (Sandbox Code Playgroud)

旧硬盘是驱动器 H:新硬盘是驱动器 N:

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

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

jma*_*hew 10

这是我如何解决我的问题。

首先,我使用jordoncm脚本取消更改我的基本 VDI 文件上的 UUID

然后我尝试简单地更改 vbox 文件中的路径以匹配新位置。这不起作用,因为出现了各种不同的错误,我什至无法使用 vbox 文件添加 VM。

所以我找到了 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”文件或编辑现有 VM,删除旧的 .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>
Run Code Online (Sandbox Code Playgroud)

这些是我运行的命令(对不起,其中一些被切断了它的窗户......):

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
Run Code Online (Sandbox Code Playgroud)

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

Copy VM
Add entry to VirtualBox.xml
Copy VM ...
Run Code Online (Sandbox Code Playgroud)

以及我所做的其他事情,以防它对其他人有所帮助:

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
Run Code Online (Sandbox Code Playgroud)

然后我简单地使用 ft_full.vdi 作为它的基础创建了一个新的 VM。匹配 gui 设置窗格中的其余设置。