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管理器,打开检查磁盘,选择对应磁盘文件,可以看到磁盘空间被回收。