使用驱动器映像软件已有十多年,我发现令人难以置信的是,虚拟机可以在几秒钟内进行快照和恢复,而驱动器映像通常需要几个小时。
我可以对虚拟机进行快照,重新安装到不同的操作系统,然后进行恢复,并且奇迹般地在几秒钟内我的旧虚拟机就完美地恢复到以前的状态。
这是怎么发生的?VM 主机实际上对 VM 做了什么才导致这种情况发生?
答案1
创建快照时,对初始虚拟磁盘映像所做的所有更改实际上并未在映像本身上进行,而是写入新的(快照)磁盘文件。此操作非常快,因为无需复制整个虚拟磁盘映像,因为它在写时复制原则(仅更改,即写入的块写入快照映像)。请注意,随着您在原始虚拟磁盘映像上更改越来越多的数据(该映像保持与您拍摄快照时的状态相同),快照映像会增大。它很可能比原始映像小得多,但在最坏的情况下,它将完全相同大小(如果所有块都已更改)。
您可以使用此新的快照图像执行两项操作:
- 放弃快照:动作非常快。虚拟机管理器只需删除快照映像文件并将控制权返回到原始磁盘映像或一些先前的快照
- 合并快照:虚拟机管理器将更改的块(即快照映像)与原始映像合并。此操作将花费时间,具体取决于原始映像中更改的块数。同样,最坏的情况是,如果在创建快照后写入了原始映像中的所有块,则整个原始映像将被覆盖。
上述所有程序也适用于多个快照。在这种情况下,原始图像可能是一个快照,下一个快照可能引用该(第一个)快照上的块。这样,您可以轻松丢弃或合并多个快照。
答案2
使用快照时,虚拟化软件必须跟踪四件事:CPU 状态、RAM、配置(虚拟机中有多少个网卡?)和磁盘。我忽略了前三件事,因为它们不是大量数据,软件可以复制相对较小的数据结构并将其存储在文件中。所以,只剩下磁盘快照需要解释。
首先,虚拟机所看到的硬盘实际上只是主机文件系统上的一组文件。要创建快照,虚拟机软件会在某个时间点获取虚拟机的磁盘,保存它,打开一个新的空磁盘文件,然后执行写时复制每次后续磁盘访问时都要使用这个方案。
假设您的磁盘文件是 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.disk 仍指向 BigVM-s1.disk。
答案3
它仅写入自快照以来更改的文件的差异,而不是完整的虚拟机磁盘。类似于 unix diff 和 patch,只不过是更复杂的版本,它在二进制级别上进行差异分析,并且了解虚拟机的其他详细信息。
答案4
在 VMware 快照及其内部工作的最佳解释是 @http://www.pcclm.com/2012/02/virtual-machine-snapshots-in-vmware.html