Назад | Перейти на главную страницу

Ошибка «UNMAP not supported» на устройстве, поддерживающем UNMAP.

Я играл с командами обрезки / отмены отображения на 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, поэтому:

Устройство подключается с помощью контроллера 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 утилита).