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


35

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

在虚拟机中删除文件不会释放我的VDI文件从主机硬盘空间获取的空间。

如何缩小这些文件,以将未使用的硬盘空间还给主机?

Answers:


34

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

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

对于ext2到ext 4文件系统,可以从Ubuntu guest 虚拟机 使用命令行实用程序zerofree *来完成安装zerofree

zerofree /dev/sdxX

这需要不使用驱动器并卸下驱动器。因此,我们可能必须将其临时绑定到为此目的而创建的另一个VM,或者我们需要在该VM上启动Ubuntu Live环境。

替换为/dev/sdxX有问题的ext2,ext3或ext4格式化分区

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

一旦所有未使用的驱动器空间都填满了零,我们将使用

VBoxManage modifyhd <name>.vdi --compact

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

*在Windows guest虚拟机中,我们可以使用实用程序替换未使用的空间sdelete


这对来宾内的加密文件系统也有效吗?
smichak

当然。如果您使用ecryptfs,则加密文件在磁盘实用程序中看起来就像普通文件一样,并且可以使用。如果您使用的是全盘加密,则无论如何它都不会被识别为ext格式化的分区:)
chronospoon 2015年

我在dm-crypt块设备上使用ext4分区...我尝试了该方法,但压缩后看不到.vdi文件那么小。我认为零块在dm-crypt下保存为块设备上的非零块。
smichak

2
@smichak:这就是加密的重点。它将加密您的所有驱动器,以确保我们看不到文件边界。
塔卡特2015年

3
如果您不想将VDI附加到另一台计算机上,则可以启动进入恢复模式,并以只读方式挂载磁盘mount -n -o remount,ro -t ext4 /dev/sda1,然后再以方式挂载zerofree -v /dev/sda1
哈米德·纳扎里

1

这是将可用磁盘空间归零的一些替代方法(这可能是最耗时的部分)。之后,您仍然必须运行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

1
我见过zerofree在已挂载的文件系统上使用过,但是以只读方式挂载时。即使对于根FS:sudo mount -o remount,ro /-但在GUI会话中,根也会很忙,因此会失败。但是可以在运行级别1(telinit 1)中使用,因此您无需从实时CD引导即可完成此操作。
Tomasz Gandor
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.