特集
2004/05/18 21:30 更新

UNIX USER 2004年4月号「Linuxはハードウェアをどう認識するのか?」より転載:
Linuxハードウェア認識の基礎 (2/3)


モジュールの自動読み込み

 Linuxカーネルは以上のような仕組みでハードウェアを利用しています。モジュール読み込みはinsmodで行い、基本は手動です。必要なデバイスにあわせてモジュールを選び、insmodを実行する仕組みがあればいいのですが、カーネル内にはその機能はありません。どのようにして特定すればいいでしょうか?

 ファイルフォーマットなど、利用プログラム側からモジュール名が明らかなものについては、プログラム中で明示されるなどしてカーネルから自動的に読み込まれることがありますが、通常のデバイスは、あらかじめシステムに情報を登録しておき、その情報との照合からinsmodを呼び出す形になります。

/etc/modules.confの設定

 モジュール情報を記録しておくところとして重要なのは、 /etc/modules.confです。ここにはモジュール名のエイリアスや、モジュール読み込み時の設定を記述します(リスト1)。

リスト1 /etc/modules.confの例

alias eth0 e100
      ~~~~ ~~~~
       ↑    ↑
ドライバ名  エイリアス名
alias usb-controller ehci-hcd
alias usb-controller1 usb-uhci

 たとえば、ネットワークデバイスを利用するとき、/etc/modules.confにeth0のエイリアスとしてネットワークモジュールが登録されていれば、ネットワークを設定する起動時のスクリプトによって「modprobe eth0」が実行されるので、該当のモジュールが読み込まれます。

 つまり、あらかじめ利用するドライバを調査し、それを適切なエイリアス名に割り当てておくことになります。

認識・設定ツールの利用

 Part 3で紹介するKudzuやmurasakiは、上記の作業を行ってくれるツールです。これらもシステム起動時に実行され、ハードウェア情報のデータベースと/procから取得したハードウェアの情報(後述)を照合して、適切なモジュールをカーネルに読み込みます(図3)。これらのツールは一度システムが起動した後も、任意のときに実行して新しいハードウェアを認識させることができます。

zu3.jpg

図3 自動認識ツールの動き

 一見単純な仕組みですが、Windowsもハードウェア情報としてINFファイルを利用し、基本的には同じ仕組みで動いています。

マルチプラットフォームを目指すハードウェア自動認識機構「Discover」

 Discoverは、Progenyが開発しているハードウェア自動認識のための仕組みで、XML形式でハードウェア情報データベースを保持しています。

 現在、Discover安定版のバージョンは1.xで、もともとMandrake用であったものを作り直し、Debian用のハードウェア認識機構として利用されています。また、開発バージョンのDiscover 2.xは、Debianの新しいインストーラとして開発中のDebian-Installerへの採用が決まり、ProgenyのWebサイトで配布が行われています。

 Discover 2.xが1.xと違う点は、開発当初からマルチプラットフォームを意識し、機能やコマンドラインオプションなどの変更を図っている点で、リリースノートにもその点が明記されています。

 次に挙げるProgenyのURLには、自動認識ツールとしての利用法から、ハードウェア情報データベースへの記載フォーマットまで詳細な情報がまとめられています。Debianユーザー以外の方も参照してみてください。

http://platform.progeny.com/discover/

ハードウェアの情報

 PCIやUSB以降の最近のバスやデバイスでは、統一されたIDを使用するようになっています。多くのケースで、各16ビットのベンダーID、デバイスID、バージョンIDが使用されています。ベンダーIDは有償の登録制になっているので、デバイスメーカーは、バスの種類ごとに管理機関に申請して取得する必要があります。デバイスID、バージョンIDの管理はメーカーに任されています。これらのIDを元にして製品の種類や製品名、最適なデバイスドライバを識別できます。

PCIバスデバイスを見るlspciコマンド

 PCIバス上にあるデバイスの情報を見るためのコマンドとしてlspciがあります。lspciはカーネルがハードウェアから得た/proc/bus/pci以下の情報を基に、/usr/share/hwdata/pci.ids(hwdataパッケージ)もしくはカーネルソースのdrivers/pci/pci.idsや/usr/share/hwdata/pci.idsのハードウェア情報データベース(テキスト)と照合し、マッチしたものを整形して表示します(実行例4)。

実行例4 PCIバス上のデバイス情報

