Утилита для TRIM нераспределенного пространства на диске

11

У меня есть диск (SD-карта) с несколькими разделами ext4, но также есть некоторое нераспределенное пространство. fstrimУтилита может работать только в пределах файловой системы. Прежде чем я изобрету колесо и напишу один, есть ли другая утилита, которая может TRIM нераспределенное пространство (или которая может TRIM явно заданный диапазон)?

Я могу убедиться, что большая часть нераспределенного пространства на устройстве в настоящее время не известна контроллеру как свободная, так как я заметил, что на этой конкретной карте выполняется считывание обрезанных пробелов с возвратами 0, но сканирование устройства показывает осталось много мусорных данных.

Изменить: у меня возникла проблема с использованием hdparm. В приведенном ниже примере отбрасывается первый сектор, но я вижу одинаковые результаты независимо от указанного диапазона. fstrimне имеет проблем на устройстве:

root@ubuntu:~# hdparm --please-destroy-my-drive --trim-sector-ranges 0:1 --verbose /dev/mmcblk0 

/dev/mmcblk0:
trimming 1 sectors from 1 ranges
outgoing cdb:  85 0d 06 00 01 00 01 00 00 00 00 00 00 40 06 00
outgoing_data:  
00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

ioctl(fd,SG_IO): Invalid argument
FAILED: Invalid argument

Я продолжаю расследование, но есть ли у кого-нибудь понимание?

Джейсон С
источник
1
Если вы сопоставите неразмеченное пространство с одним или несколькими разделами (временно), вы можете использовать blkdiscardих, чтобы обрезать все устройство.
frostschutz
Благодарность! Это похоже на правильный инструмент, но blkdiscard, кажется, не доступно в моих стандартных репозиториях пакетов (Ubuntu 12.04, кажется, не присутствует в util-linux).
Джейсон C
По hdparmкакой-то причине мне так и не удалось поработать на меня, но я взял источник util-linux с github.com/karelzak/util-linux/tree/stable/v2.23 , собрал его ( ./autogen.sh ; ./configure ; make blkdiscard), и он отлично работает. Все еще озадачен, hdparmно blkdiscardделает именно то, что я хочу. Бонус: нет необходимости сначала создавать временную файловую систему, вы можете использовать, sfdisk -lчтобы выяснить пространство между разделами и blkdiscardобрезать его.
Джейсон С
О, я даже не знал о blkdiscardвозможности работать с опциями смещения / длины. Поэтому временные разделы, которые я предложил, даже не нужны. Ницца!
frostschutz

Ответы:

16

Если у вас есть достаточно свежая версия util-linux, она содержит инструмент, blkdiscardкоторый способен TRIM целых устройств или диапазонов в пределах устройства, используя --offsetи --lengthпараметры.

Пожалуйста, обратите внимание: blkdiscard это опасно, если вы позволите ему TRIM неправильные регионы, ваши данные исчезнут!

Таким образом, вы можете выяснить неразделенные (свободные) области вашей таблицы разделов, а затем ОТПРАВИТЬ их, используя этот инструмент. Для msdosи gptразделов, partedпредоставляет свободные регионы следующим образом:

# parted -m /dev/sda unit b print free | grep ':free;'
1:17408B:1048575B:1031168B:free;
1:64022904832B:64023240191B:335360B:free;

Добавить цикл к нему ...

while IFS=: read -ra FREE
do
    echo blkdiscard --offset ${FREE[1]%%B} --length ${FREE[3]%%B} /dev/sda
done < <(parted -m /dev/sda unit b print free | grep ':free;')

какие отпечатки

blkdiscard --offset 17408 --length 1031168 /dev/sda
blkdiscard --offset 64022904832 --length 335360 /dev/sda

Убедитесь, что этот вывод правильный для вас, добавьте дополнительные параметры, если вам нравится (подробный?), И, наконец, удалите, echoчтобы он действительно выполнялся, и вы должны быть настроены.

Вторая команда этого примера на самом деле терпит неудачу, потому что длина слишком мала - возможно, стоит проверить внутри цикла, игнорировать области размером менее 1 МБ, так как они вряд ли будут успешно обрезаны.


Если вы используете LVM вместо разделов, вы можете создать LV для незанятого пространства и урезать его:

lvcreate -l100%FREE -n blkdiscard SSD-VG
blkdiscard -v /dev/SSD-VG/blkdiscard
lvremove SSD-VG/blkdiscard

Если вы установили issue_discards = 1свой lvm.conf, вы можете пропустить blkdiscardвызов, так как LVM сам выдаст TRIM lvremove.

frostschutz
источник
1
Благодарность! Я отметил это как ответ, потому что это работает для меня, хотя ответ Майкла также действителен. Кроме того, я добавлю , что я говорил в комментариях вопрос: Если вы не имеете в blkdiscardналичии; вы можете получить исходный код util-linux с github.com/karelzak/util-linux/tree/stable/v2.23, а затем собрать blkdiscard(запустить ./autogen.sh ; ./configure ; make blkdiscard) - он собран чисто (хотя вам, возможно, придется установить некоторые зависимости и configureпараметры настройки ) и как Пока вы не устанавливаете его, он не конфликтует с существующим util-linux.
Джейсон С
1
Я наблюдал сбои с определенными переданными значениями blkdiscard, но заметил, что значения основаны на смещении, а не на длине. Возможно, есть проблема blkdiscard, я нахожусь в процессе расследования. См. Unix.stackexchange.com/questions/98473/…
Jason C
Я создал скрипт, который отбрасывает свободное пространство на всех смонтированных файловых системах, а также бесплатные виртуальные файлы LVM: github.com/stefanct/discard-everything
stefanct
7

hdparm --trim-sector-rangesможет обрезать диапазон. Страница man предупреждает о необходимости ее использования, так что вам лучше убедиться, что вы получили правильный диапазон и синтаксис.

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

Майкл Зельманн
источник
Отлично, спасибо! Я могу получить размер устройства с hdparm, неиспользуемые диапазоны sfdiskи обрезать соответственно. Я знаю, что на драйве. Если существует схема разбиения, которая скрывает данные в доступных, но нераспределенных областях, это нарушит основные функциональные возможности любого редактора разделов. Я полагаю (надеюсь), что от любых подобных схем уже давно отказались (хотя я не знаю ни одной из них). Все известные мне схемы хранят MBR в известном нераспределенном пространстве в начале устройства и VBR / EBR в выделенных разделах. Могут быть старые неясные схемы, которые отличаются. :)
Джейсон C
У меня возникли некоторые трудности hdparm, я отредактировал свой вопрос с деталями; интересно, есть ли у вас понимание.
Джейсон C
1
Похоже, что по крайней мере некоторые из hdparm не работают на / dev / mmcblk0. Извините, я понятия не имею.
Майкл Суэльманн