1. 基本原理
文件系统未占用的空间数据写完全0,会被视为空闲空间,可以被虚拟机软件回收。
操作步骤:
- 虚拟机内,空闲空间数据写0。
- 关闭虚拟机
- 回收虚拟磁盘文件空间
2. 文件系统和磁盘空闲区间擦除
对于根文件系统,只能使用dd命令创建全零文件模拟擦除。
1df      # 查看剩余空间大小
2dd if=/dev/zero of=zero.bin bs=1MiB count=1024
3sync
4rm -f zero.bin
其他可重新挂载的分区可以使用如下几种方式:
- 卸载或将文件系统挂为只读后,使用zerofree回收,注意zerofree只适用于ext2、ext3、ext4文件系统。
- 使用resize2fs压缩文件文件系统后,缩小磁盘分区,为空出来的磁盘空间建立分区并使用dd清零。
理论上方式2可以回收更多空间。
2.1. umount: device is busy处理
这是文件系统还在被占用,可以尝试如下几种方式:
- 强制结束进程,fuser -kvm /path/to/mountpoint。
- 强制卸载文件系统,umount -f /path/to/mountpoint。
- 使用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管理器,打开检查磁盘,选择对应磁盘文件,可以看到磁盘空间被回收。
 
   
   
   
  