减少磁盘占用空间

本文更新于 2019.02.17

当使用VMware Workstation或Fusion虚拟机一段时间后, 虚拟机所占用的磁盘空间会越来越大, 而在虚拟机中删除文件, 释放空间并不能让VMware软件将磁盘空间还给宿主系统. 这问题对于磁盘空间比较宝贵的MacBook电脑来说, 就更令人烦恼.

本文描述在macOS上释放VMware Fusion所建立的Ubuntu虚拟机空间的方法, 经本人亲测, 释放之间虚拟机占用19GB, 释放后8GB, 释放了10GB以上的磁盘空间. 下文描述了释放空间的多种方法, 但正如上文所说, 使用VMware磁盘工具进行磁盘整理和回收才是最重要的.

清理软件包

通常我们用 sudo apt-get install 命令安装软件包后, apt-get下载的deb安装包会保留在系统上.所以如果你经常安装软件, 那么这些deb安装包会占据大量的空间.这些安装包在 /var/cache/apt/archives 目录下. 在软件安装完成后, 这些deb安装包就没什么用了.对于硬盘容量有限的服务器来说 apt-get clean 命令可以腾出很多空间.你可以输入下面的命令来查看 /var/chace/apt/archives 目录下deb安装包的总大小:

$du -sh /var/cache/apt/archives

要删除这些deb包, 只需要运行以下命令:

$sudo apt-get clean
$sudo apt-get autoclean
$sudo apt-get autoremove

清理不用的旧内核

若系统更新过好多次, 如Ubuntu, 在系统升级的过程中, 其所使用Linux内核也可能更新. 因此, 升级多次后, 你的boot文件夹就会变得比较大, 其原因就是因为虽然系统更新升级了新内核, 但是老内核依然留在了你的系统中. 实际上, 不删除掉老的内核也是一种安全测试. 虽然系统升级包在释放出之前已经进行了广泛的测试, 但依然可能有意外存在, 所以才不删除掉老的内核, 以便于使用新升级的内核无法启动时, 用户能马上使用老内核进行启动, 不至于导致你无法进入系统的悲剧. 不过在升级完毕, 重启后能进入系统后, 说明新内核已经很好的兼容了机器, 此时就可以放心大胆地删除掉老内核了.

不过删除老内核时一定要小心, 删除之前要先看一看现在正在使用的内核是哪一个. 方法是在终端中输入命令 uname –r, 然后看其显示的内核版本是多少. 看准了当前使用的内核后, 就可以放心地删除那些不用的老内核.

打开终端, 运行:

$dpkg --get-selections | grep linux

然后将不用的内核文件image、头文件headers删除掉就可以咯.在终端中输入命令:

$sudo apt-get purge  内核文件名  头文件名

清理日志

日志文件会变得越来越大, 我们可以用ncdu工具来查看大日志文件:

$sudo apt-get install ncdu
$sudo ncdu /var/log

看到哪些日志占用了空间后, 就可以清空其内容, 比如清理shadowsocks日志的内容:

$sudo dd if=/dev/null of=/var/log/shadowsocks.log

使用VMware磁盘工具回收磁盘空间

以上种种方法都是在删除虚拟机本身的空间, 但VMware并不会在清理后把磁盘空间还给macOS系统. 这时需要执行以下操作, 这也是所有清理手段中最关键的一步.

注解

VMware Fusion对于Windows虚拟机提供了释放磁盘空间的功能, 方法是在界面上选中Window虚拟机, 在右键菜单中选择”设置”, 然后选择”常规”, 然后在其中的磁盘占用图示上方点击”清理虚拟机”就可以了. Linux虚拟机不支持此功能.

首先, 需要用0填充上面各种手段释放出的磁盘空间:

$cat /dev/zero > zero; sync; sleep 1; rm -f zero

执行这个命令一段时间后会看到以下错误信息:

cat: write error: No space left on device

这是正常的, 说明虚拟机上的剩余磁盘空间已被用尽. 然后, 需要关闭虚拟机的电源, 才能执行之后的操作.

回到宿主机系统, 转到虚拟机存储目录, 使用VMware Fusion自带的磁盘管理工具对虚拟机的虚拟磁盘文件(后缀为.vmdk的文件)进行碎片整理:

$/Applications/VMware\ Fusion.app/Contents/Library/vmware-vdiskmanager -d ubuntu14.vmwarevm/虚拟磁盘.vmdk
  Defragment: 100% done.
Defragmentation completed successfully.

注解

后缀为.vmdk的文件可能会有多个, 比如:

-rw-------  1 zzq  staff   3.7G  5 25  2018 虚拟磁盘-s001.vmdk
-rw-------  1 zzq  staff   1.9G  5 25  2018 虚拟磁盘-s002.vmdk
-rw-------  1 zzq  staff   755M  5 25  2018 虚拟磁盘-s003.vmdk
-rw-------  1 zzq  staff   1.6G  5 25  2018 虚拟磁盘-s004.vmdk
-rw-------  1 zzq  staff   1.4G  5 25  2018 虚拟磁盘-s005.vmdk
-rw-------  1 zzq  staff   159M  5 21  2018 虚拟磁盘-s006.vmdk
-rw-------  1 zzq  staff   705B  5 22  2018 虚拟磁盘.vmdk

不用对每一个.vmdk文件调用命令, 只需要对没有编号的那一个调用就可以了

接下来压缩空间:

$/Applications/VMware\ Fusion.app/Contents/Library/vmware-vdiskmanager -k ubuntu14.vmwarevm/虚拟磁盘.vmdk
  Shrink: 100% done.
Shrink completed successfully.

至此, 磁盘空间释放完成.