我有一个虚拟机,其中大约有 30 个快照在分支中。当前的开发路径是 22 个快照加上基础磁盘。文件数量似乎现在对 IO 和我正在使用的开发笔记本电脑产生了影响(不知道是主机磁盘性能问题,总大小为 140GB,包含大量片段,还是它影响了分布在大量文件中的扇区)。
我想将快照的当前开发分支与基础磁盘合并在一起,但我不确定以下命令是否会产生正确的结果。过程完成后(5-6 小时),我无法启动此磁盘。
vboxmanage clonehd "C:\VPC-Storage\.VirtualBox\Machines\CRM\Snapshots\{245b27ac-e658-470a-b978-8e62137c33b1}.vhd" "E:\crm-20100624.vhd" --format VHD --type normal
有人能确认这是不正确的方法吗?
答案1
您要做的是,从快照对话框中选择要将所有快照合并到单个 VDI 的父快照。
根据您的描述,这听起来像是树的根。
右键单击并选择“删除快照”。
这将执行您想要的操作 --- 它将把所有子快照的所有更改合并到单个 VDI 中。
此外 - 克隆最新快照中的磁盘映像 - 还会将差异磁盘与其父磁盘合并(以及其父磁盘,依此类推,直到获得“正常”硬盘类型)。
我怀疑“删除快照”会运行 clonehd 命令。
检查您的 VM 设置(特别是 IO APIC 启用/禁用)并确保它们匹配。
答案2
如果您只想保留单个快照,请将其设为当前状态,然后导出虚拟机并重新导入。导出的设备不会保留其快照历史记录。
或者你可以使用这个vboxmerge.py脚本来为您处理合并。考虑到您拥有的快照数量,我预计导出/导入周期会更快。
答案3
这里有一个技术(在 VirtualBox 4.3.4 上测试),它使用“克隆”命令将所有快照合并并压缩到包含单个 VDI 文件的新 VM:
重命名虚拟机,以便您可以重新使用其当前名称作为克隆的虚拟机(您可以从“常规”设置的“基本”选项卡中更改虚拟机名称)。
右键单击虚拟机并运行“克隆...”命令:
- 将名称设置为虚拟机的原始名称。
- 接受其余的默认设置,即克隆类型:“完整克隆”;快照:“当前机器状态”。
删除旧的虚拟机(右键单击虚拟机并运行“删除...”命令)。
答案4
如果您的主机是 Windows 或者您可以从 Windows 访问 VHD 文件,那么有一个技巧可以将所有更改合并到父级、祖父级等中。
它使用 DiskPart 工具和两个命令:
select vdisk file="whatever your file is, with full path"
merge vdisk depth=#
其中 # 是您要移动的层次结构级别数,1 表示直接父级,2 表示祖父级,等等。
它可以就地完成,比克隆等耗费的时间少得多。
请记住,合并后所有中间 VHD 都可以删除(它不会为您删除它们),并且不要忘记将合并的父级附加到 VirtualBox 中。
例子:
Disk3.vhd 是 Disk2.vhd 的子级,Disk2.vhd 是 Disk1.vhd 的子级
如果您想要在 Disk1.vhd 上对 Disk3.vhd 进行所有更改,只需使用depth=2
并选择 Disk3.vhd。如果您想要在 Disk1.vhd 上对 Disk2.vhd 进行所有更改,只需使用depth=1
并选择 Disk3.vhd。
还要记住,不需要丑陋的 VirtualBox 快照,您可以使用 DiskPart create vdisk 命令从现有磁盘创建差异磁盘(也可以是差异磁盘等),也可以创建一棵巨大的树。
对于其余所有事项:发布者使用的是 VHD(而不是 VDI),因此可以使用 DiskPart 和磁盘管理等本机工具从客户机(在主机上,如果主机是 Windows)访问该磁盘。
对于您,海报:请记住在合并之前始终进行完整的备份,VirtualBox 克隆不能就地工作,它会创建一个新文件(写入时复制),但 DiskPart 合并可以在就地工作(修改文件,而不是创建新文件)。
由于 VHD/VHDX 正在使用中,希望可以提供另一种不同的方法(对 VMDK、VDI 等无效,仅适用于 Windows 主机)。
注意:Windows 7 及更高版本、XP 和 Vista 可以使用外部 M$ 工具安装 VHD,但 DiskPart 在 XP 和 Vista 上不支持 VHD...所有这些也适用于 Windows HOME 版本(7 及更高版本),不需要服务器版本。