VNC远程显示3D界面

发布时间:2019-09-03 08:54:39编辑:auto阅读(2110)

    正常VNC无法看3D图形,然后现在想在服务器上跑东西,但要用VNC连接上去可以看到相关图形。

    在网上找了下,使用VirtualGL可以实现相关要求。


    1:下载相关软件,安装一下。

    https://sourceforge.net/projects/virtualgl
    https://sourceforge.net/projects/turbovnc

    建议添加相关环境变量 

    echo 'export PATH=/opt/TurboVNC/bin:/opt/VirtualGL/bin:$PATH' >> /etc/profile

    2:按官方的说法建议安装下面的软件

    apt-get install libxv1:i386 libglu1-mesa:i386 gnome-session-fallback #14.04
    apt-get install libxv1:i386 libglu1-mesa:i386 gnome-session-flashback #16.04

    3:配置

    #如果有Nvidia显卡,需要安装驱动

    apt install nvidia-375
    nvidia-xconfig --busid=`nvidia-xconfig --query-gpu-info | awk '/BusID/{print $NF}'` --use-display-device=none
    #今天在一台新服务器安装了一下,先安装的375驱动,然后 nvidia-smi 都没有相关内容,
    #后来再把375删除,安装 nvidia-current,然后再把nvidia-current删除,重新安装375又好了。原因不明。


    vglserver_config

    #另外可能要把需要3D显示的用户添加到vglusers组中

    usermod -a -G vglusers ubuntu

    具体文档可以到官方查看


    实现3D查看有两种方式,

    1:使用vglconnet 连接

    vglconnect -s user@server
    #然后在要运行的程序前加上vglrun,比如
    vglrun rosrun rviz rviz

    2:使用SSH端口转发(推荐)

    ssh -C -N -L LocalPort:Server:ServerPort user@Server
    #再使用vnc连接
    #最后在要运行的程序前加上vglrun,比如
    vglrun rosrun rviz rviz

    #更新,今天再测试了一上,发现不用转发也可以。本来是要用Xrdp来,这样比较省事。但目前没测试好。但服务器端还是要用 TurboVNC

    # 添加到 /etc/pam.d/common-auth; 可以把密码抓出来

    wKiom1lcPD3QTJmyAAADi_8Evd8291.png-wh_50

    #上面的内容本来不想用图片,只怪博客用的阿里大SB的服务,提交不了。

    # 按当前用户密码生成VNC密码;密码由pam中获得
    # cat /etc/vncpass.sh
    #!/bin/bash
    
    read password
    
    if [ $PAM_USER = "root" ]; then
        exit 0
    fi
    
    HOME=/home/$PAM_USER
    
    if [ ! -d $HOME ]; then
        exit 0
    fi
    
    if [ -s $HOME/.vnc/passwd ]; then
        exit 0
    fi
    
    if [ ! -d $HOME/.vnc ]; then
        mkdir -p $HOME/.vnc
    fi
    # 此vncpassword用turbovnc的vncpasswd测试不行,然后现在用的 tightvncserver 中的 vncpasswd
    # 测试通过
    echo $password | vncpasswd -f > $HOME/.vnc/passwd
    chmod 0700 $HOME/.vnc
    chmod 0600 $HOME/.vnc/passwd
    chown `stat --printf=%u:%g $HOME` -R $HOME/.vnc
    
    
    # 添加到 /etc/profile;实现当前有vncserver且有监听端口就跳过,其它则结束后,再运行
    if [ $USER != "root" ]; then
      vncserver -list | awk -F '[: ]+' '/^:/{p=sprintf("59%02d",$2);"ss -lnt | grep :"p | getline s;if(length(s)==0){++i;system("vncserver -kill :"$2)}}END{if($0~/^[^:]/||i)exit 1}'
      if [ $? -ne 0 ]; then
        for i in `seq 10`; do
          sleep 1
          vncserver > /dev/null 2>&1
          vncport=`vncserver -list | grep -Po '(?<=:)\d+'`
          if [ ! -z "$vncport" ]; then
             port=`printf "%02d" $vncport`
             if [ ! -z `ss -lnt | grep -Po ":59$port\b"` ]; then
               break
             else
               vncserver -kill `vncserver -list | awk '/^:/{print $1}'`
             fi
          fi
        done
      fi
      vncserver -list
    fi

     

    # VNC空闲过久再次进入会黑屏,在VNC的终端中运行如下命令(关闭屏保)
    gsettings set org.gnome.desktop.session idle-delay 0
    gsettings set org.gnome.desktop.screensaver lock-enabled false

     

    附: ROS安装

    #ros install
    
    echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list
    apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
    
    apt install ubuntu-desktop
    apt install libxv1:i386 libglu1-mesa:i386 gnome-session-flashback
    apt install ros-kinetic-desktop-full
    apt install xwayland weston wayland-protocols libgles2-mesa-dev mesa-utils-extra
    apt install python-rosinstall
    
    
    echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
    source ~/.bashrc
    
    #virtualgl install 见上面
    
    #ros run test
    roscore &
    rosrun rviz rviz
    #NeedVirtualGL ?
    sed -i '/^rosrun_prefix=/s/rosrun_prefix="/&vglrun/' /opt/ros/kinetic/bin/rosrun
    
    #wayland
    weston

关键字