Твердотельный накопитель стирает данные блоками, а не отдельными байтами. Если файловая система удалила файл, диск об этом не узнаёт и продолжает считать блоки занятыми: при записи контроллер вынужден копировать данные, освобождать блок и писать заново. Команда TRIM сообщает накопителю, какие блоки больше не нужны, и тот помечает их свободными. В Linux это делает fstrim — разово или по таймеру systemd. Разберём, как проверить поддержку, настроить расписание и не навредить диску.

Зачем SSD нужен TRIM

Флеш-память изнашивается при каждой перезаписи блока. Без TRIM контроллер пишет новые данные в свободные ячейки, а старые освобождает только при заполнении — это увеличивает write amplification и сокращает ресурс. Кроме того, на дешёвых и старых моделях без своевременной очистки падает скорость записи после заполнения диска.

TRIM не является обязательным для работы: без него SSD продолжает функционировать, просто менее эффективно. Включать его стоит на накопителях с поддержкой команды, в том числе на NVMe, где используется команда Dataset Management. Для виртуальных дисков толк зависит от хранилища: thin-provisioned LUN и образы с поддержкой discard освобождают место на хосте.

Проверка поддержки TRIM

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

lsblk --discard
cat /sys/block/nvme0n1/queue/discard_max_bytes
sudo hdparm -I /dev/sda | grep -i trim
findmnt -no FSTYPE,OPTIONS /

Для SATA-дисков строка Data Set Management в выводе hdparm подтверждает поддержку. Для NVMe отдельная проверка не нужна: discard_max_bytes больше нуля говорит сам за себя. Заодно посмотрите тип файловой системы: ext4, XFS и Btrfs поддерживают FITRIM, а некоторые сетевые и FUSE-файловые системы — нет.

Разовая очистка и её вывод

fstrim обходит смонтированные файловые системы и передаёт диску список свободных блоков. Ключ -a обрабатывает все подходящие точки монтирования, -v печатает результат по каждой. Запускать команду можно на работающей системе, останавливать сервисы не требуется.

sudo fstrim --fstab --verbose
sudo fstrim -av
sudo fstrim -v /home
sudo fstrim -av --quiet

Вывод вида /: 12,4 GiB (13317439488 bytes) trimmed означает, что столько свободного места было возвращено накопителю. Ноль гигабайт — не ошибка: значит, свободные блоки уже помечены. Сообщение the discard operation is not supported указывает на файловую систему или устройство без поддержки, а Structure needs cleaning — на повреждение метаданных, и тогда нужен fsck.

Первый запуск на давно используемом диске может занять минуты: не прерывайте его и не совмещайте с интенсивной записью.

fstrim по расписанию

В systemd есть готовые юниты fstrim.timer и fstrim.service. Таймер срабатывает раз в неделю и запускает fstrim --fstab --verbose. В большинстве дистрибутивов юнит поставляется, но включён не всегда — проверьте состояние и активируйте при необходимости.

systemctl status fstrim.timer
sudo systemctl enable --now fstrim.timer
systemctl list-timers fstrim.timer
journalctl -u fstrim.service -n 30 --no-pager

list-timers показывает дату следующего запуска и время последнего срабатывания. Если таймер пропустил момент из-за выключенного компьютера, сработает параметр Persistent=true и очистка пройдёт при следующей загрузке. Расписание можно переопределить через drop-in, не редактируя файл из пакета:

sudo systemctl edit fstrim.timer

В открывшемся файле добавьте секцию [Timer], строку OnCalendar= для сброса прежнего значения и новое расписание, например *-*-* 03:30:00. После сохранения выполните systemctl daemon-reload и перезапустите таймер. Для настольного компьютера, который включают нерегулярно, разумнее оставить weekly: частая очистка не даёт выигрыша.

Опция discard в fstab: когда она не нужна

Альтернатива таймеру — постоянная очистка при удалении файлов. Для этого в /etc/fstab добавляют опцию discard:

UUID=1234-abcd / ext4 defaults,noatime,discard 0 1
UUID=5678-efgh /home ext4 defaults,noatime 0 2

Такой режим отправляет TRIM на каждое удаление. На современных NVMe это обычно нормально, но на SATA-дисках и в шифрованных контейнерах накладные расходы заметнее. Практика большинства администраторов — не включать discard постоянно, а использовать еженедельный fstrim: результат тот же, нагрузка предсказуемее. Выберите что-то одно, иначе очистка будет дублироваться.

Шифрование и LVM

Если корень лежит на LUKS, TRIM по умолчанию не проходит через шифрованный слой: иначе по изменению занятости блоков можно было бы судить о содержимом. Разрешить очистку можно флагом discard в /etc/crypttab или командой cryptsetup --allow-discards. Это компромисс между производительностью и приватностью: на ноутбуке с полнодисковым шифрованием лучше оставить запрет.

sudo cryptsetup --allow-discards --persistent open /dev/nvme0n1p3 cryptroot
sudo cryptsetup status cryptroot
grep -i issue_discards /etc/lvm/lvm.conf

Для LVM в /etc/lvm/lvm.conf есть параметр issue_discards = 1. Он заставляет LVM передавать освобождение при удалении логического тома или сжатии, но не заменяет регулярный fstrim для файловых систем. После правки конфигурации перезагрузка не нужна, достаточно новых операций с томами.

Мониторинг здоровья накопителя

TRIM — часть обслуживания, но не замена диагностике. smartctl из пакета smartmontools показывает атрибуты SATA-диска, а для NVMe — лог SMART с расходом ресурса. Смотрите на Percentage Used, Available Spare и Media and Data Integrity Errors.

sudo smartctl -a /dev/nvme0n1
sudo nvme smart-log /dev/nvme0n1
sudo smartctl -t short /dev/sda
sudo zpool status -x

У SATA-моделей набор атрибутов зависит от производителя: Total_LBAs_Written, SSD_Life_Left и Media_Wearout_Indicator могут называться по-разному. Ориентируйтесь на официальное значение ресурса в процентах и на рост переназначенных секторов. Для ZFS полезен zpool trim и параметр autotrim=on, который выполняет очистку автоматически.

Чек-лист обслуживания

  • Проверьте lsblk --discard: у устройства должны быть ненулевые DISC-GRAN и DISC-MAX.
  • Оставьте только один способ очистки — таймер или опцию discard.
  • Включите fstrim.timer и проверьте list-timers.
  • Не запускайте fstrim в часы пиковой нагрузки и на повреждённой файловой системе.
  • Раз в месяц смотрите SMART и свободное место: переполненный SSD работает медленнее.
  • Для LUKS и LVM осознанно решите, разрешать ли discard, и зафиксируйте решение в документации.

Итог

TRIM возвращает накопителю свободные блоки и снижает износ, а в Linux для этого достаточно fstrim и штатного таймера systemd. Проверка поддержки занимает минуту, настройка расписания — ещё несколько, зато диск перестаёт тратить ресурс на перезапись мусора. Главное — не дублировать механизмы, следить за здоровьем накопителя и помнить про особенности LUKS и LVM, где очистка по умолчанию ограничена.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте