1. 项目概述
在嵌入式开发和机器人操作系统(ROS)开发过程中,我们经常需要远程访问Ubuntu系统的图形界面。Ubuntu 22.04默认使用Wayland显示服务器,虽然支持RDP远程连接,但存在一个致命缺陷:必须连接物理显示器才能正常工作。这对于无头服务器(headless server)或远程工作站来说非常不便。
TigerVNC提供了一种优雅的解决方案,它通过创建独立的X会话(通常搭配轻量级Xfce桌面环境),完全摆脱了对物理显示器的依赖。我在多个ROS和SLAM开发项目中采用这种配置,特别是在NVIDIA Jetson等嵌入式平台上,效果非常稳定。
2. 环境准备与依赖安装
2.1 系统更新与基础软件包
首先确保系统是最新的,然后安装必要的软件包:
bash复制sudo apt update && sudo apt upgrade -y
sudo apt install -y tigervnc-standalone-server tigervnc-common xfce4 xfce4-goodies
这里选择TigerVNC而不是其他VNC实现(如RealVNC或TightVNC)有几个重要原因:
- TigerVNC是专为高性能设计的开源实现,特别适合嵌入式设备
- 它支持24位真彩色和多种压缩算法
- 与Xfce桌面环境配合使用时资源占用极低
2.2 VNC密码设置
首次运行VNC服务器时需要设置访问密码:
bash复制vncserver
注意:VNC密码长度限制为8个字符,超出部分会被截断。这是VNC协议本身的限制。如果需要更高安全性,建议结合SSH隧道使用。
3. 配置虚拟桌面环境
3.1 创建Xfce启动脚本
Xfce是一个轻量级桌面环境,非常适合远程访问场景。我们需要创建启动脚本:
bash复制mkdir -p ~/.vnc
cat > ~/.vnc/xstartup << 'EOF'
#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
export XDG_RUNTIME_DIR=/run/user/$(id -u)
exec /usr/bin/xfce4-session
EOF
chmod +x ~/.vnc/xstartup
这个脚本做了几件关键事情:
- 清理可能干扰的环境变量
- 设置正确的运行时目录(注意使用
$(id -u)自动获取用户ID) - 启动Xfce会话
3.2 测试VNC连接
启动VNC服务器进行测试:
bash复制vncserver :1 -localhost no -geometry 1280x720 -depth 24
参数说明:
:1:指定显示编号1(对应端口5901)-localhost no:允许非本地连接(仅限安全内网)-geometry:设置虚拟显示器分辨率-depth:颜色深度(24位真彩色)
安全提示:在生产环境中,强烈建议使用
-localhost yes配合SSH隧道访问:
ssh -L 5901:localhost:5901 user@remote_host
4. 客户端连接配置
4.1 推荐VNC客户端
虽然可以使用任何VNC客户端,但我推荐以下两种:
- RealVNC Viewer:跨平台支持好,性能优秀
- Remmina:Linux原生客户端,支持多种协议
连接时使用格式:<服务器IP>:1(其中1对应显示编号)
4.2 分辨率适配技巧
如果客户端显示器与服务器设置的分辨率不匹配,可以:
- 使用
-geometry参数动态调整 - 在Xfce设置中启用桌面缩放
- 使用客户端缩放功能(可能影响画质)
5. 系统服务配置
5.1 创建systemd服务
为了让VNC服务器开机自启,创建系统服务:
bash复制sudo tee /etc/systemd/system/tigervncserver.service > /dev/null <<'EOF'
[Unit]
Description=TigerVNC Server
After=network.target
[Service]
Type=forking
User=$USER
Group=$USER
WorkingDirectory=$HOME
PIDFile=$HOME/.vnc/%H:1.pid
ExecStartPre=-/usr/bin/vncserver -kill :1
ExecStart=/usr/bin/vncserver :1 -localhost no -geometry 1280x720 -depth 24
ExecStop=/usr/bin/vncserver -kill :1
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
注意替换
$USER和$HOME为实际值,或直接使用你的用户名
5.2 服务管理命令
启用并启动服务:
bash复制sudo systemctl daemon-reload
sudo systemctl enable tigervncserver.service
sudo systemctl start tigervncserver.service
检查服务状态:
bash复制sudo systemctl status tigervncserver.service
6. 高级配置与优化
6.1 多用户配置
如果需要支持多个用户同时连接:
bash复制vncserver :2 -localhost no -geometry 1280x720 -depth 24
每个显示编号对应一个独立会话,端口号计算方式为:5900 + 显示编号
6.2 性能调优
对于嵌入式设备(如Jetson系列),可以添加以下参数:
bash复制vncserver :1 -localhost no -geometry 1280x720 -depth 24 \
-dpi 96 -noxstartup -SecurityTypes None
参数说明:
-dpi:设置合适的DPI值-noxstartup:禁用不必要的启动项-SecurityTypes None:在内网环境中提高性能(仅限安全网络)
6.3 虚拟显示器配置
对于完全没有GPU的设备,可能需要配置虚拟显示器:
bash复制sudo apt install -y xserver-xorg-video-dummy
然后创建Xorg配置文件:
bash复制sudo tee /etc/X11/xorg.conf.d/10-dummy.conf > /dev/null <<'EOF'
Section "Device"
Identifier "DummyDevice"
Driver "dummy"
VideoRam 256000
EndSection
Section "Screen"
Identifier "DummyScreen"
Device "DummyDevice"
Monitor "DummyMonitor"
DefaultDepth 24
SubSection "Display"
Depth 24
Modes "1280x720"
EndSubSection
EndSection
EOF
7. 常见问题排查
7.1 连接黑屏问题
如果连接后看到黑屏,可能是:
- Xfce未正确启动 - 检查
~/.vnc/xstartup权限和内容 - 权限问题 - 确保
~/.vnc目录属主正确 - 显示服务器冲突 - 确保没有其他VNC服务在运行
7.2 性能优化
如果遇到卡顿:
- 降低颜色深度:改用
-depth 16 - 调整压缩级别:添加
-compresslevel 6 - 减少画面更新频率:客户端设置质量优先
7.3 系统资源监控
使用以下命令监控VNC服务资源占用:
bash复制watch -n 1 "ps aux | grep Xtigervnc | grep -v grep"
典型内存占用应该在100-300MB之间,取决于桌面环境复杂度。
8. ROS开发特别配置
对于ROS开发环境,建议额外安装:
bash复制sudo apt install -y ros-humble-desktop
然后在Xfce中创建快捷启动器,指向常用ROS工具:
- RViz
- rqt_graph
- Gazebo
配置环境变量:
bash复制echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
echo "export ROS_MASTER_URI=http://localhost:11311" >> ~/.bashrc
9. 安全加固建议
- 防火墙配置:
bash复制sudo ufw allow from 192.168.1.0/24 to any port 5901
- SSH隧道替代:
bash复制ssh -L 5901:localhost:5901 user@remote_host
- 定期更换密码:
bash复制vncpasswd
- 日志监控:
bash复制sudo journalctl -u tigervncserver.service -f
10. 实际应用案例
在SLAM开发中,这套配置特别有用:
- 远程调试建图过程
- 实时监控算法运行状态
- 多设备集中管理
我在多个移动机器人项目中使用这种配置,通过VNC可以:
- 实时查看RTAB-Map的3D建图过程
- 监控ORB-SLAM的特征点匹配
- 调整Cartographer的参数并立即观察效果
对于需要长期运行的SLAM任务,建议使用tmux或screen保持会话,即使VNC断开也不影响任务执行。