Obtenir le nom du model de bloc et le fabricant de pseudo-fs

[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 

Où hdparm lit-il le champ Model ? Quelque part de sysfs ? D'où?

 # 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=… 

Donc, hdparm obtient ses informations de l' HDIO_GET_IDENTITY , pas de sysfs. Cela ne signifie pas que l'information ne soit pas accessible depuis sysfs, bien sûr.

Ensuite, nous pouvons searchr HDIO_GET_IDENTITY dans la source du kernel. LXR est pratique pour cela. Le hit correspondant affiche un appel à ata_get_identity . Cette fonction search le model dans la description de l'appareil à l'offset ATA_ID_PROD dans la description de l'appareil.

En regardant ailleurs où ATA_ID_PROD est utilisé, et avec sysfs à l'esprit, nous trouvons un hit dans ide-sysfs.c , dans une fonction appelée model_show . Cette fonction est référencée par l'appel de macro juste en dessous de DEVICE_ATTR_RO(model) , donc si le pilote ata expose l'interface IDE, il y a un file appelé model dans le directory sysfs du périphérique qui contient cette information.

Si le pilote ata expose l'interface SCSI, le traçage de la source du kernel est beaucoup plus compliqué car le code utilise différentes methods pour extraire les informations du matériel. Mais il s'avère qu'il y a aussi un champ model dans le directory sysfs du périphérique.

En ce qui concerne l'location du directory sysfs du périphérique, il existe plusieurs façons d'y accéder. Le file sysfs.txt dans la documentation du kernel documente ceci, pas très bien. La façon la plus simple d'y accéder est via /sys/block qui contient une input pour chaque périphérique de bloc:

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

Il y a beaucoup de liens symboliques dans /sys . L'location "physique" de ce directory dépend de la façon dont le disque est connecté au système; il a par exemple la forme /sys/devices/pci…/…/ata…/host…/target…/… pour un périphérique ATA avec une interface SCSI connectée à un bus PCI.

Trouvé après une heure de creuser:

 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 

Donc pour le model:

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

Et vendeur:

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