pseudo-fsからブロックデバイスモデル名と製造元をインポートする

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?それはどこから出たの?

ベストアンサー1

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

だからhdparmHDIO_GET_IDENTITY I/W制御、sysfsではありません。もちろん、これはsysfsから情報にアクセスできないという意味ではありません。

HDIO_GET_IDENTITY次に、カーネルソースコードを検索できます。LXこれに非常に便利です。関連クリックを表示に電話するata_get_identity。この機能モデルを探すデバイス記述のオフセットからATA_ID_PROD

他の場所での使い方を見ると、ATA_ID_PRODsysfsを考慮して人気のある場所を見つけました。ide-sysfs.c、という関数からmodel_show。関数は、次のマクロ呼び出しによって参照されます。DEVICE_ATTR_RO(model)したがって、ataドライバがIDEインターフェイスを公開すると、modelこの情報を含むファイルがデバイスのsysfsディレクトリから呼び出されます。

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

デバイスのsysfsディレクトリがどこにあるかについては、さまざまな方法でアクセスできます。これsysfs.txtカーネル文書のファイルこれを文書化するのはあまり良くありません。アクセスする最も簡単な方法は、/sys/block各ブロックデバイスのエントリを利用することです。

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

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

おすすめ記事