1. 基本原理

文件系统未占用的空间数据写完全0,会被视为空闲空间,可以被虚拟机软件回收。

操作步骤:

  1. 虚拟机内,空闲空间数据写0。
  2. 关闭虚拟机
  3. 回收虚拟磁盘文件空间

2. 文件系统和磁盘空闲区间擦除

对于根文件系统,只能使用dd命令创建全零文件模拟擦除。

1df      # 查看剩余空间大小
2dd if=/dev/zero of=zero.bin bs=1MiB count=1024
3sync
4rm -f zero.bin

其他可重新挂载的分区可以使用如下几种方式:

  1. 卸载或将文件系统挂为只读后,使用zerofree回收,注意zerofree只适用于ext2ext3ext4文件系统。
  2. 使用resize2fs压缩文件文件系统后,缩小磁盘分区,为空出来的磁盘空间建立分区并使用dd清零。

理论上方式2可以回收更多空间。

2.1. umount: device is busy处理

这是文件系统还在被占用,可以尝试如下几种方式:

  1. 强制结束进程,fuser -kvm /path/to/mountpoint
  2. 强制卸载文件系统,umount -f /path/to/mountpoint
  3. 使用sudo lsof /path/to/mountpoint查看占用进程,手动结束进程。

2.2. 使用zerofree

1# 两种方式选一种
2umount /dev/xxx
3mount -o ro,remount /path/to/mountpoint
4
5# 回收空间,
6zerofree /dev/xxx
7zerofree /path/to/mountpoint

2.3. 使用reseize2fs

详细参考《磁盘和文件系统扩容/缩容》。

 1umount /path/to/mountpoint
 2e2fsck -f /dev/xxx
 3# 查看文件系统最小占用空间
 4resize2fs -P /dev/xxx
 5# 压缩文件系统
 6resize2fs /dev/xxx xxG
 7# 进入parted命令行,调整分区大小,为空出来的空间创建分区
 8parted /dev/xxx
 9
10# 退出parted命令行,使用dd清零
11dd if=/dev/zero of=/dev/yyy bs=1M

3. 回收虚拟磁盘文件空间

完成上边虚拟机内的操作后,可以关闭虚拟机回收空间。

3.1. VMware回收空间

关闭虚拟机,进入编辑虚拟机设置,找到对应磁盘,点击压缩后等待完成即可。完成后,切换其他选项再切回对应磁盘,可以看到磁盘空间被回收。

3.2. Hyper-V回收空间

关闭虚拟机,使用管理员启动powershell,输入diskpart进入磁盘管理。

针对每个虚拟磁盘文件,进行如下操作:

1select vdisk file="D:\HyperV\data.vhdx"
2compact vdisk

完成后,通过Hyper-V管理器,打开检查磁盘,选择对应磁盘文件,可以看到磁盘空间被回收。