web-dev-qa-db-ja.com

UNMAPをサポートするデバイスでの「UNMAPがサポートされていません」エラー

私は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コマンドを試しましたが、完全に機能します。何が足りないのですか?

1
ELH

私は他の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ユーティリティを介して)。

2
Anon