Ваша логіка неправильна. Але це справедливо лише за умови виконання деяких умов.
Команда TRIM , як зазначено в наборі команд ATA , може або не може нулювати сектори, проти яких вона видана.
Насправді стандарт фокусується на тому, які дані потрібно повернути після видачі TRIM 1 :
Наступна поведінка визначена цим стандартом для секторів, які пристрій обробляє (див. 7.5.3.3):
а) недетерміновані - дані у відповідь на прочитане з обрізаного сектора можуть змінюватися для кожного читання, поки сектор не буде записаний хостом;
б) Детермінований зчитування після обрізки (DRAT) - дані, повернені у відповідь на читання обрізаного сектора, не змінюються, але можуть відрізнятися від даних, які були повернені раніше; і
с) прочитаної Нулі Після врівноваження (RZAT) - даних , що повертаються у відповідь на читання з обрізаного сектора дорівнює нулю.
[...] Як для DRAT, так і для недетермінованих пристроїв зберігання даних, дані повертаються у відповідь на команду read для 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
, накопичувач, який підтримує "Детерміновані читання ZERO після 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