AIDEMOIRE

【アイデモワール】

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ドライバを使うことにしました。

リポジトリからインストールするパッケージは(動作確認はともかく)少なくともコンパイルやインストールは問題なくできるものだと思っていたのですが、甘かったです。もし、コンパイルも通らない状態であればリポジトリのパッケージとして配布しない方がいいのではないか思いました。(「メーカーのホームページからダウンロードしたものを使ってください」という方が親切かと感じました。)