支持 UNMAP 的设备上出现“UNMAP 不支持”错误

支持 UNMAP 的设备上出现“UNMAP 不支持”错误

我在三星 SSD(MZ7WD240 型号)上使用 trim/unmap 命令。为了检查此设备是否支持 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我使用from发送了取消映射命令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

我尝试过其他 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.pdfSCSI 的 UNMAP 语义无法很好地映射到 ATA,因此不太可能实现映射。但是,请注意,发送 SCSI WRITE SAME 并将取消映射位设置为 libata 会转换为 ATA TRIM,因此您可以尝试使用它。

TLDR;SCSI UNMAP 未由 libata 转换。如果您希望与协议无关并让 Linux 为您执行块层转换,请发送BLKDISCARD(例如通过blkdiscard实用程序)。

相关内容