对该问题的研究始于以下错误提示:
我本想选择虚拟机的vid文件为“直接写穿模式” (WriteThrough),但是选择后,出现如下提示。
=======================================================
Error changing disk image mode from Normal to Writethrough.
Cannot change type for medium ‘/home/apuser/E-disk/vbox-win7/win7-32bit.vdi‘ since it has 1 child media.
Result Code: VBOX_E_OBJECT_IN_USE (0x80BB000C)
Component: Medium
Interface: IMedium {05f2bbb6-a3a6-4fb9-9b49-6d0dda7142ac}
========================================================
故而研究,结论如下:
关于Vbox的snapshot:每次新的snapshot都是一个基于上一个snapshot的差分文件(在虚拟介质管理器中可以看到他们是一个个vid文件,且依赖于自己的父亲)
删除一个snapshot的动作,会让被删除的snapshot合并(merge)到自己的儿子,其原因是儿子是基于父亲的,所以儿子是父亲的超集,先前儿子的差分文件中仅仅只记录了相对于父亲的增量,现在父亲消失了,那么儿子的差分文件中就必须将父亲相对于父亲的父亲(儿子的爷爷)的差分内容包含进来。
举例:删掉5以后,6对应的差分文件中就会包含5对应的差分文件,但这对用户而言虽然6的差分文件变化了,但是恢复到6后看到的内容不会改变。
设:
5 = 4 + DeltaA
6 = 5 + DeltaB
则:
删掉5以后,会导致6 = 4 + DeltaA + DeltaB
所以,虽然6的差分包变大了,用户但是6的内容还是不变,因为6相对于4的差分本来就是DeltaA + DeltaB
如:
snapshot-1
snapshot-2
snapshot-3
snapshot-4
snapshot-5
snapshot-6
current-state
不要将恢复(restore)和删除混淆,如恢复到4,则只是将当前状态(current-state)置为和4一样的状态,5和6依然是存在的,你还可以再次恢复到5、6
current-state是临时的,所以如果你想恢复到某个历史状态,最好将curent状态先snapshot一下,否则你就会永远丢掉current状态。
你可以恢复到任何一个历史snapshot-x,这相当于从x又拉出来一个新的分支而已。这就是snapshot的强大之处。
因为每个snapshot对应一个vid文件,有以上可见,只要从下往上逐个删除snapshot,便可以将所有修改全部合并到原始的vid,从而将所有的子vid全部删除。
一个例子,如果你觉得当前的current-state已经很完美,那么你可以将所有的snapshot逐个删除(从6删到1,顺序没关系,大胆删吧),这样,当所有的snapshot都被删除后,current-state就会被写入到最原始的vid中。你就可以将这个vid复制到其它机器上直接使用。