VMware

原理: 通过重新定义分区的末端来调整分区大小.
被调整分区必须是该硬盘上的最后一块分区(VMware扩展出来的空间会在尾部追加).

sudo su # 切换到root
fdisk /dev/sda # 用fdisk打开硬盘
p # 打印当前分区表
d # 删除需要扩展的分区
n # 创建新分区(一般默认选项就是最大的分区设置), 如果提示分区有ext4签名, 则移除签名
p # 打印当前分区表, 确认新分区大小正确
w # 写入并退出
partprobe # 让系统重新读取分区表
resize2fs /dev/sda2 # 更新Ext4的分区大小
df -h # 检查分区是否扩展成功

下载GParted的Live CD, 重启虚拟机进入Live CD系统.
调整分区大小, 将不需要的空间做成一个单独的Ext4分区.

重启后进入Linux:

sudo fdisk -l # 找到不需要的Ext4分区
sudo zerofree /dev/sda3 # 向分区填充0
sudo vmware-toolbox-cmd disk shrinkonly # 收缩磁盘回收空间

注意, VMware并不支持缩小虚拟磁盘, 所以这只是回收虚拟磁盘里未使用的空间.
若向虚拟机里添加文件, 虚拟磁盘的占用空间仍然会增大.
若需要防止虚拟磁盘的占用空间增大, 则应该考虑缩小分区大小.

参考:

  • https://superuser.com/questions/211798/how-to-reduce-the-size-of-vmware-disk
  • https://unix.stackexchange.com/questions/304903/vmware-why-is-zero-filling-ext4-free-space-needed-to-shrink-vmdk-files
# 碎片整理(要运行很久, 一些文件无法被整理, 执行过程中会弹出错误, 忽略它们)
sudo e4defrag /
# 用0填充所有剩余空间, 以便让VMware工具能够相信这些空间能够被回收(如果不执行此步骤, 则能够回收的空间将大打折扣)
dd if=/dev/zero of=wipefile bs=1M; sync; rm wipefile
# 另一种选择是zerofree, 但该工具要求卸载文件系统.
# 收缩磁盘
sudo vmware-toolbox-cmd disk shrinkonly
# 碎片整理(要运行很久, 一些文件无法被整理, 执行过程中会弹出错误, 忽略它们)
sudo e4defrag /
# 压缩并收缩磁盘
sudo vmware-toolbox-cmd disk shrink /