Ошибка «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 так:

  • Я создал образец тестового файла.
  • Я получил начальный 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, и они отлично работают! Что мне не хватает?

1
задан 16 May 2017 в 16:52
1 ответ

Я пробовал другие команды 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 ).

2
ответ дан 3 December 2019 в 20:23

Теги

Похожие вопросы