私はSamsungSSD(MZ7WD240モデル)でtrim/unmapコマンドで遊んでいました。このデバイスでのマップ解除サポートを確認するには、次のコマンドを実行しました。
hdparm -I /dev/sda | grep TRIM
そして予想通り、出力は私のデバイス/ dev/sdaがトリミングをサポートしていることを示しています:
* Data Set Management TRIM supported (limit 8 blocks)
* Deterministic read ZEROs after TRIM
だから私はscsiインターフェースを使用していくつかのマップ解除コマンドを手動で送信したかったので:
ファイルの最初のLbaを取得しました:
hdparm --fibmap /mnt/MyDeviceMountPoint/testFile
/mnt/MyDeviceMountPoint/testFile:
filesystem blocksize 4096, begins at LBA 0; assuming 512 byte sectors.
byte_offset begin_LBA end_LBA sectors
0 274432 274439 8
sg_unmap
を使用してunmapコマンドを sg3_utils パッケージから、デバイスに関連付けられたscsiインターフェイスを使用してファイルの最初のブロックに送信しました。
# sg_unmap --lba=274432 --num=1 /dev/sg0
UNMAP not supported
コマンドをデバイスに直接送信しようとしても、常にUNMAPがサポートされていません出力が表示されます:
# sg_unmap --lba=274432 --num=1 /dev/sda
UNMAP not supported
デバイスはSATAコントローラーを使用して接続されています。他のscsiコマンドを試しましたが、完全に機能します。何が足りないのですか?
私は他のscsiコマンドを試しましたが、それらは完全に機能します!何が足りないのですか?
SSDはSATAであるため、SCSIコマンドの変換を行う必要があります。生のコマンドを送信する場合は、「ATAコマンドパススルー」を使用しない限り、デバイス/コントローラーにネイティブなセットを使用する必要があります。つまり、SATAコントローラーの背後にSCSIデバイスがありますが、ここではそうではありません。
Linuxのlibataは、一部のがすべてではないSCSIコマンドをATAに再マップする方法を知っています( https://github.com/torvalds/linux/を参照) blob/e40dc66220b7ff1b816311b135b9298f8ba14ce6/drivers/ata/libata-scsi.c#L4222 )。 https://events.static.linuxfound.org/sites/events/files/slides/discard_0.pdf によると、SCSIのUNMAPのセマンティクスはATAに適切にマッピングされないため、マッピングが行われる可能性は低いです。これまでに実装されます。ただし、unmapビットをlibataに設定してSCSI WRITE SAMEを送信すると、ATA TRIMに変換されるため、これを使用してみることができます。
TLDR; SCSIUNMAPはlibataによって翻訳されていません。プロトコルにとらわれず、Linuxにブロックレイヤー変換を実行させたい場合は、BLKDISCARD
を送信します(たとえば、blkdiscard
ユーティリティを介して)。