使用Virtualbox的差分盘技术建立虚拟机
背景
早知道有这项技术,但以前磁盘空间压力没这么大,所以也就懒得折腾。现在换了纯SSD的电脑,还只有256G,自然是要关注一下虚拟机占磁盘的问题了。
听说有人预测2018上半年储存产品会降价,拭目以待——2017年11月25日
# 目标
安装一个纯净的基础系统(比如Win7
),将其磁盘用来做所有其他虚拟机的母盘。其他虚拟机所用的硬盘都只记录自己的磁盘相对母盘的差异。牺牲一点点性能换取磁盘空间利用率。
步骤
其实挺简单的,参考了这个帖子。原帖写的有点乱,整理一下。
装一台纯净的基础虚拟机
- 按正常方法新建虚拟机,磁盘选
VDI
,动态分配; - 安装系统;
- 用可靠方式激活;这里的“可靠”指的是磁盘ID、硬件环境略微变化后仍然有效,否则有可能出现用该磁盘差分出来的虚拟机第一次开机就黑屏/要求激活的情况。
注意事项:
- 不要分配共享文件夹;
- 不要安装增强工具;
- 如果需要传文件,使用U盘中转;
以上都是为了尽量不在此母盘中留下专属于某台虚拟机的痕迹。洁癖。
安装Win7
时,VirtualBox会默认使用USB 2.0
控制器,在USB 3.0
的电脑下,会出现无法挂载USB 3.0
U盘的问题。如果在虚拟机设置中切换到USB 3.0
控制器,又会出现Win7
没有USB 3.0
驱动的问题——此时可以去下载安装Intel 提供的驱动,或者换一个USB 2.0
的U盘或者插口,或者放弃洁癖使用共享文件夹/增强工具来传输文件。
处理母盘
- 在刚刚新建的虚拟机中,
设置-储存
,移除刚刚装系统用的虚拟磁盘,但是不要删除文件; - 将
VBoxManage.exe
所在位置加入PATH
(或者写全路径直接调用) - 执行
VBoxManage.exe C:\bucket\VirtualDisks\Win7Base.vdi --type immutable
,路径自己改; - 此时,在
虚拟介质管理器
中,应该能看见此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 ...
- 彻底删除刚刚装系统用的虚拟机(实在想不出来它还有啥用了)。由于此虚拟机跟这个
VDI
文件已经没了关系,删除虚拟机应该不会动VDI
文件;
据说,如果你怕不小心改了这个VDI
文件(它完蛋了所有基于它的虚拟机就全完蛋了),操作完了之后可以把它设置成只读文件。
新建差分虚拟机
- 新建虚拟机;
- 创建或选择现有磁盘时,选择刚才那个
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
了。
如果需要其他的虚拟机,再按本小节目录执行一遍就行了,完全没有重新装系统的麻烦。当然增强功能什么的还是要再来一次的。