Ваша логика не неверна. Но он действителен только при соблюдении некоторых условий.
Команда TRIM , как указано в наборе команд ATA , может или не может обнулять секторы, против которых она выдана.
На самом деле, стандарт фокусируется на том, какие данные должны быть возвращены после того, как TRIM был выпущен 1 :
Следующие поведения определены этим стандартом для секторов, которые устройство урезает (см. 7.5.3.3):
а) недетерминированные - данные в ответ на чтение из урезанного сектора могут изменяться для каждого чтения, пока сектор не будет записан хостом;
b) Детерминированное чтение после обрезки (DRAT) - данные, возвращаемые в ответ на чтение обрезанного сектора, не изменяются, но могут отличаться от данных, которые были ранее возвращены; и
c) чтение нулей после обрезки (RZAT) - данные, возвращаемые в ответ на чтение обрезанного сектора, равны нулю.
[...] Как для DRAT, так и для недетерминированных запоминающих устройств данные возвращались в ответ на команду чтения в LBA, которая была успешно обрезана:
а) могут быть ранее возвращенные данные для указанного LBA;
б) может быть шаблоном, сгенерированным запоминающим устройством; и
c) не являются данными, ранее записанными хостом в другой LBA.
Таким образом, что ваше устройство возвращает после fstrim
зависит от функций, которые оно реализует. Если он не поддерживает RZAT, предположение о том, что данные, считанные с обрезанного устройства, будут иметь только нули, не выполняется.
Вы можете использовать hdparm
для проверки этого:
sudo hdparm -I /dev/sdX | grep -i trim
Я провел несколько тестов, используя два SSD, sda
и sdb
. Один и тот же производитель, разные модели, с разным соответствием ATA:
$ sudo hdparm -i /dev/sdb
...
Drive conforms to: Unspecified: ATA/ATAPI-3,4,5,6,7
...
$ sudo hdparm -i /dev/sda
...
Drive conforms to: unknown: ATA/ATAPI-2,3,4,5,6,7
...
Два SSD имеют разную поддержку TRIM:
$ sudo hdparm -I /dev/sda | grep -i trim
* Data Set Management TRIM supported (limit 1 block)
$ sudo hdparm -I /dev/sdb | grep -i trim
* Data Set Management TRIM supported (limit 8 blocks)
* Deterministic read ZEROs after TRIM
Я могу подтвердить, что после выдачи fstrim
диск, поддерживающий «детерминированные нули чтения после TRIM» (RZAT), фактически обнажил соответствующий раздел почти полностью. И наоборот, другой диск, кажется, обнулел (или иным образом заменен каким-либо сильно сжимаемым рисунком) только незначительную часть освобожденного пространства.
1 Онлайн источник: INCITS 529: Информационные технологии - Набор команд ATA / ATAPI - 4 (ACS-4)
Примечание по тестированию:
Как указывает frostschutz в комментариях, чтение после fstrim
может возвращать данные из кэша операционной системы, а не из урезанного устройства. Это, например, то, что произошло в этой кастрации .
(Я бы также указал на этот ответ на тот же вопрос для альтернативного метода тестирования TRIM).
Между fstrim
и последующим чтением вам может понадобиться удалить кеш, например, с помощью:
echo 3 | sudo tee /proc/sys/vm/drop_caches
В зависимости от размера раздела, с которым вы играете, может не хватить сброса кэша, чтобы ваши тесты не сработали.
Примечание по вашей настройке:
Опция discard
монтирования включает непрерывную TRIM, то есть в любое время файлы удаляются. Это не требуется fstrim
. Действительно, TRIM по требованию и непрерывный TRIM - это два разных способа управления операциями TRIM. Для получения дополнительной информации я бы указал на твердотельный накопитель на Arch Linux Wiki, в котором подробно рассматривается этот вопрос.
dmsetup table | grep allow_discards