Як TRIM / DISCARD цілий SSD-розділ на Linux?


28

Мій розділ /dev/sda3на SSD-диску не містить жодної файлової системи, але він містить сміття. Як зробити операцію TRIM / DISCARD на всьому розділі?


7
Я думаю, що справа в тому, що він не хоче записувати будь-які дані, він хоче, щоб SSD СТРАХУВАТИ флеш-блок, але залишив його порожнім, щоб його можна було записати, відоме як освіження накопичувача SSD.
Кріс Томпсон

1
Вікі ATA Secure Erase wiki ata.wiki.kernel.org/index.php/ATA_Secure_Erase
joe

@joe: Ваше посилання ATA Secure Erase навіть не згадує про розділення. Я не хочу стерти весь диск, лише розділ. І я не хочу ризикувати випадково стерти весь диск.
пт

11
@Doc: Заповнення розділу розділом зі сміттям - це зовсім протилежне наміру pts: Це скаже SSD, що розділ повністю заповнений у використанні. Це зменшить продуктивність та термін служби SSD.
Чорний

Відповіді:


40

Якщо ваша версія util-linux є достатньо новою (вересень 2012 року), насправді існує спеціально створений інструмент blkdiscard, тобто це найкращий спосіб зробити це:

sudo blkdiscard /dev/sda3

Але якщо вам потрібна сумісність із старими версіями дистрибутива Linux, читайте далі ... Є випадки, коли hdparm/ wiper.shвідмовляються торкатися тома, тому що це не розділ, тому нам потрібно щось поза цим.

Найбільш підтримуваний спосіб, який я знайшов, - скористатися тим, що обмінні томи Linux підтримують DISCARD, коли вони включені. Wipefs на кінці є, тому гучність пізніше не буде розпізнана як swap.

D=/dev/sda3 ; mkswap $D && swapon -d $D && swapoff $D && wipefs -o 0xff6 $D

Це призводить до відхилення на більшості пристроїв.


1
Спасибі, не знав про blkdiscard. Небезпечна команда ... :)
frostschutz

Чому? Я щойно переглянув це в посібнику:WARNING: All data in the discarded region on the device will be lost!
MrCalvin

9

Я знаю, це питання досить старе, але ...

Найпростіший спосіб зробити це , щоб просто створити ext4 файлову систему на розділі з досить свіжою версією mkfs.ext4. Перше, що цей інструмент робить - TRIM весь розділ. Після цього ви можете перезаписати створені вами дані в будь-яку файлову систему.

(Я щойно зробив це, щоб створити новий розділ vfat на SD-картці, наприклад.)


Дякую за пораду! FYI Після TRIMming записує деякі блоки з метаданими для порожньої файлової системи ext4, тож кілька відсотків розділу залишаються неперевіреними.
пт

4
@pts Ви можете мінімізувати розмір метаданих, зменшивши розмір журналу та кількість вкладених даних:mkfs.ext4 -J size=4 -N1 /dev/my/device
Aryeh Leib Taurog

2
@AryehLeibTaurog Використання, -E lazy_journal_initздається, призводить до меншої кількості записів, ніж -J size=4це робиться. (На основі експериментів із використанням розрідженого файлу, а не фізичного SSD та duдля перевірки того, скільки написано.)
kasperd

@kasperd Розумний експеримент з цікавими результатами! Спасибі.
Aryeh Leib Taurog

8

hdparm --trim-сектор-діапазони низький, він повинен говорити безпосередньо з SSD, тому немає залежності від файлової системи. Що робить wiper.sh, це використовувати спеціальні програми для файлової системи для відображення вільних (файлової системи) регіонів на (апаратні) SSD сектори, вони використовують hdparm для їх обрізки.

Відповідаючи на запитання, ви можете використовувати hdparm для обрізки цього розділу, але ви повинні бути дуже обережними . Як це зробити - отримати діапазон секторів, який використовується розділом, а потім використовувати hdparm у цьому секторі. Ймовірно, вам потрібно буде пройти кілька діапазонів секторів, оскільки кожен діапазон для --trim-сектор-діапазонів може мати максимум 65535 секторів.

fdisk -l може повідомити вам про початок і розмір розділів. Зверніть увагу на одиниці, які використовує fdisk, та розмір сектора вашого SSD.

Приклад (мій SSD):

Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    39070079    19534016   83  Linux

Для того, щоб відкинути простір перед цим розділом, я міг би обрізати 2047 (512 байт розміром, на мій SSD) секторів , починаючи з сектора 1: hdparm --trim-sector-ranges 1:2047. Я не можу обрізати, починаючи з сектора 0, тому що це MBR (не знаю, як це стосується GPT).

Щоб відкинути простір, який використовує розділ, я би зробив hdparm --trim-sector-ranges 2048:65535 67583:65535 133118:65535 .... Це може бути написано сценарієм, але я зараз не збираюся його писати.

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

Примітка . Якщо ви обрізаєте "порожній" простір перед першим розділом, як я показав, не забудьте перевстановити GRUB (або будь-який завантажувач, який ви використовуєте) перед перезавантаженням, оскільки GRUB зберігає його частину у "невикористаних" секторах перед першим розділом. . Не знаю інших завантажувачів, але я думаю, що це може бути так, тому будьте обережні.


7
wiper.shє застарілим, fstrimщо набагато безпечніше, але для цього специфічне використання blkdiscardперемагає і те, і інше. У 2013 році немає необхідності ризикувати обчисленням діапазонів вручну.
Габріель

6

Ви можете ознайомитись зі сценарієм, що wiper.shвходить до пакету hdparm. Він використовує команду hdparm --trim-sector-rangesдля TRIM всіх порожніх секторів на розділі, принаймні, якщо він містить файлову систему ext3 / 4. Не впевнений, що він працює з неформатованими розділами, але ви завжди можете тимчасово відформатувати його з ext4.


Відформатування його за допомогою ext4 та його запуску wiper.shдозволить обрізати майже весь розділ, за винятком метаданих ext4. Але я хотів би обрізати всю перегородку.
пт

2
@pts: Я пропоную переглянути код wiper.sh і спробувати розібратися, як він виводить діапазони обрізки. Тоді ви можете вручну надіслати діапазон обрізки в hdparm для TRIM всього розділу.
Яап Старійшина

4

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

Будьте дуже обережні, blkdiscardне задаєте питань і не показуйте інформації про прогрес.

Якщо blkdiscard недоступний, використовуйте цей скрипт і подайте його вихід у hdparm. Перший аргумент - кількість секторів для обрізки, другий - перший сектор для обрізки.

#! /bin/sh
# List ranges for hdparm --trim-sector-ranges-stdin
: ${MAXSECT=65535}
test $# = 2 || { echo "Usage: trimlist sectors offset" >&2; exit 1; }
sectors=$1
pos=$2
while test $sectors -gt 0; do
    if test $sectors -gt $MAXSECT; then
            size=$MAXSECT
    else
            size=$sectors
    fi
    echo $pos:$size
    sectors=$(($sectors-$size))
    pos=$(($pos+$size))
done

-1

Ось цікава стаття, в якій йдеться про використання HDDErase для виклику вбудованої функції безпечного стирання SSD, яка повинна отримати бажане:

http://www.windowsitpro.com/article/file-systems/q-how-can-i-reset-a-solid-state-disk-ssd-to-a-fully-erased-clean-state-


Дякую за вашу відповідь, але це не працює, оскільки 1) стирає весь диск 2) для цього потрібна Microsoft Windows, і я шукав рішення для Linux.
пт

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