使用驱动器映像软件十多年后,我发现虚拟机可以在几秒钟内完成快照和恢复,而驱动器映像通常需要几个小时,这令人难以置信。
我可以对虚拟机进行快照,重新安装到不同的操作系统,然后进行恢复,并在几秒钟内以某种方式神奇地恢复我的旧虚拟机之前的状态。
这怎么可能发生?VM 主机实际上对 VM 做了什么使这成为可能?
使用驱动器映像软件十多年后,我发现虚拟机可以在几秒钟内完成快照和恢复,而驱动器映像通常需要几个小时,这令人难以置信。
我可以对虚拟机进行快照,重新安装到不同的操作系统,然后进行恢复,并在几秒钟内以某种方式神奇地恢复我的旧虚拟机之前的状态。
这怎么可能发生?VM 主机实际上对 VM 做了什么使这成为可能?
创建快照时,对初始虚拟磁盘映像所做的所有更改实际上并未在映像本身上进行,而是写入新的(快照)磁盘文件。这个动作之所以如此之快,是因为不需要复制整个虚拟磁盘映像,因为它是按照写时复制的原理工作的(只是改变了,即将写入的块写入快照映像)。请注意,快照映像会随着您更改原始虚拟磁盘映像上的越来越多的数据而增长(保持在您拍摄快照时的状态)。它很可能比原始图像小得多,但在最坏的情况下,它的大小将完全相同(如果所有块都已更改)。
您可以使用此新快照图像执行两项操作:
上述所有过程也适用于多个快照。在这种情况下,原始图像可能是一个快照,而下一个快照可能会引用该(第一个)快照上的块。通过这种方式,您可以拥有许多可以轻松丢弃或合并的快照。
通过快照,您的虚拟化软件必须跟踪四件事:CPU 状态、RAM、配置(VM 中有多少网卡?)和磁盘。我忽略了前三件事,因为它们不是大量数据,软件可以复制相对较小的数据结构并将它们存储在一个文件中。因此,只剩下磁盘快照来解释了。
首先,虚拟机所看到的硬盘实际上只是主机文件系统上的一组文件。为了做快照,虚拟机软件在某个时间点获取虚拟机的磁盘,保存它,打开一个新的空磁盘文件,并在每次后续磁盘访问时执行写时复制方案。
假设您的磁盘文件是 BigVM.disk。您快照,现在您的 VM 软件将您的磁盘重命名为 BigVM-s1.disk,然后创建一个新的空 BigVM.disk。当您的 VM 运行时,所有读取请求都通过 BigVM.disk。如果该文件没有您的 VM 需要的磁盘部分的条目,则返回 BigVM-s1.disk 中的数据。在写入时,数据将写入 BigVM.disk 而不是 BigVM-s1.disk。未来对同一扇区的读取将返回 BigVM.disk 中的数据,而不是 BigVM-s1.disk 中包含的原始快照。BigVM-s1.disk 包含快照时 VM 的硬盘状态,而 BigVM.disk 包含自该快照以来磁盘的所有差异。
当您恢复到较旧的快照时会发生什么?VM 软件丢弃 BigVM.disk 的内容并重新开始,新的空 BigVM.disk 仍指向 BigVM-s1.disk。
它只写入从快照时更改的文件的差异,而不是完整的虚拟机磁盘。像 unix diff 和 patch 一样,除了一个更复杂的版本,它在二进制级别上进行差异并了解虚拟机的其他细节。
至少在 VMware 快照中,快照基本上是给 VMX 的一个信号,用于启动磁盘写入和机器状态的新检查点。根据您的虚拟机是关闭还是打开,恢复快照只需简单地处理通过该检查点发生的所有事情。否则,VM 的所有磁盘扇区都将变为写入时复制,这意味着当您执行热快照还原时,它只需要重写自拍摄快照以来已更改的扇区。所以这就是它更快的原因。
处理 VMware 快照及其内部的最佳解释 @ http://www.pcclm.com/2012/02/virtual-machine-snapshots-in-vmware.html