startxをするとFATAL: Module vboxvideo not found.と出る場合の対処法

まえがき

毎度のごとくgentooを前提に書いてます
試してませんがemergeでいれる他のグラフィック系のドライバならこの方法でも応用すれば解決できると思います

症状

% startx
xauth:  file /home/noter/.serverauth.3037 does not exist


X.Org X Server 1.12.2
Release Date: 2012-05-29
X Protocol Version 11, Revision 0
Build Operating System: Linux 3.2.12-gentoo i686 Gentoo
Current Operating System: Linux localhost 3.3.8-gentoo #49 Sat Jul 28 09:38:24 JST 2012 i686
Kernel command line: root=/dev/sda3 video=uvesafb:1280x1024-32,mtrr:3,ywrap
Build Date: 27 June 2012  12:19:33AM

Current version of pixman: 0.26.0
        Before reporting problems, check http://wiki.x.org
        to make sure that you have the latest version.
Markers: (--) probed, (**) from config file, (==) default setting,
        (++) from command line, (!!) notice, (II) informational,
        (WW) warning, (EE) error, (NI) not implemented, (??) unknown.
(==) Log file: "/var/log/Xorg.0.log", Time: Sun Jul 29 04:19:09 2012
(==) Using config file: "/etc/X11/xorg.conf"
(==) Using system config directory "/usr/share/X11/xorg.conf.d"
FATAL: Module vboxvideo not found.
(後略)

こんな感じでエラーが出ます
私の場合はフレームバッファを有効にしているからなのかわかりませんがエラーが出てもXを使えます

やり方のまとめ

カーネルがモジュールに対応していなければできないので
事前にmenuconfigでこれらを有効にしたカーネルで起動しておく

[*] Enable loadable module support

これだけだとモジュールの読み込みだけできてもモジュールの読み込まれた削除ができないので
できるようにしたい人は

[*] Enable loadable module support -> [*] Module unloading

これも有効にしておく
後はこれだけだとこのようなエラーが出る場合があるので

# insmod /lib/modules/3.3.8-gentoo/misc/vboxvideo.ko
insmod: error inserting '/lib/modules/3.3.8-gentoo/misc/vboxvideo.ko': -1 Unknown symbol in module

dmesgを見るとdrm関連がないといってるので

% dmesg
(前略)
vboxvideo: Unknown symbol drm_open (err 0)
vboxvideo: Unknown symbol drm_fasync (err 0)
vboxvideo: Unknown symbol drm_poll (err 0)
vboxvideo: Unknown symbol drm_pci_init (err 0)
vboxvideo: Unknown symbol drm_ioctl (err 0)
vboxvideo: Unknown symbol drm_vblank_init (err 0)
vboxvideo: Unknown symbol drm_mmap (err 0)
vboxvideo: Unknown symbol drm_pci_exit (err 0)
vboxvideo: Unknown symbol drm_core_reclaim_buffers (err 0)
vboxvideo: Unknown symbol drm_release (err 0)

これを解決するために

Device Drivers -> Graphics support -> [*] Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)

これも有効にしておく
そしてvboxvideoのモジュールをいれるためemergeする

# emerge -va "x11-drivers/xf86-video-virtualbox"

モジュールの情報を更新するために

# depmod -a

これを実行して後は

% startx

これでFATALがないことを確認して

% lsmod
Module                  Size  Used by
vboxvideo               1066  1

モジュールが読み込めていることを確認できれば終了です

Q&A

もしモジュールを読み込もうとすると

# modprobe vboxvideo
FATAL: Error inserting vboxvideo (/lib/modules/3.3.8-gentoo/misc/vboxvideo.ko): Invalid module format

こうなってしまう場合は現在のカーネルとあってないのでモジュールの方をビルドし直しましょう

やり方をまとめる前に実際に試した順序のまとめ(色々とごちゃごちゃしていて余計なことも書いてます)

それではエラーを消したいのでvboxvideoというドライバを入れます

# emerge -va "x11-drivers/xf86-video-virtualbox"

これで入りますがカーネルがmoduleに対応していないと

 * These sources do not support loading external modules.
 * to be able to use this module please enable "Loadable modules support"
 * in your kernel, recompile and then try merging this module again.
 * ERROR: x11-drivers/xf86-video-virtualbox-4.1.12 failed (setup phase):
 *   No support for external modules in 3.3.8-gentoo config

emerge中にこのようなエラーが出ると思うのでそういった場合はカーネルのmenuconfigで

[*] Enable loadable module support

これを有効にしてください
もし途中でモジュールをunloadしたくなりたいなら

[*] Enable loadable module support -> [*] Module unloading

これも有効にしておく必要があるみたいです
そしてx11-drivers/xf86-video-virtualboxをいれてモジュールを読みこませようとすると

# modprobe vboxvideo
FATAL: Module vboxvideo not found.

なぜかmodprobeでは読み込めないのであとで直しますが今回はinsmodを使って

