特集
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)。これらのツールは一度システムが起動した後も、任意のときに実行して新しいハードウェアを認識させることができます。
一見単純な仕組みですが、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のようになります。
また、実行例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 |
[UNIX USER]
Copyright(C) 2010 SOFTBANK Creative Inc. All Right Reserved.