Поддержка команд VirtualBox и SSD TRIM

Мне известно о огромном количестве сообщений в Интернете, в которых говорится, что это не сработает, и почему я действительно потратил несколько дней на поиски решений несколько месяцев назад, но вчера я нашел несколько советов о том, как "включить поддержку команд 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 --необорот на --discard на --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)
- это действительно передача TRIM вниз к операционной системе хоста или это просто похоже?

3 ответа

--discard Параметры указывают, что vdi изображение будет уменьшено в ответ на trim команда от гостевой ОС. Следующие требования должны быть выполнены:

  • формат диска должен быть VDI
  • очищаемая область должна быть не менее 1 МБ (размер)
  • [вероятно] очищаемая область должна покрывать один или несколько блоков по 1 МБ (выравнивание)

Очевидно, гостевая ОС должна быть настроена на выпуск trim команда, обычно это означает, что гостевая ОС создана, чтобы считать диск SSD. Ext4 поддерживает -o discard монтировать флаг; OSX, вероятно, требует дополнительных настроек, поскольку по умолчанию этой команде выдаются только SSD от Apple. Windows должна автоматически обнаруживать и поддерживать SSD, по крайней мере, в версиях 7 и 8, мне не ясно, происходит ли обнаружение во время установки или запуска. Драйвер Linux exFAT (любезно предоставлен Samsung) поддерживает команду сброса. Не ясно, поддерживает ли Microsoft реализацию exFAT, хотя файловая система была разработана для флэш-памяти с самого начала.

В качестве альтернативы существуют специальные методы выдачи trim например, Linux fstrim командование, часть util-linux пакет.

Предыдущие решения требовали от пользователя обнуления неиспользуемых областей, например, с использованием zerofree и явно сжать диск (я предполагаю, что это возможно, только если vm не в сети).

Так как это лучший результат в Google, позвольте мне немного прояснить другие ответы, хотя это старый пост. Фактически возможно заставить TRIM работать в том смысле, что неиспользуемые виртуальные блоки в гостевой файловой системе могут иметь соответствующие физические блоки флэш-памяти, помеченные как неиспользуемые для лучшего использования флэш-памяти. Части даже уже присутствуют в других ответах и ​​комментариях.

Во-первых, хост должен быть настроен так, чтобы свободное место было TRIM'ом. Вы можете либо смонтировать файловую систему с помощью -o discard, либо регулярно запускать fstrim в файловой системе через cron. Я предпочитаю последнее, так как первый вариант может привести к блокировке системы при удалении нескольких файлов одновременно.

Используемый формат диска должен быть динамического размера VDI, как пишет qarma.

Убедитесь, что nonrotational="true" discard="true" установлены в файле.vbox, как описано в разделе OP.

Затем включите TRIM в гостевой ОС как обычно. В Linux я снова рекомендую задание cron, запускающее fstrim. Это, вероятно, еще более важно, поскольку стоимость создания TRIM на образе виртуального диска намного выше, чем на физическом SSD, поскольку данные перемещаются, чтобы уменьшить размер изображения.

Теперь, поскольку образ диска регулярно сжимается, он будет занимать только фактическое используемое пространство плюс некоторые накладные расходы размером в 1 МБ, как пишет qarma. Это снова означает, что свободное место будет TRIM'ом на SSD хоста.

Исторически в VirtualBox существовала проблема, из-за которой включениеnonrotational="true" discard="true"вAttachedDeviceможет привести к зависаниям/блокировкам во время работы TRIM.

Журнал будет содержать такие вещи, как

      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.

В качестве временного решения включите кэширование ввода-вывода хоста (useHostIOCache="true"вStorageController)

              <StorageController useHostIOCache="true" ... >
          <AttachedDevice nonrotational="true" discard="true" ... >
Другие вопросы по тегам