CUBE SUGAR CONTAINER

技術系のこと書きます。

Xvfb を使って仮想ディスプレイを作る

Xvfb (X virtual framebuffer) は X Window System の仮想ディスプレイを作ることのできるソフトウェア。 これを使うと実際にスクリーンがない状態でも GUI が必要なソフトウェアを使えるようになる。

今回使う環境には CentOS7 を選んだ。

$ cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
$ uname -r
3.10.0-327.3.1.el7.x86_64

下準備

まずは GUI を必要とするソフトウェアとして Firefox をインストールしておく。

$ sudo yum -y install firefox ipa-{,p}gothic-fonts ipa-{,p}mincho-fonts

次にランレベルを確認しておく。 単なるマルチユーザモードなので、通常であれば GUI は使えない。

$ systemctl get-default
multi-user.target

もちろん、この状態で Firefox を起動しようとしてもディスプレイがないよとエラーになる。

$ firefox
Error: no display specified

この状態で Firefox が使えるようになるところを目指す。

Xvfb を使う

まずは Xvfb をインストールする。

$ sudo yum -y install xorg-x11-server-Xvfb

次に Xvfb コマンドで仮想ディスプレイを作成する。 引数には仮想ディスプレイの番号として「:1」を指定する。 このコマンドは実行するとそのまま動き続ける。

$ Xvfb :1 -screen 0 1024x768x24

別のターミナルを開いて環境変数 DISPLAY に先ほど作成した仮想ディスプレイを指定する。

$ export DISPLAY=:1

この状態で Firefox を起動すると、先ほどとは異なり何やら実行されている風な出力がされている。

$ firefox
Xlib:  extension "RANDR" missing on display ":1".
GLib-GIO-Message: Using the 'memory' GSettings backend.  Your settings will not be saved or shared with other applications.
console.error:
  [CustomizableUI]
  Custom widget with id loop-button does not return a valid node
console.error:
  [CustomizableUI]
  Custom widget with id loop-button does not return a valid node

次はこの仮想ディスプレイに映しだされている内容を確認することにしよう。

仮想ディスプレイの内容を確認する

xwd というツールを使うとディスプレイのスクリーンショットが撮れるのでインストールする。

$ sudo yum -y install xwd netpbm-progs

仮想ディスプレイを指定して xwd コマンドでスクリーンショットを撮る。 そのままだと xwd フォーマットという通常の画像ファイルではないので、これを png フォーマットに直して保存する。

$ xwd -display :1 -root | xwdtopnm | pnmtopng > screenshot.png

こんな感じで撮れた。 f:id:momijiame:20160103115308p:plain

Xvfb を使えば CI 環境などでディスプレイなしにテストができそうだ。