Jak PRZYCINAĆ / ODRZĄDZIĆ całą partycję SSD w systemie Linux?

28

Moja partycja /dev/sda3na dysku SSD nie zawiera żadnego systemu plików, ale zawiera śmieci. Jak wykonać operację TRIM / DISCARD na całej partycji?

pkt
źródło
7
Myślę, że chodzi o to, że nie chce zapisywać żadnych danych, chce, aby dysk SSD usunął blok flash, ale zostaw go pusty, aby można go było zapisać, tak zwane odświeżanie dysku SSD.
Chris Thompson,
@joe: Twój link ATA Secure Erase nie wspomina nawet o parytetach. Nie chcę wymazać całego dysku, tylko partycję. I nie chcę ryzykować przypadkowego skasowania całego dysku.
pkt.
11
@Doc: Wypełnienie partycji śmieciowymi danymi jest zupełnie przeciwne do zamierzonego przez pts: powie SSD, że partycja jest całkowicie zapełniona. Spowoduje to zmniejszenie wydajności i żywotności dysku SSD.
Czarny

Odpowiedzi:

40

Jeśli twoja wersja util-linux jest wystarczająco nowa (wrzesień 2012 r.), Istnieje narzędzie specjalnie zaprojektowane blkdiscard, to najlepszy sposób na zrobienie tego:

sudo blkdiscard /dev/sda3

Ale jeśli potrzebujesz zgodności ze starszymi wersjami dystrybucji Linuksa, czytaj dalej ... Są przypadki, w których hdparm/ wiper.shodmawiamy dotknięcia woluminu, ponieważ nie jest to partycja, więc potrzebujemy czegoś więcej.

Najbardziej obsługiwanym sposobem, jaki znalazłem, jest skorzystanie z faktu, że woluminy wymiany Linux obsługują DISCARD, gdy są włączone. Wipefs na końcu są dostępne, więc wolumen nie jest rozpoznawany jako swap później.

D=/dev/sda3 ; mkswap $D && swapon -d $D && swapoff $D && wipefs -o 0xff6 $D

To powoduje WYCOFANIE na większości urządzeń.

robbat2
źródło
1
Dzięki, nie wiedziałem o blkdiscard. Niebezpieczne polecenie ... :)
frostschutz
Czemu? Właśnie sprawdziłem to w instrukcji:WARNING: All data in the discarded region on the device will be lost!
MrCalvin
9

Wiem, że to pytanie jest dość stare, ale ...

Najprostszym sposobem, aby to zrobić, to po prostu stworzyć system plików ext4 na partycji z rozsądnie najnowszej wersji mkfs.ext4. Pierwszą rzeczą, którą robi to narzędzie, jest PRZYCINANIE całej partycji. Gdy to zrobisz, możesz zastąpić utworzone dane dowolnym systemem plików.

(Właśnie to zrobiłem, aby na przykład utworzyć nową partycję vfat na karcie SD).

David Given
źródło
Dziękuję za wskazówkę! FYI Po TRIMming zapisuje niektóre bloki z metadanymi dla pustego systemu plików ext4, więc kilka procent partycji pozostaje niezmienione.
pkt
4
@pts Możesz zminimalizować rozmiar metadanych, zmniejszając rozmiar dziennika i liczbę i-węzłów:mkfs.ext4 -J size=4 -N1 /dev/my/device
Aryeh Leib Taurog
2
@AryehLeibTaurog Korzystanie -E lazy_journal_initwydaje się powodować nieco mniej zapisów niż -J size=4robi. (Na podstawie eksperymentów z wykorzystaniem rzadkiego pliku zamiast fizycznego dysku SSD i dusprawdzenia, ile zostało napisane.)
kasperd
@kasperd Sprytny eksperyment z interesującymi wynikami! Dzięki.
Aryeh Leib Taurog
8

hdparm - zakresy sektorów-przycinania są na niskim poziomie, powinny rozmawiać bezpośrednio z dyskiem SSD, więc nie ma zależności od systemu plików. Wiper.sh używa programów specyficznych dla systemu plików, aby zamapować wolne regiony (system plików) na sektory (sprzętowe) dyski SSD, a one używają hdparm, aby je przyciąć.

