24

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

6 ответов6

34

Если ваша версия 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 на большинстве устройств.

8

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

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

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

6

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 хранит часть этого в "неиспользуемых" секторах перед первым разделом , Не знаю других загрузчиков, но я думаю, что это может быть так, так что будьте осторожны.

4

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

2

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-

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .