2017/01/03

x11vnc、Xvfb、Xdummy、VirtualGLの使いこごち

前回記事でリモートX環境を色々入れた。今記事ではその使い心地を簡潔にまとめる。

普通にgdm3へx11vncするとき
gdm3でautologin設定していない時には、まずログインするためのXへ接続する。
graphical.target状態で起動すると、vt7にdisplay :0でログイン待ちになっているので
以下の要領でx11vncを起動する。

$ sudo x11vnc -auth /run/user/117/gdm/Xauthority -display WAIT:0
117はgdmのUserID.
sudoするのは、まだログイン前なのでroot権限が必要だから。

VNCビュアーは、TurboVNCが推奨されている。TurboVNCはX11vncのためにオプティマイズされているからだ。

-display WAIT:0
ってすると、接続があった時に初めてx11vncを起動するように待つ。待っている間は
メモリもCPUも消費しないでいいわけだ。

接続してログインすると、この画面は真っ黒になる。なぜならログインユーザで新しいX11がvt2のdisplay :1で起動するから。
だからこの接続は速やかに終了して、サーバーで以下のコマンドを実行する

$ x11vnc -display WAIT:1
今度はsudoじゃなくていい。ゆーざ権限でXが起動しているから。
無事接続したX11デスクトップでは
$ glxinfo 抜粋
name of display: :1
display: :1 screen: 0
direct rendering: Yes
Extended renderer info (GLX_MESA_query_renderer):
Vendor: Intel Open Source Technology Center (0x8086)
Device: Mesa DRI Intel(R) HD Graphics 520 (Skylake GT2) (0x1916)
Version: 11.2.0
Accelerated: yes
Video memory: 3072MB
Unified memory: yes
Preferred profile: core (0x1)
Max core profile version: 3.3
Max compat profile version: 3.0
Max GLES1 profile version: 1.1
Max GLES[23] profile version: 3.1

のようにネイティブなドライバが使われているので、GPUがちゃんと使える。

ここまでで気に入らないのは、ログインがdisplay:0でユーザデスクトップがdisplay:1で、いちいち切り替えなければならないことだ。多分gdm側に共有するような設定があるのではないか?と思うが、もっと楽にやりたい。

gdm3でautologinにしてしまう
/etc/gdm3/custom.confの以下2行のコメントを外して、trueとユーザ名を入れる。
AutomaticLoginEnable = true
AutomaticLogin = ユーザ名


次回gdm3が起動する際にはこのユーザでログインした状態になっているので、
$ x11vnc -display WAIT:0
でユーザデスクトップに接続することになる。

こうすると大分簡略化されるがセキュリティ的には甘々になるので別の方法でセキュリティを確保する必要があるだろう。例えばsshトンネルとか。

$ x11vnc -localhost -display WAIT:0

これでlocalhostからのみ接続許可しかことになるので、リモート側からはsshトンネルで接続して、そのポートへVNC接続する。リモート側では

$ ssh user@hostname -L 5900:localhost:5900
-L以降をつけるとsshトンネルできる。これで接続後にlocalhost:5900へVNCする。

ここまでは物理ディスプレイのデスクトップをVNCする流れ。最大の利点は物理ディスプレイのミラーなのでネイティブなドライバが機能する点。欠点は
・リフレッシュレートが接続しているディスプレイに依存してしまうこと
・実際にディスプレイを接続しておく必要があること(EDIDを解決すれば別)
・解像度がディスプレイに依存すること
などなどなかなか難儀だ・・

ネイティブドライバを諦めさえすれば、かなりの自由が手に入る。

x11vnc + xvfb
xvfbはXorgの標準仮想フレームバッファドライバ。これを使って起動する場合

$ x11vnc -env FD_GEOM=1280x800 -env FD_PROG=gnome-session -create

って感じにする。仮想ディスプレイ解像度の指定はFD_GEOMで。デスクトップはFD_PROGで指定する。-createで新しい別のXorgを起動する。その時使われるデフォルトのドライバがxvfbになる。-createの代わりに-xvfbって指定してもいい。-display WAIT:cmd=FINDCREATEDISPLAY-Xvfbって指定したのと同じ効果がある。

ビデオドライバがXvfbで仮想化されるので自由度は高いが、GPUは使えない。3D描画はソフトウエアエミュレーションになる。
ネイティブドライバでは、GLES3.1が使えるが仮想ドライバはGLESは使用できなかったり、ES3.0までだったりデメリットがある。core profileは同じ3.3でGL Extensionも結構使えるのでGLとしてはさほど不自由はない。

x11vnc + Xdummy?
XDummyは結局 xfree86-video-dummyを使うためのスクリプト+プログラムなようなので
以下の手順で起動するのと同じこと。

#!/bin/bash

Xorg -noreset +extension GLX +extension RANDR +extension RENDER ¥
-logfile ~/.log/xdummy.log -config ~/.config/xdummy.conf :10 &

DISPLAY=:10 gnome-session &

x11vnc -display :10

色々試したが、上の感じのスクリプトで起動するのが良さそう。で肝心なのがここで使用している xdummy.conf だ。これはどこから持ってきたかというと、xpra.org/xorg.conf から。
編集箇所は、videoram容量とvirtual解像度だけ。

Xdummy経由で起動
$ Xdummy -prconf > xorg.conf
でconfファイルを出力させる。これを適当に編集して、先ほどのXorgの行を
sudo Xdummy -conf xorg.conf &
に書き換える。sudoしないとなぜかコアダンプしてしまう。何か間違っているのかも。

Xdummyの優位性は自分的には感じ取ることができなかった。標準のXvfbでいいかな。


VirtualGL
これは簡単な話で、XvfbとかXdummy(video-dummy driver)経由でXを使用するとドライバが仮想なためどうしてもGPUへのアクセスができない。これを解決するもの。

1つネイティブなXを起動しておいて、次に上記の要領で、XvfbかXdummyのXから
$ vglrun glxgears
とかやるとGLコマンドがvglrun経由でネイティブドライバで実行され、その結果を仮想側で見ることができる。

$ vglrun -d :0 -- glxheads
Display: 0x9a0c90
Window: 0x1a00002
Context: 0x9c1470
GL_VERSION: 3.0 Mesa 11.2.0
GL_VENDOR: Intel Open Source Technology Center
GL_RENDERER: Mesa DRI Intel(R) HD Graphics 520 (Skylake GT2)
とネイティブドライバ側で動いていことが分かる。これは一瞬オォって思う。
しかし残念なことに、VirtualGLが解釈できるGLコマンドしかだめだ。
そのためか、GLESドライバとしては機能しない。

以上色々試したが、x11vncでネイティブミラーする以外は仕事では微妙に使えないなというのが結論。x11vncでディスプレイミラーの欠点は、ディスプレイ依存の問題が一番。
これを解決する方が一番自分の希望に近いようだ。EDIDエミュレータを自作するのがいいかな。

2016/12/28

x11vnc、Xvfb、Xdummy、VirtualGL とか

最終的には、HeadlessでRemoteで仮想VMも全部がGPUアクセラレーションが機能するようにしたいわけだが、ひとまずはx11vncとその周辺から。

gdm + gnome-session
前回までのセットアップでは、Xを手動でstartxして起動していたが、実験の意味もあり
GDMを入れることにした。

lightdmを最初に入れたが、なぜかログインできず。原因がXAuthorityパーミンションでもなく、解決困難だったため lightdm をやめて gdm に切り替えた。

$ sudo apt install gdm
これだけでXorgでgdmが自動起動するようになる。gnome-sessionも同時に入る。

$ sudo systemctl stop gdm
ってやってもXが止まってくれない。defaultがgraphical.targetだからかな。。

gdm 常時offにしたい時
$ sudo systemctl set-default multi-user.target してリブート

gdm 常時onにしたい時
$ sudo systemctl set-default graphical.target してリブート

$ systemctl get-defaultで
multi-user.targetとなっている場合は、systemctl start/stop gdmがうまく動く。

x11vnc
これを使うと、物理ディスプレイのXをVNCでミラーリングできる。物理ディスプレイをリモート操作できるっていう代物。
$ sudo apt install x11vnc

別のホストPCで使っているvnc4serverとかは仮想XドライバなのでGPUが機能しない。
GPUイネーブルなドライバが機能するのは、ディスプレイデバイスに接続されているX環境だけなのだ。正確には物理GPUアクセス可能なネイティブなビデオドライバが動くX環境。

x11vncは以下のXvfbやDummyと組み合わせて使うとより自由度が高まる。

Xvfb
Xの仮想フレームバッファドライバ。残念ながら3DはMesaで3DHWは使えない。
仮想X環境をいくつも簡単に作れるので便利ではある。
$ sudo apt install xvfb

XDummy
これはスクリプトと説明されているけれど、プログラムソースコードが含まれている。
これを動かすためには、dummyビデオドライバとgccやclangなどのコンパイラが必要。
$ sudo apt install xserver-xorg-video-dummy
$ sudo apt install clang
$ XDummy install

すると、スクリプト内に含まれているプログラムがコンパイルされて~/bin/xdummy.so が作られる。
これがx11vncが起動するXの仮想ドライバになる・・・のかな?・・・

XDummyスクリプトを通して、このxdummy.soを使うとdlsymがundefinedだとかでエラー。

XDummy スクリプトで cc でコンパイルしている行に" -ldl" を追加して再度実行。
ユーザレベル起動だとハング!!

$ sudo XDummy :0
でやっと動いた。rootじゃなくても動くようになったと書いてあったけどなぁ。
なにかやり忘れているのかもしれないが、ちゃんとした説明がなく、-help 頼み。

org-video-dummyのdummyドライバを使ったXorg起動とこのxdummy.soは関係あるのか、ないのかイマイチ体感できず。

XDummyはXvfbよりちょっとだけ優れているのだそうな。RandRとGLX extensionsが機能することと、2Dパフォーマンスがいいらしいが、結局仮想ドライバなので、GLXはソフトエミュ。

x11vnc設定ファイル
x11vncには山ほどのオプション設定がある。sshトンネル経由とか。。把握しきれない。
色々物色して、.x11vncrcと言う名前のファイルにオプションの'-'外して羅列することで設定できるとわかり、色々実験した結果、自分なりの.x11vncrcは以下の通り。

.x11vncrc の内容
usepw
nonc
shared
noxrecord
noxdamage
noxfixes
norc
xkb
repeat
scr_keyrepeat 4-10
o x11vnc.log
usepwで初回起動でpw設定できる。いちいち-storepasswordとかやらなくていい。
あとはだいたいお決まりオプション。

VirtualGL
これはXGLなアプリをこのツールを通して実行することで、GPUイネーブルなドライバが動いているXでGLコマンドを実行させて出力イメージを転送表示するツールみたいなもの。

Linux Packages からvirtualglのdebパッケージをダウンロード
$ sudo dpkg -i debファイル

vglrunとか、vgl**なコマンドが使えるようになる。
vglconnectやvglclientとかは、より遠方のX端末同士をつなぐ時に使うみたい。
自分がやりたいこととは若干違ったので、vglrunだけ試してみた。


2016/12/10

Ubuntu16.04 intel-graphics-update-toolでドライバインストール

久々の投稿です。

Intel Skylakeアーキテクチャーのセットトップボックス Beebox-S 6200U/B/BB を買ってしまった。愛用中のShuttle DS57Uはサーバーに徹しているので、今回のBeeboxはデスクトップ環境で使っていこうと思う。


自分のBeebox-sの構成は、CPU Core-i5 6200U(Intel Graphics HD 520)、メモリ 16GB、ストレージ SATA-SSD 256GB + M.2-SSD 512GB。
ストレージデバイスを2つ内蔵できるのがいい。デュアルブートにしたかったので。
All SSDなので、ファンレスでOK。Shuttle DS57U並みに静音です。


Ubuntu16.04 Serverインストール
Desktopインストールではない。後で色々やりたいことがあるんで、gdmとか使わない。
インストーラで、Virtual Machine HostとOpenSSHにチェックを入れてインストール。
その後はおきまりの手順。
$ sudo apt update
$ sudo apt upgrade
$ sudo apt dist-upgrade

そうそう、Ubuntu14.04を入れようと思ったけど、構成が新しすぎなのか、ネットワークデバイスが認識されなかった。

X環境インストール
$ sudo apt install ubuntu-desktop とかで入れちゃうとgdmとかがセットアップされてしまうので、バラで入れていきます。

$ sudo apt install xserver-xorg-video-intel
$ sudo apt install xfonts-100dpi xfonts-75dpi xfonts-scalable
$ sudo apt install xserver-xorg
$ sudo apt install xinit

startsで素のXが起動する段階。

Xfce4 デスクトップ環境インストール

$ sudo apt install xfce4 xfce4-goodies

$ sudo apt install fonts-takao-pgothic fonts-takao-gothic fonts-takao-mincho
で、日本語フォントも入れる。
startxすると綺麗なXfce4デスクトップでXが動く。

Intelグラフィックスドライバインストール

ちょっと前までは、intel-graphics-installerがUbuntu15.10までしか対応していなくて難儀していた感がありましたが、今はintel-graphics-update-toolに改名され、16.04にも対応しました。
ここの 2.0.2 の方を使います。2.0.3は、16.10用です。

$ sudo apt install fonts-ancient-scripts
$ sudo apt install libpackagekit-glib2-18
$ sudo dpkg -i intel-graphics-update-tool_2.0.2_amd64.deb (ダウンロードしたやつ)

Xサーバー起動してドライバセットアップ
$ startx
$ sudo intel-gaphics-update-tool

で起動したインストーラウイザードに沿ってドライバインストールして再起動。

ちゃんと入ったかな?
$ sudo apt install mesa-utils
$ glxinfo | grep Device
  Device: Mesa DRI Intel(R) HD Graphics 520 (Skylake GT2) (0x1916)
よし。

$ glxinfo | grep version
server glx version string: 1.4
client glx version string: 1.4
GLX version: 1.4
    Max core profile version: 3.3
    Max compat profile version: 3.0
    Max GLES1 profile version: 1.1
    Max GLES[23] profile version: 3.1
OpenGL core profile version string: 3.3 (Core Profile) Mesa 11.2.2
OpenGL core profile shading language version string: 3.30
OpenGL version string: 3.0 Mesa 11.2.2
OpenGL shading language version string: 1.30
OpenGL ES profile version string: OpenGL ES 3.1 Mesa 11.2.2
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.10

ふむ。3.3ですか。4.xなら良かったのに。GLES3.1はちょっと嬉しいかも。

ということで、このマシンではGPU関係のことを中心にいろいろと遊ぶ予定です。