Как TRIM / DISCARD целый раздел SSD в Linux?

28

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

PTS
источник
7
Я думаю, дело в том, что он не хочет записывать какие-либо данные, он хочет, чтобы SSD удалял флэш-блок, но оставлял его пустым, чтобы он был доступен для записи, что называется обновлением SSD-накопителя.
Крис Томпсон
1
ATA Secure Erase wiki ata.wiki.kernel.org/index.php/ATA_Secure_Erase
Джо,
@joe: Ваша ссылка на безопасное стирание ATA даже не упоминает партиции. Я не хочу стирать весь диск, просто раздел. И я не хочу рисковать, случайно стерев весь диск.
Очки
11
@Doc: заполнение раздела мусорными данными совершенно противоположно намерению pts: он сообщит SSD, что раздел полностью заполнен и используется. Это снизит производительность и срок службы SSD.
Черный

Ответы:

40

Если ваша версия util-linux достаточно новая (сентябрь 2012 г.), то на самом деле есть специальный инструмент blkdiscard, который является лучшим способом сделать это:

sudo blkdiscard /dev/sda3

Но если вам нужна совместимость со старыми версиями дистрибутива Linux, читайте дальше ... Есть случаи, когда hdparm/ wiper.shотказываются касаться тома, потому что это не раздел, поэтому нам нужно что-то помимо этого.

Самым поддерживаемым способом, который я нашел, является использование того факта, что разделы подкачки Linux поддерживают DISCARD, когда они включены. Wipefs на конце есть, поэтому объем не распознается как своп позже.

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

Это выдает DISCARD на большинстве устройств.

robbat2
источник
1
Спасибо, не знал о blkdiscard. Опасная команда ... :)
frostschutz
Зачем? Я просто заглянул в руководство:WARNING: All data in the discarded region on the device will be lost!
Мистер Калвин
9

Я знаю, что этот вопрос довольно старый, но ...

Самый простой способ сделать это - просто создать файловую систему ext4 в разделе с относительно свежей версией mkfs.ext4. Первое, что делает этот инструмент - TRIM весь раздел. После того, как вы это сделаете, вы можете перезаписать данные, которые они создали, на любую файловую систему, какую пожелаете.

(Я только что сделал это, чтобы создать новый раздел vfat на SD-карте, например.)

Дэвид Гивен
источник
Спасибо за совет! К сведению, после TRIMming записывает некоторые блоки с метаданными для пустой файловой системы ext4, поэтому несколько процентов раздела остаются без TRIM.
Очков
4
@pts Вы можете минимизировать размер метаданных, уменьшив размер журнала и количество inode:mkfs.ext4 -J size=4 -N1 /dev/my/device
Арье Лейб Таурог
2
@AryehLeibTaurog Использование, по- -E lazy_journal_initвидимому, приводит к чуть меньшему количеству записей, чем -J size=4делает. (На основе экспериментов с использованием разреженного файла, а не физического SSD и duпроверки того, сколько было написано.)
kasperd
@kasperd Умный эксперимент с интересными результатами! Спасибо.
Арье Лейб Таурог
8

hdparm --trim-sector-range - это низкий уровень, он должен напрямую взаимодействовать с 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-sector-range.

Примечание : если вы обрезаете «пустое» пространство перед первым разделом, как я показал, обязательно переустановите GRUB (или любой загрузчик, который вы используете) перед перезагрузкой, так как GRUB хранит часть этого в «неиспользуемых» секторах перед первым разделом , Не знаю других загрузчиков, но я думаю, что это может быть так, так что будьте осторожны.

spuk
источник
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
proski
источник
-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