2013-03-12

GNU/Linuxでグラフィックドライバーを手動でインストールすることの困難について

[Phoronix] Intel Comes Up With A Linux Graphics Driver Installer

Phoronix.comで、IntelがGNU/Linux用のグラフィックドライバーのインストーラーを公開したことを記事にしている。せっかくなので、この機会に、GNU/Linuxでは、自由であれ、不自由であれ、グラフィックドライバーを手動でインストールすることがいかに難しいかということについて、書いてみよう。

普通の不自由なWindowsユーザーのゲーマーならば、グラフィックドライバーは常に最新版を入れておくのが当然だ。また、最低でも年に一度はグラボを交換するのも常識だ。ゲーマーとはそういう人種だ。その際、グラフィックドライバーが自力で導入できない者はいない。今のところ、まともなゲーマーのグラボの選択肢は二つしかない。nVidia製かAMD製かだ。nVidiaもAMDも、公式サイトで最新の不自由なグラフィックドライバーのインストーラーを配布しており、単に落として実行するだけでインストールが完了する。それだけのことだ。

インストーラーは何をやっているのか。基本的には、不自由なドライバーの実装であるプログラムとしてのバイナリブロブを然るべき場所に配置して、システムがそのバイナリブロブをドライバーとして認識するよう、システムの設定を書き換える。それだけだ。GNU/Linuxでも基本は同じだ。ドライバーは最終的にバイナリになり、必要に応じて使われるべく、設定される。

不自由なソフトウェアが蔓延しているWindows環境では、バイナリ互換は絶対だ。Microsoftは不毛なまでの労力をかけて、バイナリ互換を壊さないようにしている。たとえある挙動が好ましからぬとしても、不具合であるとしても、その挙動に依存して、たまたま問題なく動いてしまっているソフトウェアがあるならば、Windowsはその挙動を簡単に変更できない。もし変更したならば、今までたまたま問題なく動いていたソフトウェアが動かなくなる。たとえそれが、カーネル空間に読み込まれるドライバーであってもだ。実に、不自由なソフトウェアの信奉者は無駄な苦労をしていると言える。

Linuxカーネルでも、バイナリ互換は重視されている。ただし、ユーザーランドの話だ。カーネルの変更でユーザーランドのソフトウェアの挙動が悪い方向に変わってしまったとしたならば、それはカーネルの不具合だ。ただし、カーネル自体は話が別だ。カーネルはカーネルだ。Linuxカーネルのソースコードは自由なのが当然なのだから、カーネル内のバイナリ互換など考慮する必要がない。なぜならば、カーネルはコンパイルして使うものだからだ。

さて、不自由ソフトウェアの非常識をLinuxカーネルに持ち込むと、非常に困ったことになる。もちろん、基本的にはそう変わることがない。したがって、グラフィックドライバーの実装をプロプライエタリなバイナリブロブとして提供することも可能だ。ただし、それは自己完結する部分だけであり、Linuxカーネル側の特定のデータ構造を操作したり、関数を呼び出したりしたい場合、問題になる。そのためにはデータ構造や関数へのアドレスを指すシンボルが必要になる。このアドレスはカーネルごとに異なる。シンボルを得るためには、ユーザーの環境のLinuxカーネルのヘッダーを使ってプログラムをコンパイルしなければならない。あらかじめコンパイル済みのバイナリだけでは、このシンボルが得られない。

では邪悪な不自由ソフトウェアの信奉者であり、何としてもソースコードを公開したくないnVidiaやAMDはどうやってプロプライエタリなバイナリブロブのグラフィックドライバーを提供しているのか。彼らは、シンボルを取得する部分だけ、ソースコードを公開し、ユーザーの環境でコンパイルする。不自由なバイナリブロブは、そのコンパイルされたバイナリを経由して、Linuxカーネルの必要なシンボルにアクセスする。

ユーザーの環境でコンパイル。これが難しい。もちろん、コンパイルは自動化できる。しかし、コンパイルに必要なもの(お使いのLinuxカーネルのヘッダー、コンパイラー、その他のツール)については、ユーザーが自力で用意しなければならない。

主要なディストロでは、利用者の手間を省くべく、nVidiaやAMDといった有名なGPU用のドライバーは、標準のパッケージ管理ソフトウェアでインストールできるよう、あらかじめ調整してくれている。しかし、今日リリースされたばかりの最先端のドライバーを利用したい場合は、どうしようもない。

実に、邪悪で不自由なソフトウェアの信奉者は面倒だ。

では、自由なソフトウェアのグラフィックドライバーの手動インストールは簡単かというと、これが、遺憾ながら、不自由なドライバーより難しいときている。

GNU/Linuxにおける自由なグラフィックドライバースタックは、単一のソフトウェアではなく、大量のソフトウェア群である。ドライバーの一部はLinuxカーネルに、一部はMesaに、一部はX.Orgに、一部はLLVMに、といった具合に、広く分散している。従って、単にカーネルモジュールをひとつコンパイルして読み込むというわけにはいかない。関連する依存ソフトウェアをすべてアップデートしなければならない。しかし、MesaやX.OrgやLLVMは、グラフィックドライバーだけが利用するソフトウェアではなく、グラフィックドライバーの都合だけで気安くアップデートするわけにはいかない。ましてや、ドライバーの実装が最新のLinuxカーネルのバージョンに依存している場合、Linuxカーネル本体をアップデートしなければならない。グラフィックドライバーの都合だけで、Linuxカーネルのアップデートなどできるわけがない。通常は。

結局これは、重複する機能をそれぞれのドライバーで独自に実装せず、共通の実装にして使うという文化からきている。ソフトウェアが自由であり、ソースコードが公開されていて、気軽にコンパイルできる環境だからこそ可能な文化だが、残念ながらこの文化は、ドライバーのアップデートをとても難しくしてしまう。ドライバーのアップデートをするには、依存関係から、システム全体のアップデートが必要になるからだ。

で、このIntelオープンソース・テクノロジー・センターの提供する、Intel Linuxグラフィック・インストーラーは何をしているかというと、要するにUbuntuとFedora用の依存するソフトウェア群のサードパーティレポジトリの提供だ。

Intel Linux Graphics Installer | Linux Graphics

インストラーを実行すると、aptやyumにIntelの保守するレポジトリを追加し、そこからUbuntuやFedoraに合わせて必要な適切に設定されたソフトウェア群をインストールするという仕組みになっている。

そのため、ローリングリリースモデルを採用していない初心者にも使いやすい安定志向のディストロでは、自由なドライバーの大規模なアップデートは、次のディストロのリリースを待たねばならない。この現状はもう少し何とかならないものか。

No comments: