如何从 VirtualBox 缩小动态增长的 VDI 磁盘?

如何从 VirtualBox 缩小动态增长的 VDI 磁盘?

我在 Virtual Box 中安装的各种 Ubuntu 的动态增长虚拟磁盘(VDI)实际上确实在稳步“增长”。

删除虚拟机中的文件并不会释放我的 VDI 文件占用的主机硬盘空间。

我该如何缩小这些文件以将未使用的硬盘空间返回给主机?

答案1

动态增长的 Virtual Box 虚拟硬盘文件能够根据虚拟机的需求增长,直至达到我们在设置此文件时定义的最大大小。但是,它不会释放我们在客户操作系统中删除的文件的空间。

如果磁盘增长过多,我们可以再次压缩它,前提是未使用的空间用零填充,并且驱动器采用 VDI 格式。

对于 ext2 到 ext 4 文件系统,可以使用命令行实用程序从 Ubuntu 客户机完成此操作零自由 安装 zerofree*

zerofree /dev/sdxX

这需要驱动器未被使用,并且卸载。因此,我们可能必须将其临时绑定到我们为此目的创建的另一台 VM,或者我们需要在此 VM 上启动 Ubuntu 实时环境。

替换/dev/sdxX为 ext2、ext3 或 ext4 格式分割有问题。

在多个分区上,我们可能必须zerofree对每个分区重复此操作。请记住,通过填充零,虚拟文件​​将暂时增长到其最大大小。

一旦所有未使用的驱动器空间都用零填充,我们就会使用以下方法缩小驱动器

VBoxManage modifyhd <name>.vdi --compact

这将大大减小我们的 VDI 文件的大小。

* 在 Windows 客户机中,我们可以使用该实用程序替换未使用的空间sdelete

答案2

以下是一些将可用磁盘空间清零的替代方法(这可能是最耗时的部分)。之后,您仍必须运行VBoxManage modifyhd <disk> --compact以压缩实际的磁盘文件。


此命令可以在卸载磁盘时将其清零:

apt-get install zerofree
zerofree -v /dev/sdxN


下面是如何让 dd 定期打印输出的示例:

dd if=/dev/zero of=temp-file-on-disk bs=20M

# run this to get the process ID of the dd command
pgrep -l '^dd$'
# then put the process ID on the command line to "kill -USR1"
# this will tell dd to print the current status (in another terminal)
kill -USR1 $(pgrep -l '^dd$' | awk '{print $1}')


这是一个dd类似 的程序,它将自动定期打印输出:

apt-get install dcfldd
dcfldd if=/dev/zero of=temp-file-on-disk bs=20M

相关内容