Ich habe eine SSD-Festplatte (Micron C400-MTFDDAC128MAM) in einem externen USB 3.0-Gehäuse installiert. Jetzt möchte ich diese Festplatte als zweite Festplatte in meinem Laptop mit Ubuntu 12.04 verwenden. Die Festplatte funktioniert, aber ich möchte den TRIM-Support verwenden, der nicht wie erwartet funktioniert.
Auf Trimmunterstützung prüfen:
user@server:~$ sudo hdparm -I /dev/sdc | grep -i TRIM
* Data Set Management TRIM supported (limit 8 blocks)
* Deterministic read data after TRIM
Die Festplatte wurde mit folgenden Optionen bereitgestellt:
/dev/sdc1 on /media/MICRON type ext4 (rw,nosuid,nodev,uhelper=udisks)
Wenn ich den Befehl trim jedoch manuell ausführe, wird folgende Fehlermeldung angezeigt:
user@server:~$ sudo fstrim -v /media/MICRON/
fstrim: /media/MICRON/: FITRIM ioctl failed: Operation not permitted
Ich habe diese Festplatte zuvor als interne Festplatte verwendet und das Trimmen hat funktioniert. Bitte helfen Sie mir, danke.
hier einige USB-Details:
[ 1039.248050] usb 4-1: new SuperSpeed USB device number 4 using xhci_hcd
[ 1039.265597] scsi8 : usb-storage 4-1:1.0
[ 1041.547879] scsi 8:0:0:0: Direct-Access C400-MTF DDAC128MAM 0509 PQ: 0 ANSI: 5
[ 1041.549134] sd 8:0:0:0: Attached scsi generic sg2 type 0
[ 1041.550511] sd 8:0:0:0: [sdc] 250069680 512-byte logical blocks: (128 GB/119 GiB)
[ 1041.550778] sd 8:0:0:0: [sdc] Write Protect is off
[ 1041.550785] sd 8:0:0:0: [sdc] Mode Sense: 23 00 00 00
[ 1041.552520] sd 8:0:0:0: [sdc] No Caching mode page present
[ 1041.552528] sd 8:0:0:0: [sdc] Assuming drive cache: write through
[ 1041.554029] sd 8:0:0:0: [sdc] No Caching mode page present
[ 1041.554035] sd 8:0:0:0: [sdc] Assuming drive cache: write through
[ 1041.678373] sdc: sdc1
[ 1041.679982] sd 8:0:0:0: [sdc] No Caching mode page present
[ 1041.679991] sd 8:0:0:0: [sdc] Assuming drive cache: write through
[ 1041.679997] sd 8:0:0:0: [sdc] Attached SCSI disk
Wie kann man herausfinden, ob das Massenspeichergerät das UASP (USB Attached SCSI Protocol) verwendet, das TRIM unterstützen soll?
Mit freundlichen Grüßen
Glücksbringer
Dies ist ein Softwareproblem. Linux scheint TRIM derzeit nicht über USB zu unterstützen. Das Problem ist, dass USB-Speichergeräte den SCSI-Befehlssatz verwenden, während das SSD-Laufwerk den ATA-Befehlssatz implementiert. Das USB-Gehäuse muss einen Übersetzer zwischen diesen Befehlssätzen bereitstellen. Die Operation TRIM in ATA heißt UNMAP in SCSI und DISCARD im Linux-Kernel. Wenn Linux den Befehl zum Trimmen eines Geräts erhält, sucht es nach dem richtigen Befehl, der an das Gerät gesendet werden soll. Da USB-Speichergeräte wie SCSI-Festplatten aussehen, versucht Linux, UNMAP oder einige andere mögliche SCSI-Befehle zu verwenden. Im Prinzip kann der Übersetzer im USB-Gehäuse häufig UNMAP-Anforderungen in das entsprechende ATA TRIM übersetzen, obwohl es wahrscheinlich schwierige Fälle gibt. In der Praxis tun die Gehäuse dies nicht, und sie zeigen stattdessen an, dass das Gerät UNMAP nicht unterstützt. Viele Gehäuse implementieren jedoch einen SCSI-Befehl, um ATA-Befehle direkt an das Gerät zu senden. Es heißt ATA Passthrough. Es gibt einen Standardbefehl, um dies zu tun, aber einige Gehäuse haben stattdessen einen proprietären Befehl. Eigentlich,
hdparm -I
Verwendet ATA-Passthrough, um Informationen vom Gerät abzurufen. Das gleiche Passthrough kann verwendet werden, um TRIMs direkt an das Gerät auszugeben, aber der Linux-Treiber tut dies derzeit nicht. Es müsste erkannt werden, dass eine SCSI-Festplatte tatsächlich ein SCSI-zu-ATA-Übersetzer ist, der ATA-Passthrough unterstützt, und das Passthrough für DISCARDs anstelle der nativen SCSI-Befehle verwenden.quelle
Wenn UNMAP von Ihrem Gehäuse nicht korrekt übersetzt wird, können Sie das gesamte Laufwerk zumindest manuell mit hdparm trimmen (dies verwendet das ata-Passthrough des SCSI-Protokolls und funktioniert auf meinem UASP-HDD-Dock einwandfrei). Sie müssen die Sektoren jedoch manuell berechnen, da hdparm jeweils nur das Trimmen von 65535 Sektoren unterstützt. Ich habe ein kurzes Skript geschrieben, um zu rechnen:
Speichern Sie es als
sectors.py
und tun Sie eschmod +x sectors.py
. Es ergibt eine Liste von Sektorblöcken, mit denen verwendet werden kannhdparm --trim-sector-ranges-stdin
. Führen Sie nunhdparm -I /dev/sdX
(als root) aus und halten Sie Ausschau nach einer Zeile, die wie folgt aussieht:Dies ist die Anzahl der Gerätesektoren (wie Sie berechnen können, handelt es sich um eine ~ 32-GB-SSD, die ich häufig zum Testen verwende).
Kopieren Sie die Nummer in den folgenden Befehl:
WARNUNG: Dadurch wird der GANZE ANTRIEB gelöscht!
Nachdem es fertig ist, laufen Sie
sync
und warten Sie einige Sekunden. Jetzt können Sie die Partitionstabelle mithdparm -z /dev/sdX
dem Gerät erneut lesen oder einfach aus- und wieder einschalten. Herzlichen Glückwunsch, Sie haben jetzt eine "frische" SSD.quelle
hdparm
wird mit--security-erase
Option verwendet, nachdem ein Passwort mit festgelegt wurde--security-set-pass
. Nach dem Löschen wird das gesamte Laufwerk im Wesentlichen getrimmt und auf Null gesetzt. Dies geschieht alles im Flash-Controller des Laufwerks. Ich habe einen detaillierten Blog-Beitrag geschrieben, in dem die Schritte beschrieben werden.