2009年11月21日土曜日

DKMS: Dynamic Kernle Module Support

Xenインストールの過程で出てきた謎「Ubuntu kernel (2.6.31-14-generic) だとNVIDIAプロプライエタリドライバが使われるのに、Xenified kernel 2.6.31.5だと使われない」を調べました。

まず、このドライバであるカーネルモジュールを探してみました。/lib/modules/2.6.31-14-generic の下だろうと見当をつけて適当に検索。私は "tree | less" が好きです。
"/lib/modules/2.6.31-14-generic/updates/dkms/nividia.ko" を発見。

"dkms" が謎なので、Wikipediaで調べる。「kernel suorce treeに含まれないドライバをサポートする仕組み」とある。ふーん知らないことがいっぱいあるなぁ。というか、こういう細かい仕組みが増えつづけててキャッチアップできない。

何かログが残ってるだろ、と思って/var/log以下を見てみると、dkms_autoinstallerというログファイルがあり、中には、
nvidia (185.18.36): Installing module.
  Kernel headers for 2.6.31.5 are not installed.  Cannot install this module.
  Try installing linux-headers-2.6.31.5 or equivalent.
というエラーメッセージが。
多分dkmsは、/usr/srcの下をチェックするのだろうが、2.6.31.5は/home/kawamoto/work/linux-2.6-xenでビルドしただけなので、/usr/src/linux-headers-2.6.31.5なるものはない。逆に、/usr/src/linux-headers-2.6.31.5にヘッダをおいて、dkmsというのを使えばインストールできそうである。
# make headers_install INSTALL_HDR_PATH=/usr/src/linux-headers-2.6.31.5
とヘッダをインストールしてから、dkmsコマンドでビルド & インストールしてみた。
# dkms build -m nvidia -k 2.6.31.5 -v 185.18.36

Kernel preparation unnecessary for this kernel.  Skipping...
applying patch rt_preempt_31.patch...patching file nv-linux.h

applying patch fall_back_on_mtrr_if_no_pat.patch...patching file nv.c
Hunk #1 succeeded at 891 (offset -49 lines).

applying patch nvidia-rt-compat.patch...patching file os-interface.c


Building module:
cleaning build area....
su nobody -c "make KERNELRELEASE=2.6.31.5 module KERNDIR=/lib/modules/2.6.31.5 IGNORE_XEN_PRESENCE=1 IGNORE_CC_MISMATCH=1 SYSSRC=/lib/modules/2.6.31.5/build".......
cleaning build area....

DKMS: build Completed.
# dkms install -m nvidia -k 2.6.31.5 -v 185.18.36

nvidia.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/2.6.31.5/updates/dkms/

depmod.............

DKMS: install Completed.
これで、2.6.31.5 + NVIDIAプロプライエタリドライバで動きました。
$ uname -r
2.6.31.5
$ lsmod | grep nvidia
nvidia              10316680  36

教訓:
いくつかのモジュールにおいては(少なくとも dkms では)、カーネルに対応したヘッダが、/usr/src/linux-headers-`uname -r`に存在している事が前提となっているので、パッケージを使わない場合も置いておくこと。

2009-11-29 追記:
NVIDIAプロプライエタリドライバは、Xenに対応してないことが分かりました・・・。残念。

0 件のコメント:

コメントを投稿