VMGLで、VMでも3D効果
今日のデュアルコア・プロセッサーには、仮想化コンピューティング環境が利用することのできる仮想化支援機能が組み込まれている。しかし、その仮想マシン上の3Dを支援する仕組みははほとんどない。そのわずかな例の一つが、GoogleのSummer of Code 2006の一環として書かれた VMGL というアプリケーションだ。あまり知られていないが、これを使うと、ホストのハードウェア・グラフィックス・アクセラレーションを仮想マシン上で動作するOpenGLアプリケーションから利用できるようになる。制約はあるものの、VMで3Dが必要なら試してみるだけの価値はある。
VM上でネイティブ3Dを提供するというゴールに最も近づいている仮想化プラットフォームは最近リリースされたVMware 6.5(翻訳記事)で、Windows XPゲスト上でOpenGL 2.0アプリケーションが動く。しかし、利用できるのはATIとNvidiaの一部グラフィックス・カードだけで、オンボードのIntel製グラフィックス・チップは使えない。最近のIntel製グラフィックス・チップはLinuxディストリビューション上で動作するほとんどのシューティング・ゲームやレース・シミュレーターが動くほどの性能を持っていることを考えると、この制約は大きい。
これに対して、VMGLはATI、Nvidia、Intelのすべてのグラフィックス・モジュールに対応しており、基本的に、ホストで3Dを実行できればVMでも使えるようになる。しかも、仮想化プラットフォームを選ぶこともない。筆者はVMwareとVirtualBoxによるVMで確認したが、XenやKVMでも使えるはずだ。
VMGLはOpenGLライブラリーを使っているアプリケーション(とゲーム)を加速する。現行バージョンはOpenGL v1.5をサポートしているが、若干の例外がある。これについては、ソースのtarballに含まれている文書をご覧いただきたい。なお、VMGLは、tarballのほかに、RPMの形でも提供されている。
VMGLでVM上の3Dアプリケーションを動かす方法は2つある。一つは、VM上でVMGL版VNCサーバーを動かしホストからそれに接続する方法。もう一つはVMwareの利用者にだけ使える方法で、ソースがオープンでないため手順はかなり錯綜している。前者の方法が推奨されており、設定も容易で、仮想化プラットフォームにも依存しない。
インストールは、ホスト用とゲスト用の2つのRPMを使うのが最も簡単だ。Debian系システムの場合はRPMファイルを.debに変換する。alienを使えば簡単だ。tarballを利用してもよい。インストールの手順は同梱のインストール・ファイルにある。ほかに、ライブラリー(libXaw、libXext、libjpeg、libXmu)とその開発パッケージを用意する。
必要なパッケージを揃えインストールしたら、次にゲスト・ディストリビューション上のXorg構成ファイルを変更し、vmglextモジュールがロードされるようにする。具体的には、xorg.confファイル(通常は/etc/X11の下にある)を開き、Moduleセクションの下に次の行を追加する。
Load "vmglext"
構成ファイルを保存しXを再起動し、VMGLのインストール時に導入されたカスタムVNCサーバーを立ち上げる。具体的には、RPMでインストールした場合、「Xvnc :1
」コマンドを発行する。VNCサーバーが複数インストールしてある場合は注意し、必ずVMGLのものを使うこと。デフォルトでは、これは/usr/local/binの下にある。
カスタムVNCサーバーは古いリリースをベースにしているため、/usr/X11R6/lib/X11/fontsでフォントを探す。この問題は、システム上のX11フォントの場所(通常は/usr/share/fonts)へのシンボリック・リンクを作るか、「Xvnc -fp /usr/share/fonts/ :1
」のように-fp
スイッチでフォントのパスを指定してXvncを起動することで回避できる。
次に、ホストに移り、VMGL版vncviewer(デフォルトでは/usr/local/binの下にインストールされる)を使ってゲスト上で動作しているXvncサーバーに接続する。たとえば、ゲストVMのIPアドレスが192.168.2.55だとすると、「vncviewer 192.168.2.55:1
」を実行すればよい。VMに接続し、灰色のウィンドウが開くはずだ。ウィンドウが空なのは、ゲストのXvncサーバーにアプリケーションがないからだ。
アプリケーションを実行する前に、もう1つ行うべき手順がある。まず、vncviewerコマンドを発行したウィンドウにある表示を調べる。「Set GLSTUB var in guest to point to port 7001」といったメッセージがあるはずだ。そこに示されたポート番号を確認してゲストに移り、ターミナル・ウィンドウからコマンド「export GLSTUB=192.168.2.55:7001
」を発行する。ここで、IPアドレスはゲストのアドレス、ポート番号はvncviewerのメッセージにあったものだ。
以上で、設定はすべて完了した。ゲスト上でglxinfoを実行してみよう。glx vendorとしてvmglが表示されるはずだ。次に、ゲストとホストの両方でglxgearsを動かし、3Dのレンダリング速度を比較してみよう。もちろん厳密なベンチマークにはならないが、概要はわかるだろう。glxinfoやglxgearsがないときは、お使いのディストリビューションに対応したmesa-demosパッケージをインストールすればよい。
今後
もしお好みの3Dアプリケーションが動かなかったとしても、すぐのアップデートを期待してはならない。製作者であるH. Andres Lagar-Cavillaにとって、今は、博士号の取得が最優先事項なのだ。しかし、開発をやめたわけではなく、実装すべき課題の腹案は持っている。また、現在、ほかの開発者が行っているWindows互換の実装にも協力しているので、いずれ、Linuxホスト上のWindowsゲストで3Dアプリケーションを動かせるようになるだろう。
VNCを介して3Dアプリケーションを動かすというのは、一見、迂遠なように思える。しかも、現在のVMGLはLinuxホスト上のLinuxゲストでしか使えないのだから、なおさらだ。しかし、VMでホスト並みのグラフィックス機能を望むなら、VMGLに勝るものはない。