незалежно перевірити, чи TRIM дійсно працює на SSD


13

У мене є LUKSрозділ, /dev/sda1який я люблюЗакрити --allow-discards:

cryptsetup --allow-discards luksOpen /dev/sda1 root

Потім я монтую ext4файлову систему з discardопцією:

grep /dev/mapper/root /proc/mounts
/dev/mapper/root / ext4 ro,relatime,block_validity,discard,delalloc,barrier,user_xattr,acl 0 0

Потім я обрізаю вільний простір на змонтованій перегородці:

fstrim -v /

з df, я бачу, /має 80% вільного місця. Це означає, що /dev/sda180% диска - це двійкові нулі.

Якщо я клоную зображення із cat

cat /dev/sda1 > sda1.img

і стискаючи зображення xz, я б очікував, що всі нулі на диску будуть стиснені. Оскільки 20% даних на диску зашифровано, вони повинні виглядати як випадкові та бути нестислимими. Тому зображення, стиснене xz, повинно бути приблизно. 20% від сировини.

Однак отримане зображення, стиснене xz, має приблизно такий же розмір, як і вихідний оригінал.

Чи мої міркування правильні?

Чому моя теорія не перетворюється на практику?


2
unix.stackexchange.com/a/85880/30851 а такожdmsetup table | grep allow_discards
frostschutz

Відповіді:


8

Ваша логіка неправильна. Але це справедливо лише за умови виконання деяких умов.

Команда 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, який детально висвітлює цю проблему.


Linux також може повертати ненульові дані з кешу після TRIM, навіть якщо SSD перечитає їх як нулі. Це була проблема з моїм тестом на так-підрізання там unix.stackexchange.com/a/85880/30851, але це може бути пов'язано і з читанням необроблених даних до і після TRIM. Тож якщо ви не отримаєте нуля, коли очікуєте, киньте кеші на всякий випадок.
frostschutz

@frostschutz Добрий момент! Я якимось чином припускав, що оскільки ЗП згадував про "кореневий" обсяг, він був би занадто великим, щоб значна частина його вмістилася в пам'яті. Але, безумовно, кеш трапився на шляху моїх тестів - той невдало закінчився, поки я не почав його викидати. Я оновлю свою відповідь.
фра-сан

2

Чи має на SSD вбудований апаратний рівень шифрування? Якщо у нього є, то блоки TRIMmed можуть бути рівними нулями (або, можливо, всі) на рівні необробленого обладнання, але оскільки комп'ютер бачить їх через рівень шифрування, вони будуть виглядати як псевдовипадкова хитрість після проходження всіх -зерові сирі блоки через процес дешифрування.

Такий рівень апаратного шифрування мав би деякі переваги:

  • Це дозволило б дуже швидко функціонувати безпеку: просто привід знищить оригінальний ключ, який використовується в шарі апаратного шифрування, і замініть його на новий, і всі дані будуть негайно не піддані відновлення для більшості практичних цілей.
  • Оскільки всі дані, що потрапляють на рівень необробленого обладнання, будуть зашифровані, це гарантовано виглядатиме псевдовипадковим і, таким чином, значною мірою буде однорідним. Це може допомогти уникнути гарячих / холодних плям та значно спростити оцінку зносу.

0

Відмовитися не так, як Zero.

Якщо ви хочете зробити нуль за допомогою cryptsetup, ви можете зменшити fs, тоді блок криптовалют, а потім невикористаний простір об'єму.

Якщо ви хочете дізнатися, чи спрацювала обробка, роблячи тест на швидкість, це повинен бути індикатором після важкого використання.

https://linux.die.net/man/8/fstrim https://en.m.wikipedia.org/wiki/Trim_(computing)


0

df звітування про вільний простір не передбачає нульового простору.

trimповідомляє пристрою зберігання даних про те, що блоки не використовуються. Я не думаю, що це нулі їх.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.