外部USB 3.0エンクロージャーにSSDディスク(Micron C400-MTFDDAC128MAM)を1つインストールしました。ここで、Ubuntu 12.04を搭載したラップトップの2番目のディスクとしてこのディスクを使用します。ディスクは動作していますが、期待どおりに動作していないTRIMサポートを使用したいです。
トリムサポートを確認します。
user@server:~$ Sudo hdparm -I /dev/sdc | grep -i TRIM
* Data Set Management TRIM supported (limit 8 blocks)
* Deterministic read data after TRIM
ディスクは次のオプションでマウントされました。
/dev/sdc1 on /media/MICRON type ext4 (rw,nosuid,nodev,uhelper=udisks)
しかし、トリムコマンドを手動で実行すると、エラーが発生します。
user@server:~$ Sudo fstrim -v /media/MICRON/
fstrim: /media/MICRON/: FITRIM ioctl failed: Operation not permitted
以前このディスクを内部ディスクとして使用し、トリムが機能していました。ありがとうございました。
ここにいくつかのUSBの詳細:
[ 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
TRIMをサポートする必要があるUASP(USB接続SCSIプロトコル)を使用している大容量記憶装置を確認するにはどうすればよいですか?
敬具
ラッキーリング
SSDは、TRIPをサポートするためにhdparmに報告します(hdparm -I =ドライブから直接識別情報を要求します)。
ただし、TRIMはドライブコントローラーによって制御されます。
外付けHDDクロージャーのUSB3ハードディスクコントローラーはTRIMをサポートしていない可能性が非常に高いです(ほとんどの外部コントローラーはサポートしていません)。
その場合、SSDがサポートしていても、TRIM機能は利用できません。
これはソフトウェアの問題であり、Linuxは現在USBを介したTRIMをサポートしていないようです。問題は、SSDドライブがATAコマンドセットを実装するのに対して、USBストレージデバイスはSCSIコマンドセットを使用することです。 USBエンクロージャは、これらのコマンドセット間でトランスレーターを提供する必要があります。 ATAでTRIMと呼ばれる操作は、SCSIではUNMAPと呼ばれ、LinuxカーネルではDISCARDと呼ばれます。 Linuxは、デバイスをトリムするコマンドを受信すると、デバイスに送信される正しいコマンドを検索します。 USBストレージデバイスはSCSIディスクのように見えるため、LinuxはUNMAPまたは他のいくつかのSCSIコマンドを使用しようとします。原則として、USBエンクロージャーのトランスレーターは、UNMAP要求を対応するATA TRIMに変換することがよくありますが、おそらく難しいケースがあります。実際には、エンクロージャーはこれを行わず、代わりにデバイスがUNMAPをサポートしないことを示します。ただし、多くのエンクロージャーはSCSIコマンドを実装して、デバイスにATAコマンドを直接発行します。 ATAパススルーと呼ばれます。これを行う標準コマンドがありますが、一部のエンクロージャーには独自のコマンドがあります。実際、hdparm -I
はATAパススルーを使用してデバイスから情報を取得します。同じパススルーを使用してデバイスにTRIMを直接発行することもできますが、Linuxドライバーは現在これを行いません。 SCSIディスクが実際にATAパススルーをサポートするSCSIからATAへのトランスレータであることを検出し、ネイティブSCSIコマンドの代わりにDISCARDにパススルーを使用する必要があります。
エンクロージャーによってUNMAPが正しく変換されない場合は、少なくともhdparmを使用してドライブ全体を手動でトリミングできます(これはSCSIプロトコルのata-passthroughを使用し、UASP hddドックで正常に動作します)。ただし、hdparmは一度に65535セクターのトリミングのみをサポートするため、セクターを手動で計算する必要があります。数学を実行する短いスクリプトを作成しました。
#!/usr/bin/env python3
import sys
remaining = int(sys.argv[1])
i = 0
while remaining > 0:
add = min(65535, remaining)
print("%d:%d" % (i, add))
remaining -= add
i += add
sectors.py
として保存し、chmod +x sectors.py
を実行します。 hdparm --trim-sector-ranges-stdin
で使用可能なセクターブロックのリストが生成されます。 hdparm -I /dev/sdX
(rootとして)を実行し、次のような行を待ちます:
LBA48 user addressable sectors: 62533296
これはデバイスのセクター数です(計算できるように、これはテストに頻繁に使用する〜32 GB SSDです)。
次のコマンドに番号をコピーします。
./sectors.py SECTOR_COUNT | Sudo hdparm --trim-sector-ranges-stdin --please-destroy-my-drive /dev/sdX
警告:これにより、全ドライブが消去されます!
終了したら、sync
を実行し、数秒待ちます。これで、hdparm -z /dev/sdX
を使用してパーティションテーブルを再度読み取るか、単にデバイスの電源を入れ直すことができます。おめでとうございます、あなたは今「新鮮な」SSDを持っています。