libook
2023-08-28 16:28:02 +08:00
在虚拟机里用 df 看一下实际占用空间多大,如果是 6G 就说明可能安装过程中产生了很多缓存文件,可以用 apt clean 等指令清除一下,或者使用 du 看一下具体是哪个目录大,再看看里面究竟是啥、有没有用。
如果实际占用是 2G ,但虚拟磁盘文件占用 6G ,就可能是如下原因。
虚拟机的虚拟磁盘有两种分配空间的方式,一种是直接足量分配空间,另一种是随着写入数据增多动态扩大到设定的存储空间。题主说虚拟磁盘文件的大小会变化,那么就假设你用的是后者。
动态分配的方案里,看你文件系统是什么行为。
首先很多文件系统上,删除数据不是真的删除了数据,而是将数据空间标记为空闲,未来可以直接覆盖写入这个空间,所以你在虚拟磁盘里写入 1GB ,再删除这 1GB 的数据,你的虚拟磁盘的大小就会维持 1GB 不变,不会因为你在里面删除了数据就自动缩小到 0 。
其次看你的文件系统是怎么覆盖数据的,比如你向虚拟硬盘里写入 1GB 的数据,删除这 1GB 的数据,再写入 1GB 数据的时候是在原来的存储块上覆盖写入,还是会另外开辟一块空间写入。如果是前者的话,写 1G 、删 1G 、再写 1G ,你的虚拟磁盘文件就还是 1G 大小;如果是后者的话,写 1G 、删 1G 、再写 1G ,你的虚拟磁盘文件就会变成 2G 大小。为了优化 SSD 的使用寿命,一些文件系统是必须启动 Trim 等维护任务才会实际释放空闲空间,或者会基于一些算法尽可能均匀使用所有存储单元,最终反映到虚拟磁盘文件上就是文件大小越来越大,直到到达你一开始设定的最大大小。
大多虚拟机都提供了压缩虚拟磁盘文件大小的工具,但这些工具通常都要求你的虚拟磁盘内的数据尽可能聚集在文件头部,后面的空间都用 0 填充,理想状态下可以压缩到你虚拟磁盘内实际占用空间的大小。这个不同文件系统的预处理方式不一样,比如有的文件系统你就需要手动进行碎片整理,将所有数据都集中在磁盘头部,然后再使用 dd 或者 zerofree 将剩余空间用 0 填充。