我在 VBox 原生 VDI 格式和 VMDK 格式中都看到过这种情况。即使我从虚拟驱动器中删除文件,我也看到它一直在增长。我隐约觉得文件清零不会发生在来自此链接。当我尝试使用 SDelete 执行此操作时(如链接中所述),它并没有减少 VDi 磁盘大小。我有一些应用程序,一旦安装,每次都会将磁盘增大到 10GB。我相信应该有一些简单的方法来将其归零,而不是经历繁琐的过程,有吗?VirtualBox 中是否有任何选项可以让虚拟驱动器保持较小?
答案1
创建新虚拟机时,系统会提示您创建虚拟硬盘。磁盘有两种选择,固定或动态分配。这些是两种磁盘类型的描述(来自虚拟盒)。
固定的: 在某些系统上,创建固定硬盘文件可能需要更长时间,但使用速度通常更快
动态分配: 动态分配的硬盘文件将仅使用物理硬盘上的空间(最大固定大小),尽管当其上的空间被释放时它不会自动再次缩小
有可能您将其设置为动态分配,因此当磁盘空间被释放时,磁盘不会自动再次缩小。
答案2
下面是我用来压缩所有 VDI 文件的批处理脚本:
@echo off
for /d %%d in (*.*) do (
cd "%%d"
for %%f in (*.vdi) do (
echo Compacting %%f . . .
echo Initial size: %%~zf
"C:\Program Files\VirtualBox\VBoxManage.exe" modifymedium --compact disk "%%f"
echo Post compact size: %%~zf
echo.
)
cd ..
)
只需将其保存在包含虚拟机的文件夹中并运行...
答案3
出于性能原因,从虚拟驱动器中删除文件并不会减少其大小。
删除文件后,文件数据原先所在的位置会留下一个空洞。创建新文件或将数据写入磁盘后,这些空洞会填补。文件会在必要时增大以容纳更多数据,但永远不会缩小。
为什么?
从文件末尾以外的任何位置删除数据都是一项耗时的操作。必须移动数据来填补空缺,如果是虚拟驱动器,则需要更新许多对数据位置的内部引用。即使使用 SSD,删除一个小文件也需要几分钟。这显然是不可接受的。
您需要使用 vboxmanage --compact 来消除洞并缩小虚拟驱动器。