# 使用Virtualbox的差分盘技术建立虚拟机 # 背景 早知道有这项技术,但以前磁盘空间压力没这么大,所以也就懒得折腾。现在换了纯SSD的电脑,还只有256G,自然是要关注一下虚拟机占磁盘的问题了。 > 听说有人预测2018上半年储存产品会降价,拭目以待——2017年11月25日 # 目标 安装一个纯净的基础系统(比如`Win7`),将其磁盘用来做所有其他虚拟机的母盘。其他虚拟机所用的硬盘都只记录自己的磁盘相对母盘的差异。牺牲一点点性能换取磁盘空间利用率。 # 步骤 其实挺简单的,参考了[这个帖子](https://bbs.kafan.cn/thread-984285-1-1.html)。原帖写的有点乱,整理一下。 ## 装一台纯净的基础虚拟机 1. 按正常方法新建虚拟机,磁盘选`VDI`,动态分配; 2. 安装系统; 3. 用**可靠方式**激活;这里的“可靠”指的是磁盘ID、硬件环境略微变化后仍然有效,否则有可能出现用该磁盘差分出来的虚拟机第一次开机就黑屏/要求激活的情况。 注意事项: + 不要分配共享文件夹; + 不要安装增强工具; + 如果需要传文件,使用U盘中转; 以上都是为了尽量不在此母盘中留下专属于某台虚拟机的痕迹。洁癖。 安装`Win7`时,VirtualBox会默认使用`USB 2.0`控制器,在`USB 3.0`的电脑下,会出现无法挂载`USB 3.0`U盘的问题。如果在虚拟机设置中切换到`USB 3.0`控制器,又会出现`Win7`没有`USB 3.0`驱动的问题——此时可以去下载安装[Intel 提供的驱动](https://downloadcenter.intel.com/zh-cn/download/21129/USB-3-0-USB-3-0-Intel-7-Series-C216-),或者换一个`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会自动创建一个基于它的差分盘;创建虚拟机完成之后可以在`设置-储存`这里看到明细: {{:ordinarysoftware:virtualbox_difference_disk.png?direct|磁盘明细}} 注意,此时`位置`显示的是刚才的`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`了。 如果需要其他的虚拟机,再按本小节目录执行一遍就行了,完全没有重新装系统的麻烦。当然增强功能什么的还是要再来一次的。