Мой раздел /dev/sda3
на SSD-диске не содержит файловой системы, но содержит мусор. Как мне выполнить операцию TRIM / DISCARD для всего раздела?
Мой раздел /dev/sda3
на SSD-диске не содержит файловой системы, но содержит мусор. Как мне выполнить операцию TRIM / DISCARD для всего раздела?
Ответы:
Если ваша версия 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 на большинстве устройств.
blkdiscard
. Опасная команда ... :)
WARNING: All data in the discarded region on the device will be lost!
Я знаю, что этот вопрос довольно старый, но ...
Самый простой способ сделать это - просто создать файловую систему ext4 в разделе с относительно свежей версией mkfs.ext4
. Первое, что делает этот инструмент - TRIM весь раздел. После того, как вы это сделаете, вы можете перезаписать данные, которые они создали, на любую файловую систему, какую пожелаете.
(Я только что сделал это, чтобы создать новый раздел vfat на SD-карте, например.)
mkfs.ext4 -J size=4 -N1 /dev/my/device
-E lazy_journal_init
видимому, приводит к чуть меньшему количеству записей, чем -J size=4
делает. (На основе экспериментов с использованием разреженного файла, а не физического SSD и du
проверки того, сколько было написано.)
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 хранит часть этого в «неиспользуемых» секторах перед первым разделом , Не знаю других загрузчиков, но я думаю, что это может быть так, так что будьте осторожны.
wiper.sh
устарел, fstrim
что гораздо безопаснее, но для этого конкретного использования blkdiscard
превосходит оба. В 2013 году нет необходимости рисковать вычислением диапазонов вручную.
Вы можете взглянуть на скрипт, wiper.sh
включенный в пакет hdparm. Он использует команду hdparm --trim-sector-ranges
для TRIM всех пустых секторов в разделе, по крайней мере, если он содержит файловую систему ext3 / 4. Не уверен, что он работает с неформатированными разделами, но вы всегда можете временно отформатировать его с помощью ext4.
wiper.sh
обрезает почти все разделы, кроме метаданных ext4. Но я бы хотел обрезать весь раздел.
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
Вот интересная статья, в которой рассказывается об использовании HDDErase для вызова встроенной функции безопасного стирания на SSD, которая должна получить то, что вы хотите:
blkdiscard --secure
и.