Proxmox discard: что это и зачем включать TRIM для виртуальных дисков

Опция discard в Proxmox VE отвечает за проброс команд TRIM из гостевой системы виртуальной машины вниз — к хранилищу и физическому SSD, и если её не включить, удалённые внутри ВМ файлы не освобождают место на тонких дисках, а твердотельный накопитель постепенно теряет производительность записи. Проверить, включена ли она, можно прямо в веб-интерфейсе: VM → Hardware → Hard Disk → Edit, флажок Discard.

Проблема чаще всего всплывает в двух сценариях: либо растёт фактическое занятое место в хранилище LVM-thin или ZFS при том, что внутри гостевой ОС диск почти пуст, либо SSD хоста со временем начинает медленнее писать данные. В обоих случаях первое действие — проверить связку «discard на виртуальном диске + поддержка TRIM в гостевой системе». Ниже разберём, как это работает и где подводные камни.

Что такое discard и TRIM простыми словами

Когда гостевая ОС удаляет файл, она лишь помечает блоки своей файловой системы как свободные — сам гипервизор и физический накопитель об этом «не узнают» автоматически. Механизм TRIM решает именно эту задачу: ОС отправляет накопителю команду, что такие-то блоки больше не нужны.

В контексте виртуализации добавляется промежуточный слой: сначала команда TRIM должна пройти из гостевой ОС на виртуальный диск, а затем — от гипервизора к реальному хранилищу. Опция discard в конфигурации диска ВМ как раз разрешает этот проброс. Без неё команды TRIM из гостя просто игнорируются.

Для SSD это важно ещё и потому, что накопитель, знающий о свободных блоках, может заранее стирать их фоном, что поддерживает скорость записи и снижает лишний износ ячеек. Для тонких хранилищ (thin provisioning) discard дополнительно возвращает неиспользуемое место обратно в пул.

На каких хранилищах discard реально работает

Не каждый тип хранилища Proxmox умеет принимать и обрабатывать команды discard. Прежде чем включать опцию, стоит понять, куда лежит виртуальный диск.

  • 💾 LVM-thin — discard поддерживается, освобождённые блоки возвращаются в тонкий пул.
  • ZFS (zvol) — поддерживается, но поведение зависит от настроек пула и версии ZFS.
  • 📁 Directory/NFS с qcow2 — работает, если образ в формате qcow2 и включён проброс; raw-файлы на обычных ФС обычно не возвращают место.
  • 🧱 Ceph RBD — поддерживается, команды discard пробрасываются в кластерное хранилище.
  • 🚫 Thick LVM и raw-разделы — место выделено заранее, возвращать нечего, discard не даёт эффекта экономии.

Отдельный нюанс — сам физический накопитель. Команду TRIM должны поддерживать SSD и контроллер (или HBA), через который он подключён. Некоторые RAID-контроллеры не пробрасывают TRIM к дискам, и тогда discard доходит только до уровня хранилища, но не до железа.

Как включить discard в Proxmox

Включение выполняется на уровне каждого виртуального диска. В веб-интерфейсе откройте нужную ВМ, перейдите в раздел Hardware, выберите диск и нажмите Edit, затем отметьте флажок Discard. Изменение применяется без переустановки гостевой системы.

То же самое в конфигурационном файле ВМ выглядит как параметр discard=on в строке диска, например:

scsi0: local-lvm:vm-100-disk-0,discard=on,iothread=1,size=32G

Чтобы TRIM реально заработал, одной галочки мало — нужна поддержка внутри гостевой ОС:

  • 🐧 Linux-гость: либо периодический запуск fstrim (обычно через таймер fstrim.timer в systemd), либо монтирование ФС с опцией discard.
  • 🪟 Windows-гость: современные версии выполняют TRIM по расписанию через «Оптимизацию дисков», если виртуальный диск определён как SSD.
  • 🔌 Тип контроллера: discard корректно работает с VirtIO Block, VirtIO SCSI и SATA; для старых IDE-дисков проброс может не поддерживаться.

☑️ Проверка и включение discard

Выполнено: 0 / 5

Пошаговая проверка работы TRIM

После включения опции имеет смысл убедиться, что команды TRIM действительно проходят сквозь всю цепочку. В Linux-госте проверяется поддержка discard блочным устройством:

lsblk -D

Если в колонках DISC-GRAN и DISC-MAX стоят ненулевые значения — виртуальный диск принимает команды discard. Далее можно вручную запустить обрезку свободного места:

fstrim -av

Команда выведет, сколько байт было «подрезано» на каждой смонтированной файловой системе. После этого на хосте стоит проверить занятое место в хранилище — например, для LVM-thin командой lvs или через веб-интерфейс в разделе хранилища. Если место не вернулось, возможные причины: хранилище не thin, discard не включён на диске, либо файловая система гостя не поддерживает TRIM.

⚠️ Внимание: монтирование файловой системы с постоянной опцией discard внутри гостя на некоторых накопителях может вызывать заметные задержки при интенсивном удалении файлов. Более предсказуемый вариант — периодический fstrim по расписанию.
📊 Используете ли вы discard на виртуальных дисках Proxmox?
Да, включён на всех ВМ
Включён только на части ВМ
Нет, не знал(а) об этой опции
Пробовал(а), но отключил(а)

