Obtenha o nome e o fabricante do modelo de dispositivo de bloco a partir do pseudo-fs

4
[gala@arch ~]$ sudo !!
sudo hdparm -i /dev/sda

/dev/sda:

 Model=KINGSTON SHFS37A120G, FwRev=603ABBF0, SerialNo=50026B725B0A1515
 Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% }
 RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4
 BuffType=unknown, BuffSize=unknown, MaxMultSect=1, MultSect=1
 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=234441648
 IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120}
 PIO modes:  pio0 pio1 pio2 pio3 pio4 
 DMA modes:  mdma0 mdma1 mdma2 
 UDMA modes: udma0 udma1 udma2 udma3 udma4 udma5 *udma6 
 AdvancedPM=yes: unknown setting WriteCache=enabled
 Drive conforms to: unknown:  ATA/ATAPI-2,3,4,5,6,7

 * signifies the current active mode

De onde o hdparm lê o campo Model ? Algum lugar de sysfs ? De onde?

    
por Gala 08.05.2016 / 21:32

2 respostas

6
# strace hdparm -i /dev/sda
…
ioctl(3, HDIO_GET_IDENTITY, 0x7fffa930c320) = 0
brk(0)                                  = 0x1c42000
brk(0x1c63000)                          = 0x1c63000
write(1, "\n", 1
)                       = 1
write(1, " Model=…

Portanto, hdparm obtém suas informações do HDIO_GET_IDENTITY ioctl , não do sysfs. Isso não significa que as informações não podem ser acessadas de sysfs, é claro.

Em seguida, podemos procurar HDIO_GET_IDENTITY na origem do kernel. LXR é conveniente para isso. O hit relevante mostra uma chamada para ata_get_identity . Esta função pesquisa o modelo na descrição do dispositivo no deslocamento ATA_ID_PROD na descrição do dispositivo.

Olhando para onde mais ATA_ID_PROD é usado, e com o sysfs em mente, encontramos um hit em ide-sysfs.c , em uma função chamada model_show . Esta função é referenciada pela chamada de macro logo abaixo DEVICE_ATTR_RO(model) , portanto, se o driver ata estiver expondo a interface IDE, existe um arquivo chamado model no diretório sysfs do dispositivo que contém essa informação.

Se o driver ata estiver expondo a interface SCSI, rastrear a origem do kernel é muito mais complicado, porque o código usa diferentes maneiras de extrair as informações do hardware. Mas, como se constata, há também um um campo model no diretório sysfs do dispositivo.

Quanto ao diretório sysfs do dispositivo, existem várias maneiras de acessá-lo. O arquivo sysfs.txt na documentação do kernel documenta isso, não muito bem. A maneira mais simples de acessá-lo é por meio de /sys/block , que contém uma entrada para cada dispositivo de bloco:

$ cat /sys/block/sda/device/model

Existem muitos links simbólicos em /sys . O local “físico” desse diretório depende de como o disco está conectado ao sistema; por exemplo, ele tem o formato /sys/devices/pci…/…/ata…/host…/target…/… para um dispositivo ATA com uma interface SCSI conectada a um barramento PCI.

    
por 08.05.2016 / 23:54
0

Encontrei depois de uma hora de escavação:

gala@arch /sys/bus/scsi/devices/2:0:0:0 % pwd
/sys/bus/scsi/devices/2:0:0:0
gala@arch /sys/bus/scsi/devices/2:0:0:0 % cat model
KINGSTON SHFS37A

Então, para o modelo:

/sys/bus/scsi/devices/<device>/model

E fornecedor:

/sys/bus/scsi/devices/<device>/vendor
    
por 08.05.2016 / 23:01