$ lspci
00:00.0 Host bridge: Intel Corp. 82865G [Springdale-G] Chipset Host Bridge (rev 02)
00:02.0 VGA compatible controller: Intel Corp. 82865G [Springdale-G] Chipset Integrated Graphics Device (rev 02)
00:1d.0 USB Controller: Intel Corp. 82801EB USB (Hub #1) (rev 02)
00:1d.1 USB Controller: Intel Corp. 82801EB USB (Hub #2) (rev 02)
00:1d.2 USB Controller: Intel Corp. 82801EB USB (Hub #3) (rev 02)
00:1d.3 USB Controller: Intel Corp. 82801EB USB EHCI Controller #2 (rev 02)
00:1d.7 USB Controller: Intel Corp. 82801EB USB EHCI Controller (rev 02)
00:1e.0 PCI bridge: Intel Corp. 82801BA/CA/DB PCI Bridge (rev c2)
00:1f.0 ISA bridge: Intel Corp. 82801EB ISA Bridge (LPC) (rev 02)
00:1f.1 IDE interface: Intel Corp. 82801EB ICH5 IDE (rev 02)
00:1f.2 IDE interface: Intel Corp.: Unknown device 24d1 (rev 02)
00:1f.3 SMBus: Intel Corp. 82801EB SMBus (rev 02)
00:1f.5 Multimedia audio controller: Intel Corp. 82801EB AC'97 Audio (rev 02)
01:08.0 Ethernet controller: Intel Corp. 82801EB (ICH5) PRO/100 VE Ethernet Controller (rev 01)

 少し具体的に見ていくと、PCIデバイスの情報は/proc/bus/pci/devicesで参照できます(リスト2)。2カラム目に32ビットの情報があり、前半16ビットがベンダーID、後半16ビットがデバイスIDです。この情報はハードウェアが繋がっていれば取得可能です。

リスト2 /proc/bus/pci/devices

              :
              :
00f8 808624d0 0 00000000 00000000 00000000 ……
00f9 808624db 12 00000000 00000000 00000000 ……
00fa 808624d1 12 0000e801 0000e401 0000e001 ……
     ~~~~~~~~
      ↑   ↑                 :
デバイスID ベンダーID         :

 次は、pci.idsを見てみましょう(リスト3)。かなり大量のデータがありますが、8086のベンダーID(先頭の4けた)を検索すると、このベンダーIDはIntelであることが分かります。続いてリスト2の2行目「808624db」の下4けた「24db」を見てみると、「82801EB ICH5 IDE」だということが分かります。これでハードウェアの種類が特定できました。、同じような形ですべてのデバイスを検索し、モジュールを特定して読み込めば、自動認識ツールの完成です。

リスト3 /usr/share/hwdata/pci.ids(hwdataパッケージ)もしくはカーネルソースのdrivers/pci/pci.idsの中身

       :
       :
8086 Intel Corp.
       0007 82379AB
       0008 Extended Express System Support Controller
       0039 21145
       0122 82437FX
       0482 82375EB
       0483 82424ZX [Saturn]
       0484 82378IB [SIO ISA Bridge]
       0486 82430ZX [Aries]
       04a3 82434LX [Mercury/Neptune]
       04d0 82437FX [Triton FX]
       0600 RAID Controller
       0960 80960RP [i960 RP Microprocessor/Bridge]
       :
       :
       24d5 82801EB AC'97 Audio
       24d7 82801EB USB (Hub #3)
       24db 82801EB ICH5 IDE
       24dd 82801EB USB EHCI Controller
       24de 82801EB USB EHCI Controller #2
       2500 82820 820 (Camino) Chipset Host Bridge (MCH)
              1028 0095 Precision Workstation 220 Chipset
              1043 801c P3C-2000 system chipset
       :
       :

もし、ハードウェアが認識されず利用できなかったら

 何らかのハードウェアが利用できず、この出力でも「Unknown」と表示されている状態なら、該当するモジュールが用意されていなかったり、自動認識ツールでも認識できないケースが多いです。「Unknown」と表示されていても利用できるケースもありますが、パフォーマンスが落ちているなど、いい状態でない可能性が高いです。

 そのような場合は、対応モジュール、ハードウェア情報データベースが追加・更新されていないか確認し、新しいバージョンのカーネルもしくは認識ツールを導入することになります。

 最新リリース版パッケージでも「Unknown」となってしまった場合でも、あきらめるのは早いです。PCI IDは取得できているので、これをキーワードにして、Web検索エンジンを利用して調査したり、開発リポジトリやChangelogを調査したりすると、開発途中のドライバが入手できたり、比較的早く対処方法が見つかったりします。

lshwでハードウェア情報を一括表示

 利用しているPC全体の情報を知りたいとき、ハードウェア情報は/procディレクトリ下から取得できますが、1ファイルごとに見ていたのではけっこう大変です。そういったときに便利なのがlshw(Hardware Lister)です。

 lshwとは、ハードウェア情報のレポートを行うツールで、DMI、OpenFirmware(PowerPC)、PCI、AGP、ISAPnP(x86)、CPUID(x86)、IDE、ATA、ATAPI、PCMCIA、SCSIなどに対応し、PCに搭載しているハードウェアについて、ベンダー名、プロダクト名、チップ名、リビジョンなど細かな情報までひとまとめに表示します。

 リスト4は、lshwがハードウェア情報を得ているディレクトリおよびファイルで、lspciやcatコマンドで/procを調べた場合と同じ情報元をベースにしているのが分かります。単純なプログラムですが、コマンド1つでパッとハードウェア情報を得られるのは、非常に便利です。

リスト4 lshwが表示するハードウェア情報の基になっているファイル

/usr/local/share/pci.ids
/usr/share/pci.ids
/etc/pci.ids
/usr/share/hwdata/pci.ids
/proc/bus/pci/*
/proc/ide/*
/proc/scsi/*, /dev/sg*
/dev/cpu/*/cpuid
/proc/device-tree/*
/sys/*

 インストールは、まず今月号の付録CD-ROMに収録してあるlshw-A.01.05.tar.gzを任意のディレクトリに展開し、次のようにmakeを行います。


$ tar vxzf lshw-A.01.05.tar.gz
$ make

 コンパイルが終わるとlshwができるので、これを/usr/local/binや/usr/binなどパスが通ったディレクトリにコピーします。また、最新版を入手したい場合には次のURLを参照してください。

http://ezix.sourceforge.net/software/lshw.html

lshwの利用方法

 lshwは、通常の表示方法以外に出力形式の指定が可能で、「-html」オプションでHTML形式、「-xml」オプションでXML形式で表示できるようになっています。たとえば、次のように実行すると、htmlファイルやxmlファイルとして記録できます。


# lshw -html > abc.html
# lshw -xml > efg.xml

「-html」オプションを指定して出力したデータは、図4のようになります。

zu4.jpg

図4 「-html」オプションを使い、HTMLデータとしてハードウェア情報を記録可能

 また、実行例5のように「-short」オプションを利用すると、ハードウェアアドレス、クラスなどの情報とともにシステム構成を表示させられます。また、ここで得られたクラス情報をもとに、実行例6のように「-class」オプションで特定のクラスを指定すると、目的のハードウェアの詳細情報のみを表示させられます。

実行例5 「-short」オプションを利用した場合のシステム構成表示

# lshw -short
WARNING: you should run this program as super-user.
H/W path Device Class Description
==================================================
system Computer
/0 bus
/0/0 memory System memory
/0/1 processor Celeron (Coppermine)
/0/1/0 memory L1 cache
      :
      :
/0/100/1f.1/1 ide1 bus Channel 1
/0/100/1f.1/1/0 /dev/hdc disk CRD-8480M
/0/100/1f.2 bus 82801AA USB
/0/100/1f.5 multimedia 82801AA AC'97 Audio
/1 eth0 network Ethernet interface
/2 eth1 network Ethernet interface

実行例6 「-class」オプションでクラスを指定し、特定のハードウェアの情報のみを表示

# lshw -class bus
*-core
physical id: 0
*-ide:0
description: Channel 0
physical id: 0
bus info: ide@0
logical name: ide0
clock: 33MHz
*-ide:1
description: Channel 1
physical id: 1
bus info: ide@1
logical name: ide1
clock: 33MHz
*-usb
description: USB Controller (UHCI)
product: 82801AA USB
vendor: Intel Corp.
physical id: 1f.2
bus info: pci@00:1f.2
version: 02
clock: 33MHz
capabilities: uhci bus_master
configuration: driver=usb-uhci
resources: ioport:d000-d01f irq:9

前のページ | 1 2 3 | 次のページ

[UNIX USER]

Copyright(C) 2010 SOFTBANK Creative Inc. All Right Reserved.