Odpowiadając na pytanie, możesz użyć hdparm do przycięcia tej partycji, ale powinieneś być bardzo ostrożny . Sposobem na to jest uzyskanie zakresu sektorów używanego przez partycję, a następnie użycie hdparm w tym zakresie sektorów. Prawdopodobnie będziesz musiał przekazać wiele zakresów sektorów, ponieważ każdy zakres dla --trim-sektory-zakresy mogą mieć maksymalnie 65535 sektorów.

fdisk -l może powiedzieć ci początek i rozmiar partycji. Zwróć uwagę na jednostki używane przez fdisk oraz rozmiar sektora dysku SSD.

Przykład (mój dysk SSD):

Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    39070079    19534016   83  Linux

Aby odrzucić spacji przed tym partycji, mogłem przyciąć 2047 (512 bajtów wielkości, na moich SSD) sektorów, począwszy od sektora 1: hdparm --trim-sector-ranges 1:2047. Nie mogę przyciąć, zaczynając od sektora 0, ponieważ jest to MBR (nie wiem jak to wygląda w przypadku GPT).

Aby odrzucić przestrzeń używaną przez partycję, zrobiłbym to hdparm --trim-sector-ranges 2048:65535 67583:65535 133118:65535 .... Można go skryptować, ale nie zamierzam go teraz pisać.

Dla pewności: nie gwarantuję tutaj niczego, być może błędnie obliczono sektory, wykonałem kopię zapasową wszystkiego przed efektywnym użyciem - przedziałów przedziałów sektorów.

Uwaga : jeśli przycinasz „puste” miejsce przed pierwszą partycją, jak pokazałem, pamiętaj o ponownym zainstalowaniu GRUB (lub innego programu ładującego, którego używasz) przed ponownym uruchomieniem, ponieważ GRUB przechowuje jego część w „nieużywanych” sektorach przed pierwszą partycją . Nie znam innych programów ładujących, ale chyba tak może być, więc uważaj.

spuk
źródło
7
wiper.shjest przestarzały, przez fstrimco jest znacznie bezpieczniejszy, ale w tym konkretnym użyciu blkdiscardbije oba. W 2013 r. Nie ma potrzeby ręcznego ryzykowania zakresów obliczeniowych.
Gabriel
6

Możesz rzucić okiem na skrypt wiper.shzawarty w pakiecie hdparm. Używa polecenia hdparm --trim-sector-rangesdo PRZYCINANIA wszystkich pustych sektorów na partycji, przynajmniej jeśli zawiera system plików ext3 / 4. Nie jestem pewien, czy działa z niesformatowanymi partycjami, ale zawsze możesz tymczasowo sformatować go za pomocą ext4.

Jaap Eldering
źródło
Sformatowanie go przy pomocy ext4, a następnie uruchomienie wiper.shskróciłoby prawie całą partycję oprócz metadanych ext4. Ale chciałbym przyciąć całą partycję.
pkt
2
@pts: Sugeruję, aby spojrzeć na kod wiper.sh i spróbować dowiedzieć się, w jaki sposób dedukuje zakresy przycinania. Następnie możesz ręcznie wysłać zakres przycinania do hdparm, aby TRIMOWAĆ całą partycję.
Jaap Eldering
4

blkdiscardmoże pracować na partycjach, nie tylko na całych dyskach. Z powodzeniem przetestowałem to na Fedorze 20. Sprawdziłem źródła blkdiscard- to bardzo prosty program, który nic nie wie o partycjach. Zakładam, że jądro wykonuje tłumaczenie.

Bądź bardzo ostrożny, blkdiscardnie zadaje pytań i nie pokazuje informacji o postępach.

Jeśli blkdiscard nie jest dostępny, użyj tego skryptu i podaj jego dane wyjściowe do hdparm. Pierwszy argument to liczba sektorów do przycięcia, drugi to pierwszy sektor do przycięcia.

#! /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
proski
źródło
-1

Oto interesujący artykuł, który mówi o używaniu HDDErase do wywoływania wbudowanej funkcji bezpiecznego wymazywania SSD, która powinna Ci pomóc:

http://www.windowsitpro.com/article/file-systems/q-how-can-i-reset-a-solid-state-disk-ssd-to-a-fully-erased-clean-state-

Chris Thompson
źródło
Dziękuję za odpowiedź, ale nie działa, ponieważ 1) usuwa cały dysk 2) wymaga systemu Microsoft Windows, a ja szukałem rozwiązania dla systemu Linux.
pkt
2
Zauważ też, że jest to w zasadzie to samo co on blkdiscard --secure.
ntninja