我知道网上有大量帖子说这行不通,以及为什么行不通,几个月前我确实花了好几天时间寻找解决方案,但昨天我发现了一些关于如何为客户机“启用 TRIM 命令支持”的提示。我试过了,“看起来”它有效。我想知道的是问题出在哪里,或者这真的能正常工作吗。
资料来源:
https://forums.virtualbox.org/viewtopic.php?f=7&t=51768
http://jaysonrowe.blogspot.com/2013/08/compacting-virtualbox-vdi.html
我附加磁盘文件的确切命令:
VBoxManage storageattach“GuestOsMachineName”--storagectl“SATA”--port 1--device 0--nonrotational on--discard on--medium“C:\path\to\file.vdi”--type hdd
在机器的 *.vbox 文件中生成了以下条目:
<AttachedDevice nonrotational="true" discard="true" type="HardDisk" port="1" device="0">
<Image uuid="{3836a042-a83e-4000-9a59-e95ad65162ce}"/>
</AttachedDevice>
为了确保不会丢失任何数据,这个驱动器是第二个连接到机器的驱动器。我做了一些简单的测试,比如将一些文件复制到驱动器,将其保留,重新启动机器,关闭机器,在重新启动后检查它是否在那里,查看主机操作系统中的磁盘文件使用情况。结果是:
- 不使用选项 --nonrotational 和 --discard 附加的磁盘文件即使在客户操作系统中删除文件后仍保持其(动态)大小
- 上述两种选项附加的磁盘文件在数据删除后释放空间
现在我的问题如下:
--discard 选项到底起什么作用?VirtualBox 手册中没有描述(http://www.virtualbox.org/manual/ch08.html#vboxmanage-storageattach)
- 它真的将 TRIM 传递给主机操作系统了吗,还是只是看起来像?
答案1
--discard
选项指定vdi
图像将根据trim
客户操作系统的命令缩小。必须满足以下要求:
- 磁盘格式必须是 VDI
- 清除区域必须至少为 1MB(大小)
- [可能] 清除区域必须覆盖一个或多个 1MB 块(对齐)
显然,必须将客户操作系统配置为发出trim
命令,通常这意味着让客户操作系统认为磁盘是 SSD。Ext4 支持-o discard
挂载标志;OSX 可能需要额外的设置,因为默认情况下只有Apple 提供的 SSD 会发出此命令。Windows 至少在版本 7 和 8 中应该自动检测和支持 SSD,我不清楚检测是在安装时还是运行时进行。Linux exFAT 驱动程序(由三星提供)支持丢弃命令. 目前尚不清楚微软的 exFAT 实现是否支持相同的功能,尽管该文件系统最初是为闪存设计的。
或者,有临时方法来发出trim
,例如 Linuxfstrim
命令、包的一部分util-linux
。
早期的解决方案要求用户将未使用的区域清零,例如zerofree
明确使用和压缩磁盘(我假设这只有在虚拟机离线时才有可能)。
答案2
由于这是 Google 上的最佳结果,因此我来澄清一下其他答案,尽管这是一篇旧帖子。事实上,TRIM 是可行的,因为客户文件系统上未使用的虚拟块可以将相应的闪存物理块标记为未使用,以便更好地利用闪存。这些内容甚至已经出现在其他答案和评论中。
首先,必须设置主机,以便对可用空间进行 TRIM。您可以使用 -o discard 挂载文件系统,也可以通过 cron 定期在文件系统上运行 fstrim。我更喜欢后者,因为第一个选项可能会导致系统在一次删除许多文件时锁定。
使用的磁盘格式必须是 qarma 写入的 VDI 动态大小。
确保.vbox 文件中设置了 nonrotational="true" discard="true" ,如 OP 中所述。
然后像往常一样在客户操作系统中启用 TRIM。在 Linux 中,我再次推荐运行 fstrim 的 cron 作业。这可能在这里更为重要,因为在虚拟磁盘映像上执行 TRIM 的成本比在物理 SSD 上高得多,因为数据被移动以使映像更小。
现在,由于磁盘映像定期压缩,它只会占用实际使用的空间,加上 qarma 写入时的 1MB 块大小开销。这再次意味着主机 SSD 上的可用空间将被 TRIM。
答案3
VirtualBox 中一直存在一个问题,在 TRIM 操作期间启用nonrotational="true" discard="true"
它AttachedDevice
会导致冻结/锁定。
日志将包含以下内容
AssertLogRel /home/vbox/tinderbox/build-trunk/svn/src/VBox/Devices/Storage/DevAHCI.cpp(4466) bool ahciR3CmdPrepare(PPDMDEVINS, PAHCI, PAHCIPORT, PAHCIREQ): ASMAtomicReadU32(&pAhciPort->cTasksActive) <= AHCI_NR_COMMAND_SLOTS
AHCI#0P0: There are more than 32 (+1) requests activeAssertLogRel /home/vbox/tinderbox/build-trunk/svn/src/VBox/Devices/Storage/DevAHCI.cpp(4466) bool ahciR3CmdPrepare(PPDMDEVINS, PAHCI, PAHCIPORT, PAHCIREQ): ASMAtomicReadU32(&pAhciPort->cTasksActive) <= AHCI_NR_COMMAND_SLOTS
VD#0: Request{0x007fdcbe618200}:
Type=FLUSH State=CANCELED Id=0x8 SubmitTs=458950321 {3269508} Flags=0x2
Offset=0 Size=0 Left=0 BufSize=0
VD#0: Request{0x007fdcbe61bc80}:
Type=DISCARD State=CANCELED Id=0x18 SubmitTs=458980326 {3239503} Flags=0x2
Offset=0 Size=0 Left=0 BufSize=0
唯一的出路就是终止虚拟机:vboxmanage startvm <name> --type emergencystop
至少在 VirtualBox 7.0.6 中这仍然是一个问题。
作为临时解决方法,请启用主机 I/O 缓存(useHostIOCache="true"
在StorageController
)
<StorageController useHostIOCache="true" ... >
<AttachedDevice nonrotational="true" discard="true" ... >