Я играл с командами обрезки / отмены отображения на SSD Samsung (модель MZ7WD240). Чтобы проверить поддержку unmap на этом устройстве, я выполнил следующую команду:
hdparm -I /dev/sda | grep TRIM
И, как и ожидалось, вывод показывает, что мое устройство / dev / sda поддерживает обрезку:
* Data Set Management TRIM supported (limit 8 blocks)
* Deterministic read ZEROs after TRIM
Итак, я хотел вручную отправить некоторую unmap команды с использованием интерфейса scsi так:
Я получил начальный Lba файла:
hdparm --fibmap / mnt / MyDeviceMountPoint / testFile
/ mnt / MyDeviceMountPoint / testFile:
размер блока файловой системы 4096, начинается с LBA 0; предполагая 512-байтовые сектора.
byte_offset begin_LBA end_LBA секторы
0 274432 274439 8
Я отправил команду unmap, используя sg_unmap
from sg3_utils , в первый блок файла, используя интерфейс scsi, связанный с моим устройством:
# sg_unmap --lba = 274432 --num = 1 / dev / sg0
UNMAP не поддерживается
Даже пытался отправить команду на устройство напрямую, но всегда получаю вывод UNMAP not supported :
# sg_unmap --lba = 274432 --num = 1 / dev / sda
UNMAP не поддерживается
Устройство подключено с помощью контроллера SATA, я пробовал другие команды scsi, и они отлично работают! Что мне не хватает?
Я пробовал другие команды scsi, и они отлично работают! Что мне не хватает?
У вашего SSD-накопителя SATA, поэтому что-то должно выполнять перевод команд SCSI для него. Если вы хотите отправлять необработанные команды, вы должны использовать набор, родной для устройства / контроллера, если вы не собираетесь использовать «сквозную передачу команд ATA» - т.е. у вас есть устройство SCSI за контроллером SATA, но здесь это не так.
Библиотека Linux знает, как переназначить некоторые , но не все команды SCSI в ATA (см. https://github.com/torvalds/linux/blob/e40dc66220b7ff1b816311b135b9298f8ba14ce6/drivers-sci/lib .c # L4222 ). Согласно https://events.static.linuxfound.org/sites/events/files/slides/discard_0.pdf , семантика SCSI UNMAP плохо соответствует ATA, поэтому маловероятно, что отображение когда-либо будет быть реализованным. Однако обратите внимание, что отправка SCSI WRITE SAME с битом unmap, установленным в libata, транслируется в ATA TRIM, так что вы можете попытаться использовать это.
TLDR; SCSI UNMAP не переводится libata. Если вы хотите быть независимым от протокола и заставить Linux выполнять преобразование уровня блоков за вас, отправьте BLKDISCARD
(например, с помощью утилиты blkdiscard
).