web-dev-qa-db-ja.com

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

HdparmはどこからModelフィールドを読み取りますか? sysfsのどこか?どこから?

4
Gala
_# 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=…
_

したがって、hdparmは、sysfsからではなく、_HDIO_GET_IDENTITY_ ioctl から情報を取得します。もちろん、sysfsから情報にアクセスできないという意味ではありません。

次に、カーネルソースで_HDIO_GET_IDENTITY_を検索できます。 [〜#〜] lxr [〜#〜] そのために便利です。関連するヒットは _ata_get_identity_ への呼び出しを示しています。この関数 モデルを検索します デバイスの説明のオフセット_ATA_ID_PROD_にあるデバイスの説明。

他に_ATA_ID_PROD_が使用されている場所を見ると、sysfsを念頭に置いて、_ide-sysfs.c_という関数で _model_show_ にヒットが見つかります。この関数は、すぐ下のマクロ呼び出しによって参照されます DEVICE_ATTR_RO(model) したがって、ataドライバーがIDEインターフェイスを公開している場合、modelというファイルがあります。この情報を含むデバイスのsysfsディレクトリにあります。

AtaドライバーがSCSIインターフェイスを公開している場合、コードはハードウェアから情報を抽出するさまざまな方法を使用するため、カーネルソースのトレースははるかに複雑になります。しかし、結局のところ、デバイスのsysfsディレクトリには modelフィールド もあります。

デバイスのsysfsディレクトリがどこにあるかについては、それにアクセスするいくつかの方法があります。 カーネルドキュメントの_sysfs.txt_ファイル これを文書化していますが、あまりよくありません。アクセスする最も簡単な方法は、各ブロックデバイスのエントリを含む_/sys/block_を使用することです。

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

_/sys_には多くのシンボリックリンクがあります。そのディレクトリの「物理的な」場所は、ディスクがシステムに接続されている方法によって異なります。たとえば、PCIバスに接続されたSCSIインターフェイスを備えたATAデバイスの場合は_/sys/devices/pci…/…/ata…/Host…/target…/…_の形式になります。

1時間掘った後にそれを見つけました:

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

したがって、モデルの場合:

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

そしてベンダー:

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