Влияние на производительность и износ SSD

Сам по себе discard не ускоряет и не замедляет виртуальную машину в обычной работе — он лишь передаёт информацию об освобождённых блоках. Однако косвенные эффекты есть. Для SSD регулярный TRIM помогает контроллеру накопителя поддерживать скорость записи, потому что стирание блоков выполняется фоном, а не в момент записи новых данных.

С точки зрения износа картина двоякая. С одной стороны, TRIM снижает объём лишних операций перезаписи при сборке мусора внутри накопителя. С другой — частые мгновенные discard-операции при удалении большого числа файлов создают дополнительную нагрузку. Именно поэтому для гостевых Linux-систем чаще советуют таймер fstrim раз в неделю, а не непрерывный discard при каждом удалении.

На стороне хоста Proxmox аналогичная логика применима и к самому гипервизору: если хост работает с локальных SSD, проверьте, что fstrim.timer активен и на нём — это независимый от discard в ВМ механизм.

Типичные проблемы и их диагностика

Чаще всего жалобы выглядят так: «удалил в ВМ 50 ГБ, а место на хранилище не вернулось». Разбор такой ситуации стоит вести по цепочке сверху вниз: гостевая ФС → виртуальный диск → хранилище → физический накопитель.

СимптомВероятная причинаЧто проверить
Место не возвращается в пулDiscard выключен на диске ВМПараметр discard=on в конфигурации диска
lsblk -D показывает нулиКонтроллер диска не поддерживает discardТип контроллера: VirtIO/SCSI вместо IDE
fstrim выполняется, но пул не уменьшаетсяХранилище не thin или raw-форматТип хранилища и формат образа (qcow2)
TRIM в госте есть, SSD не получает командыRAID-контроллер не пробрасывает TRIMДокументация контроллера, режим HBA/JBOD
Рост занятого места в LVM-thinfstrim не запускается в гостеСтатус fstrim.timer в гостевой ОС

Отдельный случай — снапшоты. Пока существует снапшот ВМ, освобождённые блоки могут оставаться занятыми, потому что на них ссылается моментальный снимок. Перед выводами о «неработающем discard» проверьте, нет ли у диска старых снапшотов.

⚠️ Внимание: переполнение тонкого пула LVM-thin может привести к повреждению данных всех ВМ на нём — discard снижает риск переполнения, но не отменяет необходимости следить за заполнением пула и настраивать мониторинг.
Discard и шифрованные диски

Если внутри гостя используется шифрование (LUKS), команды TRIM по умолчанию могут не пробрасываться через слой dm-crypt — это требуется разрешать отдельной опцией. Учтите, что включение TRIM поверх шифрования раскрывает информацию о том, какие блоки заняты, что считается незначительным, но реальным компромиссом с точки зрения приватности.

Когда discard включать не стоит

Есть сценарии, где опция бесполезна или нежелательна. На thick-хранилищах (обычный LVM, raw-образы на выделенном месте) discard не возвращает место — эффекта просто не будет, хотя вреда тоже нет.

Также осторожность нужна на старых или проблемных SSD, где обработка TRIM работает с ошибками — известны случаи, когда отдельные модели накопителей некорректно обрабатывали команды обрезки. Если после включения discard появились ошибки ввода-вывода в логах хоста (dmesg, журнал), отключите опцию и проверьте обновления прошивки накопителя у производителя.

Наконец, в гостевых системах с шифрованием, как отмечено выше, вопрос discard упирается не только в производительность, но и в модель угроз — решение стоит принимать осознанно.

Часто задаваемые вопросы

Нужно ли перезагружать ВМ после включения discard?

Как правило, для подключённых дисков изменение применяется при следующем перезапуске ВМ или горячем переподключении диска. Надёжнее выполнить полную перезагрузку виртуальной машины, чтобы гарантировать применение параметра.

Работает ли discard с Windows-гостем?

Да, если виртуальный диск подключён через VirtIO SCSI или VirtIO Block и определяется как твердотельный накопитель. Windows выполняет оптимизацию (TRIM) автоматически по расписанию; проверить можно в оснастке «Оптимизация дисков».

Чем discard отличается от fstrim на хосте?

Это разные уровни. Discard в конфигурации ВМ пробрасывает TRIM из гостя вниз. А fstrim на самом хосте обрезает свободное место файловых систем гипервизора. Для полной картины обычно нужны оба механизма.

Почему после fstrim место в пуле вернулось не всё?

TRIM освобождает только те блоки, которые файловая система гостя считает свободными. Занятые снапшотами блоки, служебные данные и фрагментация thin-пула могут оставлять часть места выделенной — это нормальное поведение.

Влияет ли discard на производительность ВМ в реальном времени?

При периодическом запуске через fstrim.timer влияние практически незаметно. Непрерывный discard (опция монтирования в госте) на некоторых накопителях может вызывать кратковременные задержки при массовом удалении файлов.