ハードウェア自動検出

libkudzuを直接使ってやろうと思い、hwsetupを自分なりに書き直してみた。(私にはhwsetupは非常に解読しにくい…
kudzuは、どうやらpci.idsファイル(PCIデバイスが教えてくれるIDと、ベンダー名や概要文などのデータベース)を読み込み、ベンダー名などを教えてくれ、さらに"そこからどうにかしてそのデバイスに対応するLinuxのドライバを割り出し"、教えてくれるというものである模様。どうやって割り出しているかは良くわからない。
というか実験したところでは割り出せていなかった。unknownになってしまう…。やはり今度CentOSあたりをインストールしないと。


ちなみに、pci.idsファイルを読み込むのはpciutilsというライブラリ(?)で、kudzuが直接読み込んでいるわけではない。
hwsetupはkudzuを呼び出して、順次modprobeを行う。ついでに進捗状況をバーで表示したりなどなど、ユーザーインターフェース絡みのことを行う。
また、kudzuに教えてもらったベンダー名や概要から、X11のドライバの決定も行っている。kudzuがX11のドライバを検出するわけではない模様。グラフィックカードに関しては、kudzuは「こんなカードが刺さっているよ」ということしか教えてくれない。hwsetupはkudzuからもらったグラフィックカードの情報と、「Cards」データベースを照らし合わせ、対応するX11のドライバを決定する。「Cards」データベースに載っていないドライバでも、「NVidiaという語が含まれていたら"nv"ドライバを使う」など、推測もする。ここはおとなしくvesaやfbdevドライバを使っておいた方が良いか、推測してでもマッチしたドライバを使うかは微妙なところか。
さらに、kudzuが教えてくれるマウスの情報は結構あいまいらしいので、hwsetupがうまくやる。


…と、ハードウェア自動検出は結構大変なのである。特に過去との互換性を確保しないといけない部分が大きいので、大変複雑。


discoverはまったく別のことをやっている。
あらかじめPCIデバイスのIDと、ベンダー名や概要、そしてLinuxのドライバの対応表(XML)を持っている。このファイルをどうやって作っているかは良くわからない。discover-dataというDebianのパッケージに入っている。pci.idsから作っているのだろうか?だとしたら最新のpci.idsを使って対応表を更新できるか?それとも個別に保守されているのだろうか?
discoverはこの対応表を読み込んで、刺さっているPCIからのID情報と照らし合わせ、ドライバをロードする。
X11のドライバを決定するのかどうかは、未調査。



そして今回、ldetectというモノを発見。(なんか毎回いろいろ発見しているような…
Light hardware detection libraryの略らしい。どうLightなのかは不明。
ldetectパッケージ(RPM)はldetect-lstに依存していて、ldetect-lstの中にはpcitable、usbtableなどといった、デバイスのIDと、ベンダー名、概要、Linuxのドライバの対応表が入っている。デバイス名(IDではない)とX11のドライバの対応データベース「Cards+」も入っている。どう+なのかは不明。
ldetectのソースをコンパイルすると、lspcidrakeというコマンドが出てくる。うむ。どう見てもMandriva。AUTHORSファイルにもひたすら***@mandrakesoft.comと並ぶ。でもライセンスはGPL。まぁOKか。
このコマンドを叩くと、ずらっとドライバ名が出てくる。後はシェルスクリプトなり何なりでmodprobeすれば完了と見える。
"sk98lin", "snd-intel8x0"などと並ぶドライバ名の中に、"Card:NVIDIA GeForce ..."となっているところがある。おそらくCards+データベースから対応するX11のドライバを使えということだと思われる。ペンタブレットまで検出されていて、Tablet:wacomとなっている。細かい。
ということで、これは良い。
Mandrivaのツール群はだいたいPerlスクリプトなのだけど(おそらく中にPerler集団がいるのであろう…)、ldetectはCだった。




…以上をまとめるに、まずkuduzuは複雑でイヤ。ただRedHat系が軒並みkudzuを使っている(というかanacondaがkudzuを使っている)ところからして、pci.idsはとてもハードウェアのカバー範囲が広そうな気がする。ということで、discoverの対応表がpci.idsから作れるなら、これは非常に良い。ldetectもとても良い。
ただdiscoverを使うにしても、ldetectにしても、X11のドライバはLinuxカーネルのドライバとは別なので、CardsデータベースかCards+データベースをパースするプログラムは書かないといけない気がする。あるいはhwsetupを拝借するか。



と、見ていると、やっぱりハードウェア自動検出はインストーラとかかわりが深いなと。
anaconda = kudzu
Debian系のインストーラ = discover
DrakX(Mandrivaのインストーラ) = ldetect(HardDrake?)
となると、SUSEのインストーラをやっぱり調査しないといけないな。YaST絡みだと思うので、たぶんライセンスはGPL
一番楽できる(トラブルが起きにくそうな)ものを探さないと。