root@ubuntu:/home/ubuntu# sg_readcap --16 /dev/sdd
READ CAPACITY (16) not supported
Isso significa que quando o encaixe USB traduz a capacidade dos dados do ATA IDENTIFY DEVICE da unidade (vistos em hdparm -I
/ smartctl -i
), ele pode, no máximo, relatar um tamanho de até 32 bits (ou seja, 0xffffffff, 4294967295) termos do número de setores lógicos. Esta é uma limitação hereditária de SCSI READ CAPACITY (10):
Logical Sector Size | Maximum capacity supported (TiB / TB)
512 | ~2.0 / ~2.2
4096 | ~16.0 / ~17.6
Como sua unidade é uma unidade AF 512e que possui setores lógicos de 512 bytes, 5860533168 / 0x15d50a3b0, requer 33 bits para representar, somente uma ponte SATA / USB que suporta SCSI READ CAPACITY (16) pode manipulá-lo corretamente. Quando o tamanho é truncado para 32 bits, ele muda de:
101011101010100001010001110110000 (5860533168)
para
01011101010100001010001110110000 (1565565872)
O kernel Linux, ou provavelmente todos os sistemas operacionais, basicamente nunca emitirá o comando ATA IDENTIFY DEVICE "diretamente" (ou seja, encapsulado em um comando SCSI ATA PASS-THROUGH) para drives USB, mas comandos SCSI READ CAPACITY (que você emitiu manualmente com sg_readcap
), para obter a capacidade deles.
Somente quando as unidades são, na verdade, unidades SATA conectadas com uma ponte SATA / USB, o comando será manipulado pela camada de tradução SCSI-ATA implementada na ponte, que emitirá o comando ATA IDENTIFY DEVICE para a unidade SATA. as informações necessárias para formar os dados de resposta para o comando READ CAPACITY.
Mas utilitários como hdparm
e smartctl
são (quase) exclusivamente para drives ATA, então eles praticamente fazem tudo com o ATA PASS-THROUGH. (Também porque são utilitários do espaço do usuário, espera-se que você, o usuário, os use apenas no tipo apropriado de dispositivos.) É por isso que você acaba obtendo uma capacidade diferente em locais diferentes.