Narzędzie do PRZYCINANIA nieprzydzielonego miejsca na dysku


11

Mam dysk (kartę SD) z kilkoma partycjami ext4, ale także trochę nieprzydzielonego miejsca. fstrimNarzędzie może pracować tylko w systemie plików. Czy zanim jeszcze raz wymyślę koło i napiszę jedno, czy istnieje inne narzędzie, które może PRZYCINAĆ nieprzydzielone miejsce (lub które może PRZYCINAĆ wyraźnie określony zakres)?

Mogę sprawdzić, czy większość nieprzydzielonego miejsca na urządzeniu nie jest obecnie znana jako wolna od kontrolera, ponieważ zauważyłem, że na tej konkretnej karcie odczytuje się skrócone znaki zerowe, ale skan urządzenia pokazuje pozostało dużo śmieci.

Edycja: Mam problem z używaniem hdparm. Poniższy przykład odrzuca pierwszy sektor, ale widzę te same wyniki niezależnie od określonego zakresu. fstrimnie ma problemów z urządzeniem:

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

Badam dalej, ale czy ktoś ma wgląd w to?


1
Jeśli zamapujesz niepartycjonowane miejsce na jedną lub więcej partycji (tymczasowo), możesz użyć blkdiscardna nich, która przycina całe urządzenie.
frostschutz

Dzięki! To wygląda na właściwe narzędzie, ale blkdiscardwydaje się , że nie jest dostępne w moich standardowych repozytoriach pakietów (Ubuntu 12.04, nie wydaje się być w nim obecne util-linux).
Jason C

Z hdparmjakiegoś powodu nigdy nie byłem w stanie pracować dla mnie, ale skorzystałem ze źródła util-linux z github.com/karelzak/util-linux/tree/stable/v2.23 , zbudowałem ( ./autogen.sh ; ./configure ; make blkdiscard) i działa świetnie. Nadal się zastanawiam, hdparmale blkdiscardrobi dokładnie to, czego chcę. Bonus: Nie musisz najpierw tworzyć tymczasowego systemu plików, możesz go użyć, sfdisk -laby obliczyć przestrzeń między partycjami i blkdiscardją przyciąć.
Jason C

Och, nawet nie wiedziałem, że mogę blkdiscardpracować z opcjami przesunięcia / długości. Więc tymczasowe partycje, które zasugerowałem, nie są nawet konieczne. Miły!
frostschutz

Odpowiedzi:


16

Jeśli masz wystarczająco najnowszą wersję util-linux, zawiera narzędzie, blkdiscardktóre jest w stanie PRZYCINAĆ całe urządzenia lub zakresy w urządzeniu za pomocą --offseti --lengthopcji.

Uwaga: blkdiscard jest niebezpieczny, jeśli pozwolisz TRIM niewłaściwym regionom, twoje dane znikną!

Możesz więc dowiedzieć się, które partycjonowane (wolne) regiony tabeli partycji dzielą na partycje, a następnie PRZYCINANIE ich za pomocą tego narzędzia. For msdosi gptpartycje partedzapewnia wolne regiony takie jak:

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

Dodaj do niego pętlę ...

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;')

który drukuje

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

Sprawdź, czy dane wyjściowe są odpowiednie dla Ciebie, dodaj dodatkowe opcje, jeśli chcesz (szczegółowe?), I na koniec usuń echoje, aby zostało faktycznie wykonane, i powinieneś być ustawiony.

Drugie polecenie z tego przykładu tak naprawdę się nie udaje, ponieważ długość jest zbyt mała - warto sprawdzić w pętli, zignorować regiony mniejsze niż 1 MB, ponieważ prawdopodobnie nie uda się ich przyciąć.


Jeśli używasz LVM zamiast partycji, możesz utworzyć LV dla niezajętego miejsca i przyciąć, aby:

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

Jeśli ustawisz issue_discards = 1w swoim lvm.conf, możesz pominąć blkdiscardpołączenie, ponieważ LVM sam wyda TRIM lvremove.


1
Dzięki! Zaznaczyłem to jako odpowiedź, ponieważ działa dla mnie, mimo że odpowiedź Michaela jest również ważna. Dodam również to, co powiedziałem w komentarzach do pytania: Jeśli nie masz blkdiscarddostępnego; możesz pobrać plik util-linux ze strony github.com/karelzak/util-linux/tree/stable/v2.23, a następnie zbudować blkdiscard(uruchomić ./autogen.sh ; ./configure ; make blkdiscard) - zbudowano go czysto (chociaż może być konieczne zainstalowanie niektórych zależności i configureopcji dostrajania ) i jako dopóki go nie zainstalujesz, nie będzie on kolidował z istniejącym plikiem ut-linux.
Jason C

1
Obserwowałem również błędy z pewnymi wartościami przekazanymi blkdiscard, ale zauważyłem, że wartości były oparte na przesunięciu, a nie na długości. Możliwe, że wystąpił problem blkdiscard, jestem w trakcie badania. Zobacz unix.stackexchange.com/questions/98473/…
Jason C

Stworzyłem skrypt, który odrzuca wolne miejsce we wszystkich zamontowanych systemach plików, a także bezpłatne VG LVM: github.com/stefanct/discard-everything
stefanct

7

hdparm --trim-sector-rangesmoże przyciąć zakres. Strona podręcznika ostrzega przed jego użyciem, więc lepiej upewnij się, że masz odpowiedni zakres i składnię.

Myślę, że wysłanie trymu dla wszystkich danych poza partycją byłoby niebezpieczne, ponieważ istnieją tam ukryte dane, takie jak kod programu ładującego lub tabele drugiej partycji. Musisz wiedzieć dokładnie, które obszary poza partycjami są naprawdę nieużywane.


Perfekcyjnie, dzięki! Mogę pobrać rozmiar urządzenia hdparm, nieużywane zakresy sfdiski odpowiednio przyciąć. Wiem, co jest na dysku. Jeśli istnieje schemat partycjonowania, który ukrywa dane w dostępnych, ale nieprzydzielonych obszarach, to zepsułoby podstawową funkcjonalność dowolnego edytora partycji. Zakładam (mam nadzieję), że wszelkie takie plany już dawno zostały porzucone (choć nie znam żadnego z głowy). Wszystkie znane mi schematy przechowują MBR w znanej nieprzydzielonej przestrzeni na początku urządzenia, a VBR / EBR w przydzielonych partycjach. Mogą istnieć stare, niejasne schematy, które są różne. :)
Jason C

Mam trochę trudności hdparm, zredagowałem swoje pytanie ze szczegółami; zastanawiam się, czy masz jakiś wgląd.
Jason C

1
Wygląda na to, że przynajmniej część hdparm nie działa na / dev / mmcblk0. Przepraszam, nie mam dalszego pomysłu.
Michael Suelmann
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.