試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

VMGLの覚え書き(失敗した方式のメモ)

今回、Sun xVM VirtualBoxQEMU/KVMGUIウィンドウ上にOpenGLアプリケーションを表示させようと試したのだが、うまくいかなかった。
また、VMGLのパッケージに含まれるXvncも、動作しなかった。
実験環境には、ホスト/ゲストともにx86_64版のMandriva Linux 2009.0を使用し、以下の実験において、ファイアウォール機能は一時的に無効にしている。(トラブルの原因がファイアウォールでないことを確かにする目的)

  1. (自前でビルドした)vmglextのX11のモジュールを有効にすると動作しない?
  2. QEMU/KVMで内部VNCサーバを使用してパッチ済みのビューアで出力した場合について
  3. ゲスト用のXvncサーバについて

(自前でビルドした)vmglextのX11のモジュールを有効にすると動作しない?

ゲストOSのX.orgサーバ上で表示する場合にvmglextというXサーバの拡張モジュールを使用する。
ファイル名: /etc/X11/xorg.conf

Section "Module"
  (中略)
  Load "vmglext"
EndSection

のように、ゲストOSのX.orgサーバの設定ファイルの「Module」セクションに「vmglext」モジュールの読み込みをするように記述してXサーバを再起動し、ホストOS上で

host$ stub-daemon

このようにstub-daemonを実行してから${HOME}/.stub-daemon.logの最後に

Set GLSTUB var in guest to point to port 7000

このように表示されたポート番号を使用してゲストOSの環境変数GLSTUBを

guest$ export GLSTUB=[ホストのIPアドレス]:7000

のように設定*1してからOpenGLを使用したプログラムを実行することになるのだが

$ (OpenGLを使用したプログラムを実行)
X Error of failed request:  BadLength (poly request too large or internal Xlib length error)
  Major opcode of failed request:  145 (VMGLExt)
  Major opcode of failed request:  0 ()
  Serial number of failed request:  8
  Current serial number in output stream:  8

となってプログラムが開始後すぐに異常終了した。ゲストOSの/var/log/Xorg.0.logを見ると、モジュールの読み込み自体は正常に行われているようで、モジュール内の各種情報も表示されていた。しかし、X Errorに関する手がかりは一切なかった。
このモジュールを無効にすると動作はするが、仮想マシン上の通常のGUI上では、ウィンドウ内の表示が真っ黒になってしまい、使い物にならなかった。

画像はデモプログラムglxgearsを動かしているところで、ウィンドウ内の描画がされない点を除けば正常に動いていることが分かる。

QEMU/KVMで内部VNCサーバを使用してパッチ済みのビューアで出力した場合について

QEMU/KVM-vnc [未使用のディスプレイ番号]オプションを付けて内部のVNCサーバを使用し、VMGL付属のパッチ済みvncviewer*2で接続して試してみた。

$ vncviewer-vmgl 127.0.0.1:1
Connected to RFB server, using protocol version 3.7
No authentication needed
Desktop name "QEMU"
VNC server default format:
  32 bits per pixel.
  Least significant byte first in each pixel.
  True colour: max red 255 green 255 blue 255, shift red 16 green 8 blue 0
Warning: Cannot convert string "-*-helvetica-bold-r-*-*-16-*-*-*-*-*-*-*" to type FontStruct
Using default colormap which is TrueColor.  Pixel format:
  32 bits per pixel.
  Least significant byte first in each pixel.
  True colour: max red 255 green 255 blue 255, shift red 16 green 8 blue 0

Set GLSTUB var in guest to point to port 7002
Same machine: preferring raw encoding

上の場合(QEMU/KVMには-vnc :1オプションを付けている)、(「Set GLSTUB var ...」の)指示に従ってゲストOSの環境変数GLSTUBを

[ホストのIPアドレス]:7002

にする。
この状態で、vmglextモジュールを使用しない設定でOpenGLアプリケーションを実行すると

動作自体はしているようだが、おかしな表示になった(画像はSuperTuxKartを開始したところ)。vmglextを有効にするとやはりX Errorで失敗する。

ゲスト用のXvncサーバについて

VMGL付属のパッチ済みXvnc(サーバ)については、単独で起動してもSegmentation faultになるだけだった。
straceで見ると、/etc/localtimeを処理して閉じた後、munmap(戻り値0)を最後にSIGSEGVで落ちていた。
vncserverスクリプトを使用してもダメ(落ちているのだから当然ではある)。

# vncserver
Couldn't start Xvnc; trying default font path.
Please set correct fontPath in the vncserver script.
Couldn't start Xvnc process.

Unrecognized option: -kb
use: X [:<display>] [option]
(以下オプションのヘルプが続く)

正しく動作している画像は
blog.360.yahoo.com/blog-NwQyGmMneqg5NefTzt1niZcz?p=249 (リンク切れ)
にあったが、手元ではうまくいかなかった。

使用したバージョン:

  • VMGL 0.1
  • xorg-server 1.4.2
  • Sun xVM VirtualBox 2.0.6(x86_64向けバイナリ版の.runファイルを手動でインストールしたもの)
  • KVM 74

*1:tcshでは「setenv GLSTUB [ホストのIPアドレス]:7000」の形

*2:VMGLの覚え書き(パッケージのインストール)」で作成したRPMパッケージではvncviewer-vmglという名前の実行ファイルにしたもの