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_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を再生成して解決。