VNCでOpenGL APplicationsを飛ばす on Ubuntu16.04 with Nvidia GPU

VNCOpenGL APplicationsを飛ばす on Ubuntu16.04 with Nvidia GPU

Prerequisites

考え方

  • 本物の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}

初期設定手順

 $ 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_TYPE
 
 # This 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を再生成して解決。