Moja partycja /dev/sda3
na dysku SSD nie zawiera żadnego systemu plików, ale zawiera śmieci. Jak wykonać operację TRIM / DISCARD na całej partycji?
Moja partycja /dev/sda3
na dysku SSD nie zawiera żadnego systemu plików, ale zawiera śmieci. Jak wykonać operację TRIM / DISCARD na całej partycji?
Odpowiedzi:
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.sh
odmawiamy 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ń.
blkdiscard
. Niebezpieczne polecenie ... :)
WARNING: All data in the discarded region on the device will be lost!
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).
mkfs.ext4 -J size=4 -N1 /dev/my/device
-E lazy_journal_init
wydaje się powodować nieco mniej zapisów niż -J size=4
robi. (Na podstawie eksperymentów z wykorzystaniem rzadkiego pliku zamiast fizycznego dysku SSD i du
sprawdzenia, ile zostało napisane.)
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.
wiper.sh
jest przestarzały, przez fstrim
co jest znacznie bezpieczniejszy, ale w tym konkretnym użyciu blkdiscard
bije oba. W 2013 r. Nie ma potrzeby ręcznego ryzykowania zakresów obliczeniowych.
Możesz rzucić okiem na skrypt wiper.sh
zawarty w pakiecie hdparm. Używa polecenia hdparm --trim-sector-ranges
do 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.
wiper.sh
skróciłoby prawie całą partycję oprócz metadanych ext4. Ale chciałbym przyciąć całą partycję.
blkdiscard
moż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, blkdiscard
nie 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
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:
blkdiscard --secure
.