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


14

我阻止了将VM从一个硬盘转移到另一个硬盘。现在,我剩下基本的vdi和一大堆快照了。

我的脚步

  • 将旧的VM目录复制到新的HDD
  • 使用Machine-> add并提供旧的XML文件,删除旧的VM并添加新的VM
  • 由于冲突而无法添加基本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的UUID,我该如何将旧快照与基本vdi合并?

Answers:


10

这是我解决问题的方法。

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

然后,我尝试简单地更改vbox文件中的路径以匹配新位置。由于弹出了各种不同的错误,所以这种方法不起作用,我什至无法使用vbox文件添加虚拟机。

因此,我找到了Peter Porter的这篇博客文章,他建议:

由于每个.vdi仅包含从最后一个.vdi更改的那些扇区,因此按时间顺序复制.vdi的内容应使我们获得一个.vdi,其中包含所有先前快照的完整副本。

...

使用“ VBoxManage clonehd”命令基于原始文件创建一个新的.vdi文件,然后使用“ -existing”参数在每个后续文件中添加,以简单地将数据添加到正在构建的现有.vdi文件中。以下命令列表基于上面的示例:

VBoxManage clonehd Machine.vdi Machine-full.vdi

VBoxManage clonehd Snapshots {UUID1} .vdi Machine-full.vdi

VBoxManage clonehd快照{UUID2} .vdi Machine-full.vdi

VBoxManage clonehd Snapshots {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>

这些是我运行的命令(对不起,其中一些被关闭了...):

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设置窗格中的其余设置匹配。


1
看来你可以做到这一点更快superuser.com/questions/590968/...
安德烈Regentov

4

我只是经历了这样的头痛,似乎有一个愚蠢的解决方案。太糟糕了,我花了一整天才到这里。

如果查看VBoxManage.exe内部命令dumphdinfo, 您会看到每个VDI都有其父级的信息。因此,我要做的是创建一台空白计算机,并将“损坏的” Parent HD添加为辅助驱动器。那把它放进了媒体管理器。

然后,我将SATA控制器添加到空白VM并添加了第3层快照。单击确定。再次编辑并添加第2层快照,单击“确定”。编辑并添加第1层快照。

这使它们成为VM内的单个驱动器,但在Media Manager内,它们都彼此连接。

最后一步,只需删除银行虚拟机并添加旧虚拟机。完成...是的,就是那样愚蠢/简单。

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}

一种简化是,我只将父级磁盘,快照磁盘文件从文件管理器中删除到虚拟磁盘管理器中。然后,我可以打开.vbox文件(我不得不注释掉两条线作为参考,其并不在我的Linux安装中存在的共享文件夹。
zoechi

0

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


1
我在<HardDisk>节点中更改了相关属性,然后重新添加了VM。但是,它返回错误: A differencing image of snapshot {xxx} could not be found. Could not find an open hard disk with UUID {yyy}
jmathew 2012年

它发生在我身上,也许我可以将UUID设置回旧磁盘uuid。那可能吗?
jmathew 2012年

使用这位绅士的脚本来设置uuid:设置VirtualBox VDI的UUID
jmathew 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.