虚拟机磁盘空间膨胀是一个令人头疼的问题,特别是对许多搞开发的小伙伴。无论是做后台服务、嵌入式还是Android开发,都面临着这个难题。首先,操作系统本身就已占用不少空间,更新安装包,再下载一些开源软件,剩余空间立马就局促起来。要是进行Android开发,一个版本整下来,又是起步几十G的占用。对于Linux嵌入式开发,厂家SDK、编译工具链、构建系统(BuildRoot\Yocto)、再整个Ubuntu Arm版本,弄齐活了也得是几十G起步的占用。这样一来,怎么着也得预留100G的磁盘空间。
如果在安装系统时,没有选择分割磁盘文件模式,则上面所说的全部内容都会存放到一个虚拟磁盘文件上。也就是说,你在虚拟机系统中(比如Ubuntu)进行的下载行为,最终都会体现到物理机系统(比如Windows)上的一个vmdk文件中----这个文件会逐渐膨胀变大。但问题的关键是,即使在虚机系统中清理了部分空间,物理机系统这边的vmdk文件的空间占用并不会跟随减少。要解决这个问题,可以有下面几个办法:
1 安装系统时使用分割磁盘文件模式。但是很多小伙伴的遗留系统已经使用了单一磁盘文件模式,要改变模式,就需要重装系统。估计大家一想到要重装系统就头大,还是看看是否有其他临时措施可以比较好解决该问题。
2 通过Vmware自带的压缩磁盘功能。博主试了该功能,是能回收一些磁盘空间,但是杯水车薪,用处不大。几十G的空闲空间,通过该方法,仅能压缩3个G左右,这个结果不同的系统,不同的使用方式,可能会有些差异,但是从网上资料来看,大家的效果都一般。
3 使用Vmware自带的vmware-vdiskmanager工具。博主本人使用的是player免费版本,不带该工具,下载了pro版本,提取其中的工具测试,则总是提示磁盘空间不足。这样一来,这个方法也不是很好用。也许对原始pro版本安装的用户可能会友好一些,但对于免费版用户,估计还得寻找其他方法。
4 使用DiskGenius。该工具功能强大,支持常见虚拟机的虚拟磁盘格式,如下图所示:
使用DG工具缩减虚拟机磁盘文件空间占用的方法为:首先,新建虚拟磁盘文件,这样我们就有一个空白虚拟磁盘文件。然后再选择打开虚拟磁盘文件,将已有的虚拟磁盘文件导入DG工具。之后,再工具菜单中选择克隆磁盘,其中源选择导入的虚拟磁盘文件,目标为新建的虚拟磁盘文件。通过将实际虚拟机所用的虚拟磁盘内容按文件拷贝到新创建的空白虚拟磁盘中,可以解决磁盘文件占用虚胖的问题。
采用该方法的缺点主要是需要找到足够的空间存放新拷贝的虚拟磁盘文件。这个也可以通过移动硬盘来解决。另外,就是整个拷贝耗时会比较长,最好是在晚上不用虚拟机系统的时候做这项工作。
博主经过实际测试,确认该方法可行。拷贝的新的虚拟磁盘物理空间占用与虚机中系统实际占用是一致的(小于实际虚拟机磁盘物理空间占用)。使用该方法前先对虚拟机系统占用空间进行彻底的清理释放,因为做一次拷贝耗时是比较久的。
瘦身后的虚拟磁盘文件可以被虚拟机加载,系统运行也正常。为了保证可靠性。建议对原虚拟磁盘文件进行备份,确认新拷贝文件没有问题后再移除。博主在实际测试时出了一个小问题,就是Samba服务不可用。最初怀疑是拷贝出问题了,但是通过对问题分析并尝试一些方法后,最终还是解决了,这里就将博主的分析解决过程分享出来。
因为是做开发,Samba还是比较好用的。拷贝完后,发现额外占用的空间回来了,心情大好,马上就准备使用新拷贝的虚拟机。结果,发现共享目录打不开。
最开始博主还以为是网络问题,重新配置IP地址,重新停用-启用虚拟网卡,重新配置主机端IP地址等,都试过了,结果是可以PING通,NFS服务也是好的,就是Samba共享用不了。
此时,选择重启Samba服务看看。结果,服务重启失败。那看来跟网络应该是没什么关系了。查看Samba启动日志,查找失败原因:
未找到明确原因后,继续查看Samba自己的日志记录:
从中发现部分文件的权限不对。进一步的查看nmbd 和smbd的状态,修改权限
修改后,再次启动服务,成功运行。
通过对问题的解决,发现这种瘦身方式可能存在一些隐患。因为是按文件拷贝,而非磁盘扇区,故有可能部分文件的信息可能会遗失,但是大的方面,文件本身的内容应该不会出问题。
看来后续的话,原始虚拟磁盘文件还需要保留一段时间,以便不时之需。