VirtualBox and SSD's TRIM command support

27

15

I am aware of the huge number of posts on the internet saying that this would not work and why and I really spent days looking for the solutions months ago but I've found yesterday some tips how to "enable TRIM command support" for guest machines. I've tried it and "it looks" like working. What I would like to know is where's the catch or is this really working as it should.

Sources:
https://forums.virtualbox.org/viewtopic.php?f=7&t=51768
http://jaysonrowe.blogspot.com/2013/08/compacting-virtualbox-vdi.html

My exact command attaching the disk file:

VBoxManage storageattach "GuestOsMachineName" --storagectl "SATA" --port 1 --device 0 --nonrotational on --discard on --medium "C:\path\to\file.vdi" --type hdd

Which genereted this entry in the machine's *.vbox file:

<AttachedDevice nonrotational="true" discard="true" type="HardDisk" port="1" device="0">
    <Image uuid="{3836a042-a83e-4000-9a59-e95ad65162ce}"/>
</AttachedDevice>

To be sure I would not lose any data this drive was the second one attached to the machine. I've made simple test like copying some file to the drive, leaving it, restarting the machine, shutting down the machine, checking if it's there after booting back, looking at the disk file usage in the host OS. Results are:

  • disk file attached without options --nonrotational and --discard keeps its (dynamic) size even after deleting files in the guest OS
  • disk file attached with both options mentioned above releases the space after the data was deleted

Now here are my questions:
- what does exactly --discard option do? it's not described in the VirtualBox manual (http://www.virtualbox.org/manual/ch08.html#vboxmanage-storageattach)
- is it really passing TRIM down to the host OS or does it just look like?

Krzysztof Szynter

Posted 2013-09-17T14:28:10.513

Reputation: 683

Just a warning for anybody interested in the topic. The trimming implementation on the VirtualBox disk image emulator is extremely buggy and will likely crash your vm. There's a 2 years old bug opened for it. It's possible to enable it but don't waste time trying it. – Dominik SMogor – 2019-05-10T09:15:54.403

I think this is the bug Dominik is referring to: https://www.virtualbox.org/ticket/16450

– bobpaul – 2019-07-09T16:01:07.480

3Virtual TRIM used on a virtual machine interfaced to a virtual disk for virtual feelgood... – Fiasco Labs – 2013-09-17T19:12:49.007

Ramhound: So what is the "Solid-state drive" checkbox option in the storage submenu for? Beside, if there is an option like --discard mentioned in the manual, then it should be detailed. I completely don't get your point saying that "there is a reason why it's not described". If so, why it is in the manual at all? – Krzysztof Szynter – 2013-09-19T06:32:13.887

12To answer @Ramhound my blog is one of the post the OP listed. I'm not sure what his reason was, but for me, I had a Virtual Machine that I needed to physically shrink the filesize of the dynamically allocated disk. It was a disk that had held data that was deleted and I was trying to shrink it back down to a smaller size -- passing the TRIM command enabled that to happen...shrinking my virtual disk from 12G to 7G. To the OP, I hope my post helped you. I got here by seeing incoming traffic on my blog. – Jayson Rowe – 2014-01-07T03:03:26.880

Answers

19

--discard options specifies that vdi image will be shrunk in response to trim command from guest OS. Following requirements must be met:

  • disk format must be VDI
  • cleared area must be at least 1MB (size)
  • [probably] cleared area must be cover one or more 1MB blocks (alignment)

Obviously guest OS must be configured to issue trim command, typically that means guest OS is made to think the disk is an SSD. Ext4 supports -o discard mount flag; OSX probably requires additional settings as by default only Apple-supplied SSD's are issued this command. Windows ought to automatically detect and support SSD's at least in versions 7 and 8, I am not clear if detection happens at install or run time. Linux exFAT driver (courtesy of Samsung) supports discard command. It is not clear if Microsoft implementation of exFAT supports same, even though the file system was designed for flash to begin with.

Alternatively there are ad hoc methods to issue trim, e.g. Linux fstrim command, part of util-linux package.

Earlier solutions required user to zero out unused areas, e.g. using zerofree and compact the disk explicitly (I'm assuming that's only possible when vm is offline).

Dima Tisnek

Posted 2013-09-17T14:28:10.513

Reputation: 241

1Also, using some sort of de-duplication thing on btrfs (particularly one that punches out holes for 0 regions) and btrfs balance really helps with creating as many trimmable regions as possible. – Omnifarious – 2017-01-11T23:41:40.850

12

Since this is the top result on Google, let me clarify other answers a bit, even though this is an old post. It is in fact possible to get TRIM working in the sense that unused virtual blocks on the guest filesystem can have the corresponding physical blocks of flash marked as unused for better utilization of the flash. The pieces are even already present in the other answers and comments.

First, the host must be set up so that free space is TRIM'ed. You can either mount the filesystem with -o discard, or you can run fstrim on the filesystem regularly through cron. I prefer the latter, as first option can lead to the system locking up when deleting many files at one time.

The disk format used must be VDI dynamic size as qarma writes.

Make sure that nonrotational="true" discard="true" are set in the .vbox file as described under OP.

Then enable TRIM in the guest OS as normal. In Linux, I again recommend a cron job running fstrim. This is probably even more important here, since the cost of doing TRIM on the virtual disk image is much higher than on a physical SSD, since data is moved around in order to make the image smaller.

Now, since the disk image is regularly compacted, it will only take up the actual space used, plus some 1MB block size overhead as qarma writes. This again means that the free space will be TRIM'ed on the host SSD.

Jacob Larsen

Posted 2013-09-17T14:28:10.513

Reputation: 121

Actually I killed some of my VMs using the trim command. – davidbaumann – 2018-03-16T21:05:52.593

@davidbaumann How did that happen? – dvtan – 2018-05-08T16:08:02.257

Actually, after enabling it, it started to trim about 20GB. Exactly at this moment, the Laptop crashed (had some problems with my GPU these days). https://forums.virtualbox.org/viewtopic.php?f=2&t=75308

– davidbaumann – 2018-05-08T19:34:54.937

Command to do this to the existing first disk (assuming SATA): VBoxManage storageattach $VM --storagectl "SATA Controller" --port 0 --device 0 --nonrotational on --discard on – RobM – 2019-07-09T16:10:16.587