Erro “UNMAP não suportado” em um dispositivo que suporta UNMAP

1

Eu estava jogando com comandos trim / unmap em um SSD da Samsung (modelo MZ7WD240). Para verificar o suporte a unmap neste dispositivo, executei o seguinte comando:

hdparm -I /dev/sda | grep TRIM

E, como esperado, a saída mostra que o meu dispositivo / dev / sda suporta o recorte:

       *    Data Set Management TRIM supported (limit 8 blocks)
       *    Deterministic read ZEROs after TRIM

Então, eu queria enviar manualmente alguns comandos unmap usando a interface scsi, então:

  • Eu criei um arquivo de teste de amostra.
  • Eu tenho o Lba inicial do arquivo:

    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 
    
  • Enviei um comando unmap usando sg_unmap do pacote sg3_utils para o primeiro bloco do arquivo usando o interface scsi associada ao meu dispositivo:

    # sg_unmap --lba=274432 --num=1 /dev/sg0
    UNMAP not supported
    
  • Até tentei enviar o comando para o dispositivo diretamente, mas sempre recebo a saída UNMAP não suportada :

    # sg_unmap --lba=274432 --num=1 /dev/sda
    UNMAP not supported
    

O dispositivo está conectado usando um controlador SATA, eu tentei outros comandos scsi e eles funcionam perfeitamente! O que estou perdendo?

    
por SamTheDev 16.05.2017 / 11:40

1 resposta

2

I've tried other scsi commands and they work perfectly! What am i missing?

Seu SSD é SATA, então algo tem que fazer a tradução de comandos SCSI para ele. Se você quiser enviar comandos brutos, você deve usar o conjunto nativo para o dispositivo / controlador, a menos que você use o "ATA Command Pass-Through" - ou seja, você tem um dispositivo SCSI atrás de um controlador SATA, mas este não é o caso aqui. / p>

A libata do Linux sabe como remapear alguns comandos SCSI mas não todos para o ATA (veja link ). De acordo com o link , a semântica do UNMAP do SCSI não é bem mapeada para o ATA É improvável que o mapeamento seja implementado. No entanto, observe que o envio de SCSI WRITE SAME com o bit unmap definido como libata é traduzido para o ATA TRIM para que você possa tentar usá-lo.

TLDR; SCSI UNMAP não é traduzido por libata. Se você quiser ser agnóstico em relação ao protocolo e fazer com que o Linux faça uma conversão de camada de bloco para você, envie um BLKDISCARD (por exemplo, por meio do utilitário blkdiscard ).

    
por 04.04.2018 / 00:29