VNCでOpenGL APplicationsを飛ばす on Ubuntu16.04 with Nvidia GPU
Prerequisites
- Ubuntu 16.06
- Nvidia GPU
- proper driver (e.g. nvidia-410)
- lightdm
- xfce 4
考え方
- 本物のX (Xorg) 以外でOpenGL applicationを動かす際には、VirtualGLなる(そのまんまな名前な)ミドルウェアが必要
- VirtualGLを上手く動かすには、(renderingのための?)本物のXが起動している必要がある
- 大抵、display managerがうまくうごいていればよい
- DISPLAYに表示先のidentifierを、VGL_DISPLAYに本物のdisplayのidentifierを設定する
手順概要
- VNCサーバ (TurboVNC) をリモートマシンにインストールする
- VirtualGLをリモートマシンにインストールする
- vglserver_config で設定をする
- ${HOME}/.vnc/xstartup.turbovnc を設定する
- Nvidiaが提供しているツールでXorgの設定をする(xrog.confの生成)
- クライアントでVNCクライアントを起動する
- vglrun ${opengl application}
- 困ったらDISPLAY, VGL_DISPLAY環境変数をみてみる
初期設定手順
$ sudo apt install -y turbovnc virtualgl $ vi ${HOME}/.vnc/xstartup.turbovnc# xfceが立ち上がるように書いたが、おそらくなんでもよい $ cat ${HOME}/.vnc/xstartup.turbovnc# WMを探すコードを取り除き、xfceを起動する行を追加。Gnomeのなにかがあり、これは関係なさそうだがとりあえず残しておいた #!/bin/sh unset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS XDG_SESSION_TYPE=x11; export XDG_SESSION_TYPEThis works around pointer disappearance issues under GNOME 3
if [ -x /usr/bin/dconf ]; then dconf write /org/gnome/settings-daemon/plugins/cursor/active false fi OS=`uname -s` if [ $OS = 'Linux' ]; then case "$WINDOWMANAGER" in *gnome*) if [ -e /etc/SuSE-release ]; then PATH=$PATH:/opt/gnome/bin export PATH fi ;; esac fi startxfce4 $ sudo nvidia-xconfig $ /opt/VirtualGL/bin/vglserver_config# ウィザードに従って設定をする $ systemctl restart lightdm# このへんで適当にDMを再起動。意味があるのかは不明。
つかいかた
- リモートマシンにログインし、vncserverコマンドを実行する
- Xorgが起動しているかを確認する (ある環境の場合、lightdmが正しく起動しているか確認する)
/opt/TurboVNC/bin/vncserver :2# :2の部分は適当に変更する。lightdmが何故か:1で起動するようになってしまい、ちょっときもちわるい。
- クライアントマシンからVNC Client App でリモートマシンに接続
- URI: ${remote machine IP address}:${Display Number (e.g. :2)}
- いくつかのアプリではポート番号はポート番号を指定しないといけないかも。デフォルトだと5900 + (display number)
- リモートデスクトップ上でターミナルを開き、vglrunを通してコマンドを実行
vglrun ${application}
感想
- Gazeboをremoteで動かしてrender結果を(リアルタイムに)localに持ってきたかった
- Gazeboはそれ自体がサーバー・クライアント分離に対応しているが、サーバのGazeboとクライアントのGazeboのバージョンが完全に一致していないといけない。Debianの公式リポジトリとUbuntuの公式リポジトリのバージョンが合うことは(ほぼ)無いので、しんどい。
- Gazeboのサーバ・クライアントが通信するにはhttps://wiki.ros.org/ROS/NetworkSetupが必要っぽいので、remote serverでdockerコンテナを動かす方法は簡 単には行かない(ソースはROSの話だがGazeboも一緒だろう)。
- VNCで持ってこようとするとOpenGLが使えなくてなんとかと言われるので、VirtualGLを入れるなどしていろいろやるが、"Xlib: extension "GLX" missing on display ":1""と言われてGazeboが一瞬起動して死ぬ
- (こちらのローカルなミスで) xorg.confが消えていた(正確に言うとバックアップしか残っていなかった)ので、GLとWindowの連携が不可能だったと思われる。
- nvidia-xconfigコマンドでxorg.confを再生成して解決。