Wie trimme / verwerfe ich eine ganze SSD-Partition unter Linux?

28

Meine Partition /dev/sda3auf einem SSD-Laufwerk enthält kein Dateisystem, aber es enthält Müll. Wie mache ich einen TRIM / DISCARD-Vorgang auf der gesamten Partition?

pts
quelle
7
Ich denke, der Punkt ist, dass er keine Daten schreiben möchte, er möchte, dass die SSD den Flash-Block löscht, ihn aber leer lässt, damit er beschrieben werden kann. Dies wird als Aktualisieren eines SSD-Laufwerks bezeichnet.
Chris Thompson
@ Joe: Ihr ATA Secure Erase-Link erwähnt nicht einmal Parititionen. Ich möchte nicht das gesamte Laufwerk löschen, nur eine Partition. Und ich möchte nicht riskieren, versehentlich die gesamte Festplatte zu löschen.
Pkt
11
@Doc: Das Füllen der Partition mit Speicherbereinigungsdaten ist das Gegenteil von der Absicht von pts: Es teilt der SSD mit, dass die Partition vollständig gefüllt ist und verwendet wird. Dies verringert die Leistung und Lebensdauer der SSD.
Schwarz

Antworten:

40

Wenn Ihre Version von util-linux neu genug ist (September 2012), gibt es tatsächlich ein spezielles Tool. blkdiscardDies ist der beste Weg, dies zu tun:

sudo blkdiscard /dev/sda3

Wenn Sie jedoch Kompatibilität mit älteren Linux-Distributionsversionen benötigen, lesen Sie weiter ... Es gibt Fälle, in denen sich hdparm/ wiper.shweigert, ein Volume zu berühren, da es sich nicht um eine Partition handelt. Daher benötigen wir darüber hinaus etwas.

Die von mir am besten unterstützte Möglichkeit besteht darin, die Tatsache zu nutzen, dass Linux-Swap-Volumes DISCARD unterstützen, wenn sie aktiviert sind. Die Wipefs am Ende sind vorhanden, sodass das Volume später nicht als Swap erkannt wird.

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

Dies gibt die DISCARD auf dem Großteil des Geräts aus.

robbat2
quelle
1
Danke, wusste nicht blkdiscard. Gefährlicher Befehl ... :)
Frostschutz
Warum? Ich habe es gerade im Handbuch WARNING: All data in the discarded region on the device will be lost!
nachgeschlagen
9

Ich weiß, dass diese Frage ziemlich alt ist, aber ...

Der einfachste Weg, dies zu tun, besteht darin, einfach ein ext4-Dateisystem auf der Partition mit einer einigermaßen aktuellen Version von zu erstellen mkfs.ext4. Das erste, was dieses Tool macht, ist das TRIMMEN der gesamten Partition. Danach können Sie die erstellten Daten mit dem gewünschten Dateisystem überschreiben.

(Ich habe dies gerade getan, um zum Beispiel eine neue vfat-Partition auf einer SD-Karte zu erstellen.)

David Given
quelle
Danke für den Tipp! Zu Ihrer Information Schreibt nach dem TRIMming einige Blöcke mit Metadaten für ein leeres ext4-Dateisystem, sodass die wenigen Prozent der Partition unTRIMmed bleiben.
pts
4
@pts Sie können die Größe der Metadaten minimieren, indem Sie die Journalgröße und die Anzahl der Inodes verringern:mkfs.ext4 -J size=4 -N1 /dev/my/device
Aryeh Leib Taurog
2
@AryehLeibTaurog Using -E lazy_journal_initscheint zu etwas weniger Schreibvorgängen zu führen als dies der -J size=4Fall ist. (Basierend auf Experimenten mit einer spärlichen Datei anstelle einer physischen SSD und um duzu überprüfen, wie viel geschrieben wurde.)
Kasperd
@kasperd Ein cleveres Experiment mit interessanten Ergebnissen! Vielen Dank.
Aryeh Leib Taurog
8

hdparm --trim-sector-range ist low level, es soll direkt mit der SSD kommunizieren, also keine Abhängigkeit vom Dateisystem. Wiper.sh verwendet dateisystemspezifische Programme, um freie (Dateisystem-) Regionen (Hardware-) SSD-Sektoren zuzuordnen. Sie verwenden hdparm, um diese zu kürzen.

