Ssd
支持 UNMAP 的設備上出現“不支持 UNMAP”錯誤
我在三星 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
實用程序)。