给你的虚拟机“瘦身”

问题

在使用VirtualBox的过程中,我们会发现VirtualBox的虚拟机磁盘文件大小增长的很快,而实际虚拟机系统并没有存储那么多的文件。这是因为虚拟机动态分配的不会被自动释放。就好比你安装了一个10G的软件在你的虚拟机里,但是当你删除了这个软件以后,虚拟机并没有释放这片内存到你的物理机器中,而是继续占用。这样,很快我们的虚拟机就会占用很大内存。

需求

正好最近又有一个需求,就是将一个VirtualBox文件导出为ova文件,但是还要求这个ova文件还不能大于4G,而我直接导出的有近5个G,这就让我不得不去减小虚拟机的大小。

原理

利用工具将虚拟机硬盘中的空闲空间全部标零,以便让VBoxManage.exe 对虚拟硬盘vdi文件进行压缩。

步骤

1.转换格式

只有 VDI 的格式才能够通过 Virtualbox 的命令进行缩小,所以如果不是 VDI 格式的文件,先转换为 VDI 格式,如果已经是 VDI 格式就不需要这一步了。我的文件恰好不是,所以需要转换一下。

VboxManage clonehd  original-disk.vmdk  new-disk.vdi --format VDI
VboxManage是VirtualBox安装文件中的一个可执行文件。

说是转换,其实是拷贝,其中,original-disk.vmdk 为现有的磁盘文件,new-disk.vdi 为新的磁盘文件。
转换好了之后,设置虚拟机配置,让其使用新的磁盘文件。

2.zerofree清零

zerofree 可以把磁盘中不使用的块用 0 来填充,这样磁盘能够被更好的压缩。在我的虚拟机Ubuntu 中直接使用 apt 安装

apt-get install zerofree
接下来就是清零操作了
注意,在标记的过程中不能对硬盘进行写操作,windows下不清楚,linux下 zerofree 工具执行的时候需要硬盘处于只读模式。所以重启虚拟机时直接进入Recocery Mode模式,一般是启动菜单的第二个选项。
然后你会看到这个界面。


hewie^_^

选择Drop to root shell prompt进入shell,执行

df
找到你挂载到根目录的分区,比如我的是/dev/mapper/seeta—vg-root,执行
zerofree -v /dev/mapper/seeta—vg-root

等待需要比较长的一段时间。完成后关闭虚拟机,接下来在物理机中进行。

3.生效

在VirtualBox的安装目录下找到VBoxManage.exe,cmd中执行

VBoxManage.exe modifyhd "path\vm.vdi" -compact

等待,完成后你会发现虚拟机的硬盘文件缩小了很多。
接下来我将虚拟机导出为ova文件,结果不到3个G,差不多符合我的实际使用情况。
希望这篇文章能够帮助到你。

在我重新添加虚拟机时出现了如下错误:

Cannot register the hard disk 'D:\virtualboxMirror\new-disk.vdi' {d0c855fa-dd8d-43ea-8fb4-3056e13684b9} because a hard disk 'C:\Users\Administrator\VirtualBox VMs\ubuntu\new-disk.vdi' with UUID {d0c855fa-dd8d-43ea-8fb4-3056e13684b9} already exists.


错误的原因在于UUID(通用唯一识别码)重复了(添加之前要先删除干净,我没有严格遵守,所以出错了),需要重新设置UUID。
解决方法如下:
找到VirtualBox所在目录,在地址栏输入cmd,然后执行

VirtualBox.exe internalcommands sethduuid D:\virtualboxMirror\new-disk.vdi
(注:4.0.4之前版本的命令为setvdiuuid)

之后重启虚拟机,重新添加一下该vdi文件即可

原文地址:https://www.hewie.cn/goblog/home/article/article/article_id/13.html