使用Virtualbox的差分盘技术建立虚拟机

背景

早知道有这项技术,但以前磁盘空间压力没这么大,所以也就懒得折腾。现在换了纯SSD的电脑,还只有256G,自然是要关注一下虚拟机占磁盘的问题了。

听说有人预测2018上半年储存产品会降价,拭目以待——2017年11月25日

# 目标

安装一个纯净的基础系统(比如Win7),将其磁盘用来做所有其他虚拟机的母盘。其他虚拟机所用的硬盘都只记录自己的磁盘相对母盘的差异。牺牲一点点性能换取磁盘空间利用率。

步骤

其实挺简单的,参考了这个帖子。原帖写的有点乱,整理一下。

  1. 按正常方法新建虚拟机,磁盘选VDI,动态分配;
  2. 安装系统;
  3. 可靠方式激活;这里的“可靠”指的是磁盘ID、硬件环境略微变化后仍然有效,否则有可能出现用该磁盘差分出来的虚拟机第一次开机就黑屏/要求激活的情况。

注意事项:

  • 不要分配共享文件夹;
  • 不要安装增强工具;
  • 如果需要传文件,使用U盘中转;

以上都是为了尽量不在此母盘中留下专属于某台虚拟机的痕迹。洁癖。

安装Win7时,VirtualBox会默认使用USB 2.0控制器,在USB 3.0的电脑下,会出现无法挂载USB 3.0U盘的问题。如果在虚拟机设置中切换到USB 3.0控制器,又会出现Win7没有USB 3.0驱动的问题——此时可以去下载安装Intel 提供的驱动,或者换一个USB 2.0的U盘或者插口,或者放弃洁癖使用共享文件夹/增强工具来传输文件。

  1. 在刚刚新建的虚拟机中,设置-储存,移除刚刚装系统用的虚拟磁盘,但是不要删除文件;
  2. VBoxManage.exe所在位置加入PATH(或者写全路径直接调用)
  3. 执行VBoxManage.exe C:\bucket\VirtualDisks\Win7Base.vdi --type immutable,路径自己改;
  4. 此时,在虚拟介质管理器中,应该能看见此VDI虚拟磁盘的类型变成了“不可改变”;或者也可以用命令行查看: > VBoxManage.exe showhdinfo C:\bucket\VirtualDisks\Win7Base.vdi UUID: xxx-xxxxx-xxxxx-xxxx Parent UUID: base State: created Type: immutable Location: C:\bucket\VirtualDisks\Win7Base.vdi Storage format: VDI Format variant: dynamic default Capacity: 40960 MBytes Size on disk: 8791 MBytes Encryption: disabled ...
  5. 彻底删除刚刚装系统用的虚拟机(实在想不出来它还有啥用了)。由于此虚拟机跟这个VDI文件已经没了关系,删除虚拟机应该不会动VDI文件;

据说,如果你怕不小心改了这个VDI文件(它完蛋了所有基于它的虚拟机就全完蛋了),操作完了之后可以把它设置成只读文件。

  1. 新建虚拟机;
  2. 创建或选择现有磁盘时,选择刚才那个VDI文件;此时VirtualBox会自动创建一个基于它的差分盘;创建虚拟机完成之后可以在设置-储存这里看到明细:

磁盘明细

注意,此时位置显示的是刚才的VDI文件,但实质上差分数据都在虚拟机储存目录下Snapshots\{xxxx-xxx-xxx}.vdi存着; 3. 开机,应该是可以成功开机的;由于磁盘ID变了,Win7可能会要求你重启一次; 4. 然而此时重启时没有X用的,因为这种方法创建的虚拟磁盘默认开启了autoreset功能,即关机后自动复原一切更改(其实这个功能在有些时候很有用);执行VBoxManage.exe modifyhd "C:\Users\xxxx\VirtualBox VMs\YourVMName\Snapshots\{xxxx-xxx-xxx}.vdi" --autoreset off关闭此特性。 5. 以后,如果对此刚刚创建的虚拟机做快照,那么新产生的快照依然默认是开启了autoreset的,需要用命令行手动关闭此特性,否则关机再开之后一切还原(重启之后貌似还在)。有点烦,好在这样的场景不多。但是必须注意这一点,否则再虚拟机里面搞了半天最后东西全没了不要怪我。

操作完成,开机想干点啥就干点啥吧。无论对这台虚拟机做什么,原来的VDI文件都不会有任何改动——我对照过操作前后的md5了。

如果需要其他的虚拟机,再按本小节目录执行一遍就行了,完全没有重新装系统的麻烦。当然增强功能什么的还是要再来一次的。

  • 最后更改: 2019/05/29 14:28