Утиліта для TRIM нерозподіленого місця на диску


11

У мене є накопичувач (SD-карта) з кількома розділами ext4, але також з нерозподіленим простором. fstrimУтиліта може працювати тільки в межах файлової системи. Перш ніж я винаходити колесо і записувати одне, чи є інша утиліта, яка зможе ТРІМ нерозподілений простір (чи може 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обрізати його.
Джейсон C

О, я навіть не знав про 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сам.


1
Спасибі! Я зауважив це як відповідь, тому що він працює на мене, навіть якщо відповідь Майкла також справедлива. Крім того, я додам , що я говорив в коментарях питання: Якщо ви НЕ маєте в blkdiscardнаявності; ви можете схопити джерело util-linux з github.com/karelzak/util-linux/tree/stable/v2.23, а потім побудувати blkdiscard(запустити ./autogen.sh ; ./configure ; make blkdiscard) - він побудований чисто (хоча, можливо, доведеться встановити деякі залежності та налаштувати configureпараметри) і як доки ви не встановите його, це не суперечить існуючим util-linux.
Джейсон C

1
Я спостерігав збої з певними переданими значеннями blkdiscard, але помітив, що значення базуються на зміщенні, а не на довжині. Можливо, є проблема blkdiscard, я перебуваю в процесі розслідування. Дивіться unix.stackexchange.com/questions/98473/…
Jason C

Я створив сценарій, який видаляє вільний простір для всіх монтованих файлових систем, а також безкоштовних LVM VG: github.com/stefanct/discard-everything
stefanct

7

hdparm --trim-sector-rangesможе обрізати діапазон. Сторінка "man" попереджає його використовувати, тому краще переконайтеся, що ви отримали правильний діапазон та синтаксис.

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


Ідеально, дякую! Я можу схопити розмір пристрою з hdparm, невикористаними діапазонами від sfdisk, і обрізати відповідно. Я знаю, що на диску. Якщо існує схема розподілу, яка приховує дані у доступних, але нерозподілених областях, це порушить основний функціонал редактора розділів. Я припускаю (сподіваюсь), що будь-які подібні схеми вже давно відмовилися (я не знаю жодної вершини голови). Усі відомі мені схеми зберігання MBR у відомій нерозподіленому просторі на початку пристрою та VBR / EBR у виділених розділах. Можуть бути старі незрозумілі схеми, які відрізняються. :)
Jason C

У мене виникають певні труднощі hdparm, я редагував своє запитання детально; цікаво, чи є у вас розуміння.
Джейсон С

1
Здається, що принаймні частина hdparm не працює на / dev / mmcblk0. Вибачте, я більше не маю ідеї.
Майкл Суельман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.