Linux 3.7系でfglrxのカーネルドライバがコンパイルできない!
“Debianのリポジトリ”にある(つまりapt-getでインストールできる)fglrxのカーネルドライバをLinux 3.7にインストール方法です。
Linux 3.7系ではAMDのビデオカード用のfglrxカーネルドライバがコンパイルできないそうです。“VMware DirectPath I/Oでビデオカードを使ってみました - AIDEMOIRE”を試していて遭遇してしましました。カンーネルドライバをコンパイルする際に“firegl_public.c”というソースコードで“VM_RESERVED”が未定義!として怒られます。ネットのあちらこちらで問い合わせと回答が書かれています。例えば、
#697439 - fglrx-driver: dkms fails to build with kernel 3.7 - Debian Bug report logs
中には「AMDは何をやっているだ!」って怒っている人もいます。(ごもっとも)
どうもLinuxの3.6から3.7にバージョンが上がった際、VM_RESERVED が別の方法で定義されるようになったので VM_RESERVED の定義がなくなってしまった、というのが原因らしいです。(私的には後方互換性を保つべきだったかと思います。定義を忘れただけかも知れませんが。)
従って解決策は簡単で、firegl_public.c の
#define VM_SHM 0 #endif
の後に、
#ifndef VM_RESERVED #define VM_RESERVED (VM_DONTEXPAND | VM_DONTDUMP) #endif
の3行を追加するだけです。上のページも含め、あちこちでパッチファイルも出回っています。
ところがです。AMDのホームページからダウンロードしたドライバを使う場合は、ここを直してインストール スクリプトを再実行すれば良いのですが、リポジトリからapt-getでインストールしようとしている場合は困ってしまいます。
apt-getの途中でエラーになるので、ソースコードを修正してから何をすれば良いのやら。再度、apt-getでinstallしようとすると「既に最新版だよ」と言って何もしてくれないし。一旦、remove や purge で消してから install しようとしても、ソースコードが元に戻るだけだし。ネットで調べてもAMDのものについては詳しく書いてあるのですが、リポジトリにものに関しては記事も見つかりませんでした。
さて、仕方ないのでこの辺りは感を働かせて。モジュール形式のカーネル・ドライバは DKMS(Dynamic Kernel Module Support)が管理しているようなので、きっとドライバを更新する DKMS のコマンドがあるに違いないと。調べたら、そのまんまのコマンドがありました。dkms! これに更新したい(インストールしたい)モジュール名とバージョン(今回は“fglrx/12-6+point”)を指定して実行すれば良いようです。しかしモジュール名/バージョンは変わるので今回は autoinstall を指定し実行しました。
なお、修正するソースコードはコンパイルの対象となる
/var/lib/dkms/fglrx/12-6+point/build/firegl_public.c
ではなくて
/usr/src/fglrx-12-6+point/firegl_public.c
の方を修正します。/var/libの方は dkmsコマンドによって/usr/srcからコピーされます。従って/var/libの方を修正しても dkmsコマンドを実行すると上書きされて元に戻ってしまいます。
以上をまとめると次のようになります。
1:fglrxドライバをインストールする
apt-get install fglrx-control でカーネル・ドライバも含めてfglrxのパッケージをインストールします。(Kali Linuxの場合は fglrx-control を指定することで一式がインストールされますが、Ubuntuの場合は“fglrx”を指定するようです。ここはディストリビューションに依って異なるようです。)
2:ソースコードを修正する
/usr/src/fglrx-12-6+point/firegl_public.c
// VM_SHM is deleted in 2.6.18 or higher kernels. #ifndef VM_SHM #define VM_SHM 0 #endif +// VM_RESERVED is replaced with VM_DONTEXPAND | VM_DONTDUMP in Linux 3.7+ +#ifndef VM_RESERVED +#define VM_RESERVED (VM_DONTEXPAND | VM_DONTDUMP) +#endif + #ifdef FGL_LINUX253P1_VMA_API
3:dkmsを実行する
dkms autoinstall
余談ですが
私はLinuxに機能を追加する場合、できる限りリポジトリにあるものを使います。バグ修正などがあった場合に自動的にアップデートされるので、管理が楽だからです。リポジトリ以外のパッケージをインストールすると、パッケージの更新は手動でやらなければなりませんし。Linuxのカーネルの更新があった場合にも、パッケージの方も再インストールする必要があることが多いからです。
リポジトリのパッケージには無い最新の機能を必要とする場合、仕方なく個別にダウンロードしてインストールします。AMDのビデオカードの場合、AMDのホームページから最新版をダウンロードして使うのが一般的には紹介されています。最新のボードを動かす場合は、より最新のドライバの方がバグも少ないので、その方が良いかと思います。しかし、今回はRadeon HD 6450と言う、ちょっと旧型の廉価版のボードを動かすのが目的でしたので、敢えて手間のかかる最新版を使う必要もなく、枯れているドライバとしてリポジトリにあるfglrxドライバを使うことにしました。
リポジトリからインストールするパッケージは(動作確認はともかく)少なくともコンパイルやインストールは問題なくできるものだと思っていたのですが、甘かったです。もし、コンパイルも通らない状態であればリポジトリのパッケージとして配布しない方がいいのではないか思いました。(「メーカーのホームページからダウンロードしたものを使ってください」という方が親切かと感じました。)