TRIM, DRAT, DZAT: что должен знать криминалист о поведении SSD

2 июня, 2025, Oleg Afonin
Рубрика: «Разное»
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

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

Что такое TRIM на самом деле

Команда TRIM (в терминах SCSI её аналог — UNMAP) — это просто одна из стандартных команд протоколов SATA или NVMe, такая же, как любая команда блочного ввода-вывода. Её может подать хост, то есть операционная система. При удалении файла, создании раздела или форматировании раздела ОС формирует список логических адресов (LBA), которые она объявляет незанятыми, и отправляет этот список контроллеру SSD.

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

Что происходит после TRIM

Итак, мы разобрались с командой TRIM: это всего лишь команда, которую отдаёт операционная система и в которой перечисляются адреса освобождаемых (в случае удаления файла) или неиспользуемых блоков (последнее происходит в случае выполнения в Windows операции «дефрагментации», которая, несмотря на название, в случае с SSD ничего не дефрагментирует, но подаёт серию команд TRIM, в которых сообщает контроллеру адреса всех — абсолютно всех! — неиспользуемых фрагментов на логическом устройстве).

На этом этапе и начинаются нюансы. Контроллер может сразу стереть данные. Может подождать и сделать это позже, во время простоя или по достижении определённого объёма «мусора». Может сразу записать на это место нули, может просто обновить карту валидных блоков. Может и вовсе переключить освобождённую ячейку в другой режим — например, из режима TLC в режим псевдо-SLC (для того, чтобы последующие операции записи происходили быстрее).

На практике поведение определяется множеством факторов:

  • модель и поколение контроллера;
  • используемая прошивка;
  • наличие и загруженность динамического pSLC-кэша;
  • алгоритмы сборки мусора (Garbage Collection);
  • степень износа конкретных ячеек NAND;
  • приоритет фона очистки в прошивке;
  • общая нагрузка на накопитель в момент подачи TRIM.

Вариантов поведения контроллера может быть столько, что перечислить их все не представляется возможным. Для криминалиста всё это — неважно. Главное: после TRIM современный контроллер  (об исключениях поговорим ниже) немедленно начинает возвращать нули при попытке чтения указанных блоков, даже если физически они ещё не стёрты. Это поведение касается подавляющего большинства современных SSD — и NVMe, и SATA.

Режимы поведения после TRIM: undefined, DRAT и DZAT

Спецификации определяют три режима поведения SSD после TRIM:

  • Undefined — неопределённая ситуация; контроллер может вернуть всё, что угодно: старые данные, нули, случайный мусор.
  • DRAT (Deterministic Read After Trim) — возвращается фиксированное значение (обычно нули), даже если физически данные ещё не стерты.
  • DZAT (Deterministic Zeroes After Trim) — всегда гарантированно возвращаются нули сразу же после получения команды TRIM.

Старые, дешёвые SATA SSD могут работать в режиме неопределённости (undefined). Отсюда — возможные расхождения между образами, снятыми через некоторый промежуток времени, и возможное несовпадение хэшей. Современные накопители, в том числе все без исключения NVMe, как правило, поддерживают режимы DRAT или даже DZAT. Это связано с появлением динамических псевдо-SLC кэшей, сценариев использования SSD в составе RAID и требованиями к детерминированному поведению для высокопроизводительных накопителей.

NVMe, pSLC и высокая скорость «обнуления»

С развитием твердотельных накопителей появился сначала статический, а потом и динамический pSLC-кэш. Эти режимы работы требуют, чтобы TRIM обрабатывался не только быстро, но и предсказуемо: освобождаемые блоки контроллер может переключить из режима TLC/QLC в режим pSLC, добавив их к объёму доступного кэша. На современных NVMe SSD полная очистка всего пространства объёмом 2 ТБ может занимать считанные секунды, а физическое стирание блоков, занятых относительно небольшим удалённым файлом происходит и вовсе мгновенно.

Именно по этой причине бессмысленно тестировать «скорость чтения пустого SSD» — при попытке прочитать пустые блоки контроллер просто генерирует нули, даже не обращаясь к NAND. Таким образом, при тестировании чтения с пустого накопителя мы тестируем не сам диск, а способность контроллера «быстро отдавать нули».

TRIM и RAID: зачем нужен DZAT

RAID-массивы с чётностью (например, RAID 5/6) требуют жёсткой предсказуемости. Да, любые SSD можно использовать в составе такого массива — но без поддержки DZAT весь объём диска будет занят контрольными суммами, включая «пустые» блоки. Несложно представить, что скорость записи на такие полностью заполненные накопители будет очень низкой (напомним, в случае с SSD запись в уже занятую ячейку происходит медленно, т.к. выполняется две команды: сначала небыстрое стирание и только потом — запись). Если же нужна поддержка TRIM, то SSD обязан поддерживать детерминированное поведение DZAT: если какой-то блок «пуст», то контроллер хочет видеть на его месте нули и ничто иное. Именно поэтому SSD, предназначенные для работы в составе массивов, должны поддерживать DZAT.

Некоторые производители пошли ещё дальше и начали выпускать SSD на одной и той же аппаратной платформе, но с разными режимами работы. Например, SSD WD Red поддерживают DZAT, не имеют динамического кэша, предназначены для массивов, а линейка WD Blue, базирующаяся на том же «железе», обеспечивает поддержку всего лишь DRAT, использует pSLC-кэш, и в целом не предназначена для работы в составе RAID. Разница между ними — часто всего лишь в прошивке или даже в настройках заводской конфигурации.