# insmod /lib/modules/3.3.8-gentoo/misc/vboxvideo.ko
insmod: error inserting '/lib/modules/3.3.8-gentoo/misc/vboxvideo.ko': -1 Unknown symbol in module

こんな感じのエラーが出ますのでどんなエラーなのか知るために

% dmesg
(前略)
vboxvideo: Unknown symbol drm_open (err 0)
vboxvideo: Unknown symbol drm_fasync (err 0)
vboxvideo: Unknown symbol drm_poll (err 0)
vboxvideo: Unknown symbol drm_pci_init (err 0)
vboxvideo: Unknown symbol drm_ioctl (err 0)
vboxvideo: Unknown symbol drm_vblank_init (err 0)
vboxvideo: Unknown symbol drm_mmap (err 0)
vboxvideo: Unknown symbol drm_pci_exit (err 0)
vboxvideo: Unknown symbol drm_core_reclaim_buffers (err 0)
vboxvideo: Unknown symbol drm_release (err 0)

見てみると勘ですがdrmという機能をONにすれば動きそうです
http://www.gentoo.org/doc/en/dri-howto.xml を参考にして
カーネルを再構築してDirect Rendering Managerを有効にします
というわけでmenuconfigの

Device Drivers -> Graphics support -> [*] Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)

を有効にしたカーネルで起動して再びモジュールを読み込ませてみます

# insmod /lib/modules/3.3.8-gentoo/misc/vboxvideo.ko

何も出ないので問題なさそうです

% startx

実際にXを立ちあげてFATALがないか確認する
このままだと毎回モジュールを手動で読み込ませないといけないので*1
この内容を/etc/conf.d/modulesに書き込んで起動時に読み込むようにします

modules="vboxvideo"

後は再起動をして勝手に読み込まれている予定だったのですが

* Loading module vboxvideo
* Failed to load vboxvideo

のような文字列がopenrcの実行中に出てきて

% lsmod
Module                  Size  Used by

という状態でモジュールが明らかに読み込まれていないので

# depmod -a

これを実行することにより

/lib/modules/`uname -r`/modules.dep

の中身が更新されて無事ロードされるようになるはずです
これをすることによりさらに

# modprobe vboxvideo

も動くようになりました
後は

% lsmod
Module                  Size  Used by
vboxvideo               1066  1

このように読みこめているか確認すれば完了です

余談:過去にx11-drivers/xf86-video-virtualboxを入れていたのになぜエラーが出たのかの考察

恐らくemerge中に出る

(前略)
 * Found kernel source directory:
 *     /usr/src/linux
 * Found kernel object directory:
 *     /lib/modules/3.3.8-gentoo/build
 * Found sources for kernel version:
 *     3.3.8-gentoo
(後略)

これがキーパーソンっぽいです
/usr/src/linuxを見て現在のカーネルのモジュールの場所を見つけているのだと思います
そしてこの情報を元にinstallする時に

(前略)
>>> Installing (1 of 1) x11-drivers/xf86-video-virtualbox-4.1.12
 * checking 10 files for package collisions
>>> Merging x11-drivers/xf86-video-virtualbox-4.1.12 to /
--- /lib/
--- /lib/modules/
--- /lib/modules/3.3.8-gentoo/
--- /lib/modules/3.3.8-gentoo/misc/
>>> /lib/modules/3.3.8-gentoo/misc/vboxvideo.ko
(後略)

このようにインストールされるみたいです
つまりはなんだかカーネルに依存してるみたいですね
それで私は何度かカーネルのバージョンを変えていたのでそれが原因なのかもしれません

余談:今回苦労したところ

modules.depの存在に気づくまでにかなり時間がかかりました
modprobeのヘルプを眺めていて

% modprobe --help
modprobe: unrecognized option '--help'
Usage: modprobe [-v] [-V] [-C config-file] [-d <dirname> ] [-n] [-i] [-q] [-b] [-o <modname>] [ --dump-modversions ] <modname> [parameters...]
modprobe -r [-n] [-i] [-v] <modulename> ...
modprobe -l -t <dirname> [ -a <modulename> ...]

dirnameを引数に使うオプションの存在に気づいたことが大きかったです
ディレクトリを指定するそうなので

% modprobe -d /lib/modules/3.3.8-gentoo/misc/ --list
FATAL: Could not load /lib/modules/3.3.8-gentoo/misc//lib/modules/3.3.8-gentoo/modules.dep: No such file or directory

このように適当に打ってみたところmodules.depがないと返ってきたので後はすいすいと進めました
もはや運です
ちなみにこのオプションを使う場合は試してませんが出力で考えると絶対パスで書いてしまっていますが相対パスじゃないといけないみたいですね

余談:私の環境でこれをして変わったこと

なんだかXの起動と終了が早くなったような気がします
それとawesomeを終了させた時にたまに画面がCUIに戻らずにフリーズしていたのが直ったような気がしなくもない
と油断していたら案の定フリーズしてしまった。何が原因なのかさっぱり

*1:後で気づいたのですがstartxをすると勝手に読み込んでくれるみたいです。