我创建了一个动态增长的 VirtualBox VDI,并希望在长时间使用后缩小其大小。我简单地搜索了一下解决方案,似乎这样做的步骤如下:
- 将可用空间清零(通过创建一个充满零的大文件)。
- 跑步
vboxmanage modifyhd <VDI> --compact
。
我的问题是 VDI 大小(在客户机中看到)比 VDI 所在分区的大小大得多(例如 320GB 分区上的 2TB VDI)。在这种情况下,上述方法仍然可行吗?如果不行,还有其他可能的解决方案吗?
此外,如果 VDI 无法支持这种分配方案,其他虚拟磁盘格式可以支持吗?
答案1
您可以让 VirtualBox 在收到 TRIM 命令时自动丢弃映像中未使用的块(自VirtualBox 4.2)来自操作系统
- 存储:实现了在使用 VDI 映像时通过 SATA 和 IDE 的 TRIM 以及 SCSI 的 UNMAP 丢弃未使用的图像块的支持
您需要使用--nonrotational on
和--discard on
选项设置磁盘映像设置,例如
VBoxManage storageattach <VM name> --storagectl "SATA" --port 1 --device 0 --nonrotational on --discard on --medium path\to\file.vdi --type hdd
--discard
启用虚拟硬盘的自动丢弃功能。这指定 VDI 映像将响应来自客户操作系统的 trim 命令而缩小。必须满足以下要求:
- 磁盘格式必须是VDI。
- 清除区域的大小必须至少为 1 MB。
- Oracle VM VirtualBox 只会修剪整个 1 MB 块。VDI 本身被组织成 1 MB 块,因此只有当修剪的空间至少是 1 MB 边界处的 1 MB 连续块时,这才会起作用。在 Windows 上,偶尔使用 进行碎片整理
defrag.exe /D
,或在 Linux 上btrfs filesystem defrag
作为后台 cron 作业运行可能会有所帮助。
您也可以打开 *.vbox 配置文件并添加discard="true" nonrotational="true"
到<AttachedDevice>
标签
<AttachedDevice nonrotational="true" discard="true" type="HardDisk" port="1" device="0">
<Image uuid="{3836a042-a83e-4000-9a59-e95ad65162ce}"/>
</AttachedDevice>
更多信息可以在这里找到
答案2
vboxmanage modifyhd
(或较新的 vbox版本modifymedium
) 可以压缩 vdi 文件。正如您所提到的,可以创建动态磁盘,例如在 350Gb 分区中创建 2TB 的动态磁盘,当您在虚拟机中使用更多空间时,这种磁盘的大小会增加,直到物理磁盘上没有可用空间。执行压缩不会获得 vdi 的完整大小,您需要按照此过程将 vdi 文件压缩为您在客户机上看到的大小:
答案3
我认为 VDI 本身的大小不能大于其所在分区的大小。您的意思是 2TB 是分配给 VDI 的动态大小吗?
如果是,那么我认为你仍然可以做到。但是,在创建一个大的零填充文件后,你错过了一步。你需要删除它,然后关闭虚拟机并压缩它。