Ssd

支持 UNMAP 的設備上出現“不支持 UNMAP”錯誤

  • April 6, 2018

我在三星 SSD(MZ7WD240 型號)上使用修剪/取消映射命令。要檢查此設備上的取消映射支持,我執行了以下命令:

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我使用與我的設備關聯的 scsi 介面從sg3_utils包向文件的第一個塊發送了一個取消映射命令:
# 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,因此不太可能實現映射。但是,請注意,將取消映射位設置為 libata 的 SCSI WRITE SAME 被轉換為 ATA TRIM,因此您可以嘗試使用它。

TLDR;SCSI UNMAP 不被 libata 翻譯。如果您想與協議無關並讓 Linux 為您進行塊層轉換,請發送一個BLKDISCARD(例如通過blkdiscard實用程序)。

引用自:https://serverfault.com/questions/850365