Wenn Sie die Frage beantworten, können Sie diese Partition mit hdparm zuschneiden, aber Sie sollten sehr vorsichtig sein . Die Methode besteht darin, den von der Partition verwendeten Sektorbereich abzurufen und dann hdparm für diesen Sektorbereich zu verwenden. Wahrscheinlich müssen Sie mehrere Sektorbereiche übergeben, da jeder Bereich für --trim-sector-range maximal 65535 Sektoren haben kann.

fdisk -l kann Ihnen den Beginn und die Größe der Partitionen mitteilen. Achten Sie auf die von fdisk verwendeten Einheiten und auf die Sektorgröße Ihrer SSD.

Beispiel (meine SSD):

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

Um den Raum zu verwerfen , bevor dieser Partition, konnte ich trimmen 2047 (512 Byte Größe, auf meine SSD) Sektoren von Sektor beginnend 1: hdparm --trim-sector-ranges 1:2047. Ich kann nicht ab Sektor 0 schneiden, da dies der MBR ist (keine Ahnung, wie es bei GPT geht).

Ich würde tun, um den von der Partition belegten Speicherplatz zu verwerfen hdparm --trim-sector-ranges 2048:65535 67583:65535 133118:65535 .... Es kann als Skript geschrieben werden, aber ich werde jetzt kein Skript schreiben.

Nur um sicher zu gehen: Ich garantiere hier nichts, möglicherweise habe ich Sektoren falsch berechnet, mache ein Backup von allem, bevor ich --trim-sector-range effektiv nutze.

Hinweis : Wenn Sie den "leeren" Speicherplatz vor der ersten Partition zuschneiden, wie ich gezeigt habe, müssen Sie GRUB (oder den von Ihnen verwendeten Bootloader) vor dem Neustart neu installieren, da GRUB einen Teil davon auf "nicht verwendeten" Sektoren vor der ersten Partition speichert . Ich kenne keine anderen Bootloader, aber ich denke, es könnte der Fall sein, also pass auf dich auf.

spuk
quelle
7
wiper.shist obsolet, fstrimwas viel sicherer ist, aber für diese spezifische Nutzung blkdiscardschlägt beides. Im Jahr 2013 besteht keine Notwendigkeit, Rechenbereiche manuell zu riskieren.
Gabriel
6

Sie können sich das Skript ansehen, das wiper.shim hdparm-Paket enthalten ist. Es verwendet den Befehl hdparm, --trim-sector-rangesum alle leeren Sektoren auf einer Partition zu TRIMMEN, zumindest wenn diese ein ext3 / 4-Dateisystem enthält. Ich bin mir nicht sicher, ob es mit unformatierten Partitionen funktioniert, aber Sie können es immer temporär mit ext4 formatieren.

Jaap Eldering
quelle
Wenn Sie es mit ext4 formatieren und dann wiper.shausführen, wird fast die gesamte Partition mit Ausnahme der ext4-Metadaten gekürzt. Aber ich würde gerne die ganze Partition zuschneiden.
pts
2
@pts: Ich schlage vor, Sie schauen sich den Code von wiper.sh an und versuchen herauszufinden, wie daraus die Trimmbereiche abgeleitet werden. Dann könnten Sie manuell einen Zuschneidebereich an hdparm senden, um die gesamte Partition zuzuschneiden.
Jaap Eldering
4

blkdiscardkann auf Partitionen arbeiten, nicht nur auf ganzen Laufwerken. Ich habe es erfolgreich auf Fedora 20 getestet. Ich habe die Quellen überprüft blkdiscard- es ist ein sehr einfaches Programm, das nichts über Partitionen weiß. Ich gehe davon aus, dass der Kernel die Übersetzung übernimmt.

Sei sehr vorsichtig, blkdiscardstelle keine Fragen und zeige keine Fortschrittsinformationen.

Wenn blkdiscard nicht verfügbar ist, verwenden Sie dieses Skript und leiten Sie die Ausgabe an hdparm weiter. Das erste Argument ist die Anzahl der zu trimmenden Sektoren, das zweite ist der erste zu trimmende Sektor.

#! /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
quelle
-1

In diesem interessanten Artikel wird die Verwendung von HDDErase zum Aufrufen der integrierten Funktion zum sicheren Löschen der SSD beschrieben.

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
quelle
Vielen Dank für Ihre Antwort, aber es funktioniert nicht, da 1) das gesamte Laufwerk gelöscht wird 2) Microsoft Windows erforderlich ist und ich nach einer Linux-Lösung gesucht habe.
pts
2
Beachten Sie auch, dass dies im Grunde dasselbe ist, was dies blkdiscard --securetut.
ntninja