nkjmkzk.net

powered by Kazuki Nakajima

Archive for the ‘driver’ tag

あるデバイスがOS(Linux)でサポートされているか調べる方法

「このデバイス(NIC, HBA)、僕/私のOSで動くかな?」というシチュエーションは実際の案件でもよくあります。これを調べる方法を記載しておきます。

まずはデバイスのPCI IDを調べます。

デバイスが手元にない場合はWebを検索したりベンダーさんに問い合わせることでPCI IDは入手することができます。下記はデバイスがすでにマシンに差さっている場合の確認方法です。

lspciコマンドでOSが認識しているPCIデバイスを列挙します。

[root@~]# lspci

00:00.0 Host bridge: Intel Corporation 5520/5500/X58 I/O Hub to ESI Port (rev 12)
00:01.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 1 (rev 12)
00:02.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 2 (rev 12)
00:03.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 3 (rev 12)
00:04.0 PCI bridge: Intel Corporation 5520/X58 I/O Hub PCI Express Root Port 4 (rev 12)
00:05.0 PCI bridge: Intel Corporation 5520/X58 I/O Hub PCI Express Root Port 5 (rev 12)
00:06.0 PCI bridge: Intel Corporation 5520/X58 I/O Hub PCI Express Root Port 6 (rev 12)
00:07.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 7 (rev 12)
00:08.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 8 (rev 12)
00:09.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 9 (rev 12)
00:0a.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 10 (rev 12)
00:13.0 PIC: Intel Corporation 5520/5500/X58 I/O Hub I/OxAPIC Interrupt Controller (rev 12)
00:14.0 PIC: Intel Corporation 5520/5500/X58 I/O Hub System Management Registers (rev 12)
00:14.1 PIC: Intel Corporation 5520/5500/X58 I/O Hub GPIO and Scratch Pad Registers (rev 12)
00:14.2 PIC: Intel Corporation 5520/5500/X58 I/O Hub Control Status and RAS Registers (rev 12)
00:14.3 PIC: Intel Corporation 5520/5500/X58 I/O Hub Throttle Registers (rev 12)
00:16.0 System peripheral: Intel Corporation 5520/5500/X58 Chipset QuickData Technology Device (rev 12)
00:16.1 System peripheral: Intel Corporation 5520/5500/X58 Chipset QuickData Technology Device (rev 12)
00:16.2 System peripheral: Intel Corporation 5520/5500/X58 Chipset QuickData Technology Device (rev 12)
00:16.3 System peripheral: Intel Corporation 5520/5500/X58 Chipset QuickData Technology Device (rev 12)
00:16.4 System peripheral: Intel Corporation 5520/5500/X58 Chipset QuickData Technology Device (rev 12)
00:16.5 System peripheral: Intel Corporation 5520/5500/X58 Chipset QuickData Technology Device (rev 12)
00:16.6 System peripheral: Intel Corporation 5520/5500/X58 Chipset QuickData Technology Device (rev 12)
00:16.7 System peripheral: Intel Corporation 5520/5500/X58 Chipset QuickData Technology Device (rev 12)
00:1a.0 USB Controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #4
00:1a.2 USB Controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #6
00:1a.7 USB Controller: Intel Corporation 82801JI (ICH10 Family) USB2 EHCI Controller #2
00:1c.0 PCI bridge: Intel Corporation 82801JI (ICH10 Family) PCI Express Port 1
00:1c.4 PCI bridge: Intel Corporation 82801JI (ICH10 Family) PCI Express Port 5
00:1d.0 USB Controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #1
00:1d.1 USB Controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #2
00:1d.2 USB Controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #3
00:1d.7 USB Controller: Intel Corporation 82801JI (ICH10 Family) USB2 EHCI Controller #1
00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev 90)
00:1f.0 ISA bridge: Intel Corporation 82801JIR (ICH10R) LPC Interface Controller
00:1f.2 SATA controller: Intel Corporation 82801JI (ICH10 Family) SATA AHCI Controller
00:1f.3 SMBus: Intel Corporation 82801JI (ICH10 Family) SMBus Controller
01:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
01:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
0a:00.0 PCI bridge: Intel Corporation 6700PXH PCI Express-to-PCI Bridge A (rev 09)
0a:00.2 PCI bridge: Intel Corporation 6700PXH PCI Express-to-PCI Bridge B (rev 09)
0f:00.0 IDE interface: JMicron Technology Corp. JMB368 IDE controller
10:01.0 VGA compatible controller: ATI Technologies Inc ES1000 (rev 02)

そしてソレっぽい名前のデバイスを見つけたら、そのデバイスのPCI IDを特定します。これには同じくlspciコマンドで-nオプションを指定しつつ該当デバイスの左のカラムに表示されてるBDF(Bus Device Function)で引っかけます。例えば上記環境でNICについて調べたい場合は「01:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)」が該当するデバイスっぽいので01:00.0で引っかけます。01:00.1でも構いません。

[root@~]# lspci -n | grep 01:00.0
01:00.0 0200: 8086:10c9 (rev 01)

ということでこのデバイスのPCI IDは8086:10c9ということになります。ちなみに8086がベンダーID(今回で言えばIntelさん)、10c9がデバイスIDになります。このベンダーIDとデバイスIDをそれぞれ変数にセットした上で、findしてmodinfoしてgrep します。

[root@~]# export VENDOR_ID=8086
[root@~]# export DEVICE_ID=10c9
[root@~]# find /lib/modules/$(uname -r)/kernel/drivers/ -name "*.ko*" -exec modinfo {} \; | grep -i "0000${VENDOR_ID}d0000${DEVICE_ID}"
alias:          pci:v00008086d000010C9sv*sd*bc*sc*i*

これで上記のようにaliasの出力があればドライバは存在します。
デバイスを装着してブートすればデバイスから認識されるPCI IDとドライバが対応しているPCI ID情報をマッチングして自動的にドライバがロードされるはずです。

と、いいつつもっと洗練された方法ないのかな、と思ったりしています。
いい方法があれば教えてください。

ちにみに/usr/share/hwdata/pci.idsにもベンダーIDとデバイスIDの一覧があり、ここにリストされているデバイスであれば起動時にPCI IDからデバイス名を解決してlspciの出力に表示してくれます。ここになければUnknown Deviceとして表示されます。ただしこのpci.idsとドライバモジュールは必ずしも同期していないので注意が必要です。

without comments

Written by 中嶋 一樹

11月 22nd, 2010 at 1:26 pm

Posted in Uncategorized

Tagged with ,