Что всё это значит для эксперта

Криминалисту важно понимать следующее:

  • После получения команды TRIM от операционной системы современные контроллеры сразу блокирует доступ к данным. Это сделано не из злых побуждений — просто из соображений экономии ресурсов: ведь если блок заявлен как пустой, то зачем контроллер будет читать его содержимое с NAND? Достаточно вернуть нули. Иными словами, даже если данные физически ещё в NAND, контроллер их не отдаёт. (А всё-таки получить к ним доступ можно исключительно через заводской режим, но это — совсем отдельная история).
  • TRIM — это высокоуровневая команда, оперирующая логическими блоками (LBA), которую подаёт операционная система. Сам себе накопитель команду TRIM не подаст — точно так же, как не отдаст сам себе команды на чтение или запись.
  • Подавляющее большинство современных SSD ведут себя предсказуемо. Если диск поддерживает DRAT или DZAT, образы будут воспроизводимы, хэши (при условии исправности устройства) совпадут независимо от того, сколько времени пролежал накопитель.
  • На очень старых и дешёвых SATA SSD команда TRIM может обрабатываться в режиме неопределённости. Вот на таких накопителях хэш-суммы могут отличаться в зависимости от того, успел ли контроллер физически обнулить освобождённые блоки на момент снятия образа или не успел. А вот в NVMe-накопителях поведение TRIM уже стандартизовано на уровне протокола, и такой ситуации (повторимся — в случае исправного накопителя) не произойдёт.

Криминалистическая чистота и реальность

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

  • накопитель нужно переводить в factory mode (кстати, на некоторых моделях это деструктивная операция, требующая работы паяльником);
  • извлекать образ через PC-3000 или аналогичную платформу;
  • исключать работу через переходники и даже write-blocker’ы.

На практике это нереально. Обработка каждого такого диска — многие часы работы, уровень квалификации специалиста должен быть высочайшим, а результат будет (в 99% случаев) абсолютно тем же, что дал бы обычный блокиратор. По этой причине так поступают лишь в исключительных ситуациях.

Единственное исключение — острые случаи с минимальными временными лагами. Например, если подозреваемый начал форматировать SSD, но через считанные мгновения его устройство отключили от питания. В таком случае — да, стоит пробовать доступ через низкоуровневые методы. Но если пользователь просто удалил файл, пусть прямо на глазах специалиста — TRIM сработает мгновенно; возиться с PC-3000 бессмысленно.

Как проверить поддержку TRIM и качество работы блокиратора записи

Протестировать работу TRIM несложно, если у вас есть доступ к компьютеру с Linux. Для этого нужен будет накопитель, на котором нет никаких критических данных. (Обратите внимание: /dev/sdX нужно заменить на реальный адрес накопителя).

# 1. Записываем известную сигнатуру в сектор (например, 512 байт)
echo "TESTDATA1234567890" | dd of=/dev/sdX bs=512 seek=1000 count=1

# 2. Проверяем, что данные записались
dd if=/dev/sdX bs=512 skip=1000 count=1 | hexdump -C

# 3. Выполняем TRIM (discard) на этом секторе
blkdiscard -o $((1000*512)) -l 512 /dev/sdX

# 4. Читаем снова и смотрим результат
dd if=/dev/sdX bs=512 skip=1000 count=1 | hexdump -C

Возможно, прочитав эту статью у вас возникнет желание убедиться, что используемый вами блокиратор записи способен блокировать не только запись, но и команду TRIM. В этом случае (опять же, на диске, на котором нет никаких важных данных) можно выполнить следующую последовательность команд. (Рекомендуем предварительно убедиться, что TRIM вообще работает, сначала выполнив предыдущую последовательность).

Подключаем диск напрямую к компьютеру с Linux и монтируем его

# 1. Записываем известную сигнатуру в сектор (например, 512 байт)
echo "TESTTRIM1234567890" | dd of=/dev/sdX bs=512 seek=1000 count=1

# 2. Проверяем, что данные записались
dd if=/dev/sdX bs=512 skip=1000 count=1 | hexdump -C

Переподключаем диск через блокиратор, монтируем его в системе (в нашем примере /dev/sdX)

# 3. Выполняем TRIM (discard) на этом секторе
blkdiscard -o $((1000*512)) -l 512 /dev/sdX

# 4. Читаем снова и смотрим результат
dd if=/dev/sdX bs=512 skip=1000 count=1 | hexdump -C

 

Заключение

TRIM — это не «удаление» данных в классическом понимании. Это сигнал контроллеру: «этот набор адресов — свободен; делай что хочешь». Контроллер реагирует быстро и чаще всего — необратимо. Для криминалиста важно понимать принцип работы SSD с удалёнными данными, чтобы избежать крайностей — подключения накопителей с критически важными цифровыми доказательствами напрямую к компьютеру, так и попыток извлечь уже затёртые данные через низкоуровневый режим специализированным софтом.

Понимание того, как работает TRIM в реальных устройствах и что такое DRAT и DZAT, поможет избегать ошибок и принимать правильные решения на месте — в том числе, когда времени на экспертизу почти нет.


  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
НАШИ НОВОСТИ