Я играл с командами обрезки / отмены отображения на 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:
filesystem blocksize 4096, begins at LBA 0; assuming 512 byte sectors.
byte_offset begin_LBA end_LBA sectors
0 274432 274439 8
Я отправил команду unmap, используя sg_unmap
из sg3_utils package в первый блок файла, используя интерфейс 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, они отлично работают! Что мне не хватает?
Я пробовал другие команды scsi, и они отлично работают! Что мне не хватает?
Ваш SSD - это SATA, поэтому что-то должно делать для него перевод команд SCSI. Если вы хотите отправлять необработанные команды, вы должны использовать набор, свойственный устройству / контроллеру, если вы не собираетесь использовать «сквозную передачу команд ATA» - т.е. у вас есть устройство SCSI за контроллером SATA, но здесь это не так.
Библиотека Linux знает, как переназначить некоторые но не все Команды 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, поэтому маловероятно, что отображение когда-либо будет реализовано. Однако обратите внимание, что отправка SCSI WRITE SAME с битом unmap, установленным на libata, транслируется в ATA TRIM, поэтому вы можете попытаться использовать это.
TL; DR; SCSI UNMAP не переводится libata. Если вы хотите быть независимым от протокола и заставить Linux выполнять преобразование блочного слоя за вас, отправьте BLKDISCARD
(например, через blkdiscard
утилита).