VNCでOpenGL APplicationsを飛ばす on Ubuntu16.04 with Nvidia GPU
VNCでOpenGL APplicationsを飛ばす on Ubuntu16.04 with Nvidia GPU
考え方
手順概要
初期設定手順
$ 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を再生成して解決。