为什么要回收 VMWare 的空间?
起因
例行清理 mac 的垃圾文件,虽然自己的硬盘有512g,然而里头东西超过250g 的时候对于强迫症患者来说还是难受的一批。
用 cleanmymac 清来清去也只能清一点点。删除了 Download 文件夹里面不需要的东西之后,发现也才多了半个 G,是我平时下的东西太小了吗【问号脸
用 DaicyDisk 分析了一下磁盘,发现在用户文件夹下,占空间较大的就是两个虚拟机——Parallels Desktop 和 VMWare Fusion。
因为在 PD 上装的是 Windows,搭了一个 C/C++ 的开发环境,总共 VS 下来加系统也得30多 g,基本上是回收不了太多空间了。
所以就盯上了 VM。
VM 特别的诡异,在 Linux 里面看包含 swap 也只用了8g 多的空间,结果整个 vmdk 文件就占了13g 多,所以这就需要用手术刀咔擦一下调教调教。
而且!而且!不知道为啥我的 VM 里头的可回收没有!
没办法死马当活马医了,总是有办法的。
折腾开始
清 apt 缓存
首先例行的就是清除 apt 的缓存,这个稍微用过 Ubuntu 的小伙伴都知道怎么清掉不用的依赖和缓存。(但是其实空不出多少空间来的,因为软件包什么的也就几百几时 mb 这样)
总之有一点是一点吧【习习蛤蛤
1 | sudo apt-get autoclean # autoremove 也一样 |
结果清掉了一点。结果还是没法回收。
Linux 神奇的 zero
因为找不到占空间的东西,所以推测应该是硬盘缓存之类的,明明删除了但是还是留下了没有清除的数据。
摘自维基百科:
在类UNIX 操作系统中, /dev/zero 是一个特殊的文件,当你读它的时候,它会提供无限的空字符(NULL, ASCII NUL, 0x00)。其中的一个典型用法是用它提供的字符流来覆盖信息,另一个常见用法是产生一个特定大小的空白文件。BSD就是通过mmap把/dev/zero映射到虚地址空间实现共享内存的。可以使用mmap将/dev/zero映射到一个虚拟的内存空间,这个操作的效果等同于使用一段匿名的内存(没有和任何文件相关)。
所以我们可以直接读取这个文件写到一个新的文件里面直到硬盘占满,然后删除这个文件就可以把那些幽灵空间都置零。
1 | sudo cat /dev/zero > zero # 此处的 zero 文件就可以是想要回收空间的挂载点 |
有一点很重要,就是执行完了 zero 的文件写入之后可能会提示硬盘已满,这时候不要惊慌,要的就是这种效果。
这时候虽然在系统里面看是没有啥变化的,但是在虚拟硬盘的逻辑上已经发生了空余空间全置零的改变。
宿主机操作 调用 vm 自带工具
这时候就需要宿主机这边的空间回收操作了,然而 GUI 界面给的接口完全没法用,回收不到啥。所以查了半天,还是看到了骚操作。
这个 vmware-vdiskmanager 也是 vm 自带的工具,然而并没有用在 GUI 的操作界面上,只能手动调用。
先整理一下硬盘碎片。
1 | $ cd /Applications/VMware\ Fusion.app/Contents/Library |
然后看一下现在虚拟硬盘文件的大小
1 | $ ls -l ~/VMWare/Ubuntu\ 64\ 位.vmwarevm/虚拟磁盘.vmdk |
正式开始回收空间,等到进度跑满就完成了。
1 | $ ./vmware-vdiskmanager -k ~/VMWare/Ubuntu\ 64\ 位.vmwarevm/虚拟磁盘.vmdk |
再来看看回收空间之后的空间大小。
1 | $ ls -l ~/VMWare/Ubuntu\ 64\ 位.vmwarevm/虚拟磁盘.vmdk |
可以看到,虚拟硬盘从14744485888
字节减小到了8921939968
字节,也就是13.73
G 减小到了8.3
G,可以说效果十分拔群了。