Xvfb - 仮想フレームバッファ
Java 上で利用できるほとんどの画像操作用ライブラリは Java 標準の AWT をベースにしている。Unix 上で AWT を使用するためには X が起動されていなければならないが、サーバ用途の Unix ではそもそも GUI 環境がインストールされていないこともある。X が起動されていない状態で強引に AWT を利用しようとすれば以下のようなエラーが出るだろう。
| torao@cobalt$ java Awt Exception in thread "main" java.lang.InternalError: Can't connect to X11 window server using ':0.0' as the value of the DISPLAY variable. at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method) at sun.awt.X11GraphicsEnvironment.<clinit>(X11GraphicsEnvironment.java:63) at java.lang.Class.forName1(Native Method) at java.lang.Class.forName(Class.java:134) at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:64) at java.awt.Window.<init>(Window.java:191) at java.awt.Window.<init>(Window.java:233) at java.awt.Frame.<init>(Frame.java:318) at java.awt.Frame.<init>(Frame.java:297) at Awt.<init>(Awt.java:5) at Awt.main(Awt.java:9) torao@cobalt$ |
もちろんこれは AWT から X にアクセスしようとして失敗しているのが原因だ。サーバ用途のマシンで常に X を立ち上げた状態にしておくというのは非常に無駄な話でもあるわけだが、AWT はサムネールやグラフなどの画像を作成するような場合に必要になってくる。
ここでは Xvfb (X Virtual Frame Buffer / 仮想フレームバッファ) と呼ばれているライブラリを導入してみよう。Xvfb は仮想的な X フレームバッファのみの環境を構築するため、X が起動していないマシンでも X のライブラリを使用するためのものだ。これさえ起動しておけばコンソールだけのサーバマシンでも AWT を使用した画像処理を行うことが出来るようになる。
◆ インストール
大抵の Linux はインストール時に Xvfb を選択することが出来るようになっているが、ほとんどはデフォルトでチェックが外れているので、意図的に入れなければ入ってないだろう。後から入れるのであれば、まずインストールに使用した CD-ROM に Xvfb の RPM が入っていないかを探すのが無難だ。また、最近の Linux では GUI メニューから 「アプリケーションの追加/削除」 でも追加できるようだ。
このほかに XFree86 のサイトからダウンロードすることもできる 。実行環境によっていくつか適切なバージョンがあるようだが、例えば glibc-2.1 を使用しているのであればftp://ftp.xfree86.org/pub/XFree86/4.0.1/binaries/Linux-ix86-glibc21/ から Xvfb.tgz をダウンロードするといった具合だ。このファイルを解凍すると /bin/Xvfb という実行ファイルが作成されるので、これを /usr/X11R6/bin に放り込む。
◆ Xvfb の起動
早速 Xvfb を起動してみよう。コマンドラインから以下のように入力する。
|
root@sapphire$ export DISPLAY="localhost:1.0" |
デフォルトのフォントが見つからないというようなエラーが出ているが、どうやら起動したようだ。引き続き本当に AWT が動作するかどうかテストしよう。
テスト用に以下のような画像縮小用 Java アプリケーションを作成した。コマンドライン引数 1 で指定された画像を 100x100 の大きさに縮小して引数 2 のファイルに保存する。もちろんこれは X が起動していなければエラーになってしまう。
|
public class Jpeg{ |
|
root@sapphire$ java Jpeg img.1.jpg img.2.jpg |
プロセスの状態を見るとだいたい 3.5MB 程度で常駐しているようだ。
◆ XVfb の自動起動設定
Xvfb は画像を扱う Java よりも前に起動しておく必要がある。Tomcat などのような常駐型だけでなく、通常の Java アプリケーションでも AWT の機能を利用できるように、Linux の起動と同時に XVfb も起動するように設定してみよう。
Linux マシン上で root ユーザになり /etc/rc.d/init.d/ ディレクトリの直下に xvfb というファイルを作成する。
|
#!/bin/bash # Source function library. prog=$"Xvfb" # Xvfb program start() { stop() { # See how we were called. |
ファイルを作成したら実行権限を与えて実際に実行してみよう。
|
root@sapphire$ chmod 755 xvfb |
実行できることが確認できたら chkconfig コマンドを用いてシステム起動時に xvfb が起動するよう設定を行う。chkconfig --list で xvfb がランレベル 3 でオンになっていることを確認。
|
root@sapphire$ chkconfig --add xvfb |
以上でシステム起動時と同時に XVfb を起動するための操作は終了。ここで実際にマシンを再起動してちゃんと起動するかどうか確認を行っておくと良いだろう。
◆ Tomcat シェルの設定
Tomcat から AWT の処理を利用するためには環境変数 DISPLAY を定義しておかなければいけない。Tomcat 4 は /usr/bin/dtomcat4 スクリプトから起動するため、このファイルの先頭に設定を加えておきます。
|
… |
◇ 検証環境
|
JDK 1.4 + Linux+ IA32 |
※J2SE 5.0 で XAWT の実装が X11 になるべく依存しない方針で修正され、画像の操作程度であれば仮想フレームバッファは必要なくなりました。