Dienstprogramm zum TRIMMEN von nicht zugewiesenem Speicherplatz auf dem Laufwerk

11

Ich habe ein Laufwerk (SD-Karte) mit einigen ext4-Partitionen, aber auch nicht zugewiesenem Speicherplatz. Das fstrimDienstprogramm kann nur innerhalb eines Dateisystems arbeiten. Gibt es ein anderes Dienstprogramm, das den nicht zugewiesenen Speicherplatz TRIMMEN kann (oder das einen explizit angegebenen Bereich TRIMMEN kann), bevor ich das Rad neu erfinde und eines schreibe?

Ich kann überprüfen, ob der Controller derzeit nicht weiß, dass der größte Teil des nicht zugewiesenen Speicherplatzes auf dem Gerät frei ist , da ich festgestellt habe, dass auf dieser bestimmten Karte in den zugeschnittenen Speicherplatz Nullen zurückgegeben werden, aber ein Scan des Geräts zeigt viele Mülldaten übrig.

Bearbeiten: Ich habe ein Problem mit hdparm. Im folgenden Beispiel wird der erste Sektor verworfen, aber unabhängig vom angegebenen Bereich werden dieselben Ergebnisse angezeigt. fstrimhat keine Probleme auf dem Gerät:

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

Ich recherchiere weiter, aber hat jemand einen Einblick?

Jason C.
quelle
1
Wenn Sie den nicht partitionierten Speicherplatz (vorübergehend) einer oder mehreren Partitionen zuordnen, können Sie blkdiscarddiese verwenden, um das gesamte Gerät zu beschneiden.
Frostschutz
Vielen Dank! Das sieht nach dem richtigen Tool aus, blkdiscardscheint aber in meinen Standardpaket-Repositorys nicht verfügbar zu sein (Ubuntu 12.04 scheint in nicht vorhanden zu sein util-linux).
Jason C
Ich konnte hdparmaus irgendeinem Grund nie für mich arbeiten, aber ich habe mir die Util-Linux-Quelle von github.com/karelzak/util-linux/tree/stable/v2.23 geholt , sie gebaut ( ./autogen.sh ; ./configure ; make blkdiscard) und sie funktioniert großartig. Immer noch verwirrt hdparm, blkdiscardmacht aber genau das, was ich will. Bonus: Es ist nicht erforderlich, zuerst ein temporäres Dateisystem zu erstellen. Sie können sfdisk -lden Abstand zwischen Partitionen ermitteln und blkdiscardzuschneiden.
Jason C
Oh, ich war mir nicht einmal bewusst, dass ich blkdiscardmit Offset- / Längenoptionen arbeiten konnte. Die von mir vorgeschlagenen temporären Partitionen sind also nicht einmal notwendig. Nett!
Frostschutz

Antworten:

16

Wenn Sie über eine ausreichend aktuelle Version von verfügen util-linux, enthält diese das Tool, mit blkdiscarddem ganze Geräte oder Bereiche innerhalb eines Geräts mithilfe von --offsetund --lengthOptionen getrimmt werden können.

Bitte beachten Sie: blkdiscard Ist gefährlich, wenn Sie es die falschen Regionen abschneiden lassen, sind Ihre Daten weg!

So können Sie die nicht partitionierten (freien) Bereiche Ihrer Partitionstabelle herausfinden und sie dann mit diesem Tool TRIMMEN. Für msdosund gptPartitionen partedbietet die freien Regionen wie folgt:

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

Fügen Sie eine Schleife hinzu ...

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

welche druckt

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

Stellen Sie sicher, dass diese Ausgabe für Sie korrekt ist, fügen Sie zusätzliche Optionen hinzu, wenn Sie möchten (ausführlich?), Und entfernen echoSie schließlich die, damit sie tatsächlich ausgeführt wird, und Sie sollten festgelegt werden.

Der zweite Befehl dieses Beispiels schlägt tatsächlich fehl, weil die Länge zu klein ist. Es kann sich lohnen, innerhalb der Schleife zu überprüfen und Bereiche zu ignorieren, die kleiner als 1 MB sind, da es unwahrscheinlich ist, dass sie erfolgreich gekürzt werden.


Wenn Sie LVM anstelle von Partitionen verwenden, können Sie eine LV für den nicht belegten Speicherplatz erstellen und Folgendes kürzen:

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

Wenn Sie issue_discards = 1Ihre festlegen lvm.conf, können Sie den blkdiscardAnruf überspringen , da LVM die TRIM lvremoveselbst ausgibt .

Frostschutz
quelle
1
Vielen Dank! Ich habe dies als Antwort bemerkt, weil es für mich funktioniert, obwohl Michaels Antwort auch gültig ist. Ich werde auch hinzufügen , was ich in der Frage Kommentare: Wenn Sie nicht haben zur blkdiscardVerfügung; Sie können die Util-Linux-Quelle von github.com/karelzak/util-linux/tree/stable/v2.23 abrufen und dann erstellen blkdiscard(ausführen ./autogen.sh ; ./configure ; make blkdiscard) - sie wurde sauber erstellt (obwohl Sie möglicherweise einige Abhängigkeiten und Optimierungsoptionen installieren müssen configure) und als Solange Sie es nicht installieren, steht es nicht in Konflikt mit dem vorhandenen Util-Linux.
Jason C
1
Ich habe Fehler bei bestimmten Werten beobachtet, blkdiscarddie ebenfalls übergeben wurden, aber festgestellt, dass die Werte auf dem Versatz und nicht auf der Länge basieren. Es ist möglich, dass es ein Problem blkdiscardgibt. Ich bin gerade dabei, Nachforschungen anzustellen. Siehe unix.stackexchange.com/questions/98473/…
Jason C
Ich habe ein Skript erstellt, das freien Speicherplatz auf allen gemounteten Dateisystemen sowie freie LVM-VGs
verwirft
7

hdparm --trim-sector-rangeskann einen Bereich trimmen. Die Manpage warnt davor, sie zu verwenden. Stellen Sie daher sicher, dass Sie den richtigen Bereich und die richtige Syntax haben.

Ich denke, das Senden eines Zuschnitts für alle Daten außerhalb einer Partition wäre gefährlich, da dort manchmal versteckte Daten wie Bootloader-Code oder zweite Partitionstabellen vorhanden sind. Sie müssen genau wissen, welche Bereiche außerhalb von Partitionen wirklich ungenutzt sind.

Michael Suelmann
quelle
Perfekt danke! Ich kann die Gerätegröße mit hdparmnicht verwendeten Bereichen sfdiskabrufen und entsprechend zuschneiden. Ich weiß, was auf der Fahrt ist. Wenn es ein Partitionierungsschema gibt, das Daten in zugänglichen, aber nicht zugewiesenen Bereichen verbirgt, würde dies die Grundfunktionalität eines Partitionseditors beeinträchtigen. Ich gehe davon aus (hoffe), dass solche Pläne schon lange aufgegeben wurden (ich kenne jedoch keine auf Anhieb). Alle mir bekannten Schemata speichern den MBR in einem bekannten nicht zugewiesenen Speicherplatz zu Beginn des Geräts und VBRs / EBRs in zugewiesenen Partitionen. Es kann alte obskure Schemata geben, die unterschiedlich sind. :)
Jason C
Ich habe einige Schwierigkeiten damit hdparm, ich habe meine Frage mit Details bearbeitet; Ich frage mich, ob Sie einen Einblick haben.
Jason C
1
Scheint, als ob zumindest ein Teil von hdparm unter / dev / mmcblk0 nicht funktioniert. Entschuldigung, ich habe keine weitere Ahnung.
Michael Suelmann