Jetson Nano - 如何实现VNC远程桌面控制

Jetson Nano - 如何实现VNC远程桌面控制

本文教你如何实现VNC到你的Jetson Nano,这样就不需要连接屏幕来实现远程桌面控制啦。

树莓派官方系统默认是安装了RealVNC的服务,只需在电脑上到RealVNC官方下载软件VNC Viewer,即可方便VNC实现树莓派远程桌面控制。然而……Jetson Nano就没这么直接了。

事不宜迟,以下是搭建VNC服务的正式教程:

1. 安装VNC服务

首先在Jetson Nano桌面以下快捷键打开终端: Ctrl + Alt + T

或,通过ssh远程到Jetson Nano的代码行,输入以下代码:

sudo apt update
sudo apt install vino

2. 搭建VNC服务程序

到用户主目录下,新创建bash执行文件

cd
nano openvino

进入nano界面,将以下代码复制到新建文本下:

#!/bin/bash
export DISPLAY=:0
gsettings set org.gnome.Vino enabled true
gsettings set org.gnome.Vino prompt-enabled false
gsettings set org.gnome.Vino require-encryption false
/usr/lib/vino/vino-server &

然后快捷键,保存文本: Ctrl + x

回到终端,修改openvino文件权限为可执行,并执行

chmod +x ~/openvino
sudo reboot

重启一下Jetson Nano

3. 开启VNC服务

重新进入Jetson Nano的命令行,运行程序,开启VNC服务

~/openvino

(提示:以后每次开启系统或关闭VNC服务之后,需要运行此口令重新开启VNC服务)

报出提示“No such key “enabled”,忽略… 并如无意外出现以下运行提示:

jetson@jetson:~$ 18/11/2019 13时39分54秒 Autoprobing TCP port in (all) network interface
18/11/2019 13时39分54秒 Listening IPv6://[::]:5900
18/11/2019 13时39分54秒 Listening IPv4://0.0.0.0:5900
18/11/2019 13时39分54秒 Autoprobing selected port 5900
18/11/2019 13时39分54秒 Advertising security type: 'TLS' (18)
18/11/2019 13时39分54秒 Re-binding socket to listen for VNC connections on TCP port 5900 in (all) interface
18/11/2019 13时39分54秒 Listening IPv6://[::]:5900
18/11/2019 13时39分54秒 Listening IPv4://0.0.0.0:5900
18/11/2019 13时39分54秒 Clearing securityTypes
18/11/2019 13时39分54秒 Advertising security type: 'TLS' (18)
18/11/2019 13时39分54秒 Clearing securityTypes
18/11/2019 13时39分54秒 Advertising security type: 'TLS' (18)
18/11/2019 13时39分54秒 Advertising authentication type: 'No Authentication' (1)
18/11/2019 13时39分54秒 Re-binding socket to listen for VNC connections on TCP port 5900 in (all) interface
18/11/2019 13时39分54秒 Listening IPv6://[::]:5900
18/11/2019 13时39分54秒 Listening IPv4://0.0.0.0:5900
18/11/2019 13时39分54秒 Clearing securityTypes
18/11/2019 13时39分54秒 Clearing authTypes
18/11/2019 13时39分54秒 Advertising security type: 'TLS' (18)
18/11/2019 13时39分54秒 Advertising authentication type: 'No Authentication' (1)
18/11/2019 13时39分54秒 Advertising security type: 'No Authentication' (1)

以上代表我们的VNC服务已经成功开启!

按Ctrl + c可返回口令行,继续进行其他口令操作 (这不会关闭VNC服务的,其进程已在后台持续运行当中)

3. 取得IP地址

ifconfig | grep -A 1 wlan0

## 得到以下信息:
wlan0: flags=4163  mtu 1500
        inet 192.168.199.119  netmask 255.255.255.0  broadcast 192.168.199.255

以上inet后面的192.168.199.119就是小编Jetson nano的ip地址

4. 打开VNC Viewer

接下来可以到我们电脑下载并打开VNC Viewer了 跳出安全提示,按continue继续, 看到用户界面了,成功!

如果出现以下提示: Reading version failed: not an RFB server? 代表我们之前在Jetson nano并未能成功开启VNC服务,需要回到前面debug一下了,或给我们留意 =)

5. 关闭VNC服务

如果我们需要关闭VNC服务,那我们得先找出vino-server后台程序编号是多少,然后将其kill掉。

回到Jetson Nano的口令行,输入以下:

ps -ef | grep vino

#得到以下信息:
jetbot        7096     1  0 13:39 pts/0    00:00:00 /usr/lib/vino/vino-server
jetbot       10082  6770  0 13:48 pts/0    00:00:00 grep --color=auto vino

以上7096就是我当前vnc服务程序运行的编号, 大家根据自己情况修改以下程序编号来kill掉这进程:

kill 7096

这样VNC服务就会关闭了。

6. 配置开机自启动

每次重启后都要手动运行脚本太麻烦,我们可以将其设置为systemd服务自动启动。

创建systemd服务文件

sudo nano /etc/systemd/system/vnc.service

添加以下内容:

[Unit]
Description=VNC Server for Jetson Nano
After=network.target graphical.target

[Service]
Type=simple
User=jetbot
Environment=DISPLAY=:0
ExecStart=/usr/lib/vino/vino-server
Restart=on-failure
RestartSec=5

[Install]
WantedBy=graphical.target

保存并退出(Ctrl+X,然后Y)。

启用并启动服务

sudo systemctl daemon-reload
sudo systemctl enable vnc.service
sudo systemctl start vnc.service

验证服务状态:

sudo systemctl status vnc.service

现在每次开机都会自动启动VNC服务了。

7. 安全配置建议

默认配置下VNC没有密码保护,这在生产环境中存在安全风险。以下是几种安全加固方案:

方案1:设置VNC密码

gsettings set org.gnome.Vino require-encryption true
gsettings set org.gnome.Vino authentication-methods "['vnc']"
gsettings set org.gnome.Vino vnc-password $(echo -n "你的密码" | base64)

方案2:使用SSH隧道(推荐)

通过SSH隧道加密VNC流量:

# 在你的电脑上执行,建立SSH隧道
ssh -L 5900:localhost:5900 jetbot@192.168.199.119

然后在VNC Viewer中连接 localhost:5900,这样所有流量都通过SSH加密传输。

方案3:防火墙限制访问

只允许特定IP访问5900端口:

sudo ufw allow from 你的电脑IP to any port 5900
sudo ufw deny 5900

8. 性能优化技巧

如果VNC连接卡顿或延迟较高,可以尝试以下优化:

降低颜色深度

在VNC Viewer设置中将颜色模式改为 “Low color (8-bit)” 或 “Medium color (16-bit)“。

禁用桌面特效

# 禁用GNOME动画效果
gsettings set org.gnome.desktop.interface enable-animations false
# 禁用合成器
gsettings set org.gnome.desktop.wm.preferences compositing-manager false

调整VNC编码

# 使用更快的编码
gsettings set org.gnome.Vino encoding "tight"

使用替代方案:x11vnc

如果vino性能不够理想,可以尝试x11vnc:

sudo apt install x11vnc
# 设置密码
x11vnc -storepasswd
# 启动服务
x11vnc -display :0 -rfbauth ~/.vnc/passwd -forever -loop

x11vnc通常比vino有更好的性能,支持更多高级特性。

9. 常见问题排查

问题1:VNC Viewer连接失败

症状:提示 “Connection refused” 或超时

排查步骤

  1. 检查vino服务是否运行:ps aux | grep vino
  2. 检查防火墙:sudo ufw status
  3. 确认IP地址正确:ifconfig | grep inet
  4. 尝试ping测试网络连通性

解决方案

# 重启vino服务
sudo systemctl restart vnc.service
# 或直接运行
~/openvino

问题2:连接成功但黑屏

原因:DISPLAY变量设置错误或桌面环境未启动

解决方案

# 确认DISPLAY设置
export DISPLAY=:0
# 检查桌面环境
ps aux | grep gnome-session

问题3:鼠标移动延迟严重

原因:网络延迟或性能瓶颈

解决方案

  1. 使用有线网络代替WiFi
  2. 降低VNC颜色深度
  3. 关闭不必要的桌面特效
  4. 考虑使用x11vnc替代vino

问题4:分辨率不合适

调整桌面分辨率

# 查看可用分辨率
xrandr
# 设置分辨率
xrandr --output HDMI-0 --mode 1920x1080

10. 总结与最佳实践

通过VNC远程控制Jetson Nano可以大幅提升开发效率,无需连接显示器即可完成所有操作。以下是关键要点:

必须做的

  1. 配置开机自启动服务
  2. 设置密码或使用SSH隧道保护安全
  3. 记住IP地址获取方法(ifconfig
  4. 准备备用访问方式(SSH)

推荐的

  1. 使用x11vnc替代vino获得更好性能
  2. 禁用桌面特效减少延迟
  3. 配置防火墙限制访问
  4. 定期更新系统保持安全

注意事项

  • 生产环境务必启用认证和加密
  • 不要将VNC直接暴露到公网
  • 定期检查日志排查问题

掌握了这些技巧,你就可以在任何地方通过笔记本电脑或平板远程开发Jetson Nano项目了!


VNC 高级配置

1. 性能优化

提高 VNC 连接速度

# 1. 降低颜色深度
vncserver :1 -geometry 1280x720 -depth 16

# 2. 使用 TightVNC 编码器(压缩率更高)
vncserver :1 -localhost no -geometry 1920x1080

# 3. 配置 x0vncserver 优化参数
x0vncserver -display :0 -compresslevel 6 -quality 6

VNC 客户端优化设置

参数推荐值说明
ColorLevel256 colors减少带宽占用
CompressLevel6中等压缩
Quality6平衡质量和速度
EncodingTight高效编码

2. 自动启动配置

设置 VNC 开机自启

# 创建 systemd 服务
sudo nano /etc/systemd/system/vncserver@.service
[Unit]
Description=Start VNC Server at tty%i
After=display-manager.service

[Service]
Type=forking
User=your_username
ExecStart=/usr/bin/vncserver :%i -geometry 1920x1080 -depth 24
ExecStop=/usr/bin/vncserver -kill :%i
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
# 启用服务
sudo systemctl enable vncserver@1.service
sudo systemctl start vncserver@1.service

3. 安全加固

使用 SSH 隧道

# 客户端通过 SSH 连接
ssh -L 5901:localhost:5901 user@jetson_ip

# 然后 VNC 客户端连接 localhost:5901

配置防火墙

# 只允许 SSH 访问
sudo ufw default deny incoming
sudo ufw allow ssh
sudo ufw enable

# 不开放 VNC 端口
# VNC 只通过 SSH 隧道访问

启用 VNC 密码

# 设置 VNC 密码
vncpasswd

# 强制使用密码认证
echo "Authentication=VncAuth" >> ~/.vnc/config

4. 多显示器支持

# 配置双显示器
vncserver :1 -geometry 3840x1080

# 或使用 xrandr 配置
xrandr --setmonitor VNC-1 1920/508x1080/285+0+0 VIRTUAL1
xrandr --setmonitor VNC-2 1920/508x1080/285+1920+0 VIRTUAL2

5. 远程桌面共享

共享物理显示器

# 安装 x11vnc
sudo apt install x11vnc

# 共享当前显示器
x11vnc -display :0 -forever -shared

# 创建 systemd 服务
sudo nano /etc/systemd/system/x11vnc.service
[Unit]
Description=x11vnc remote desktop server
After=display-manager.service

[Service]
Type=simple
ExecStart=/usr/bin/x11vnc -display :0 -forever -shared -rfbauth /home/your_username/.vnc/passwd
ExecStop=/bin/kill -TERM $MAINPID
Restart=always

[Install]
WantedBy=multi-user.target

实际应用案例

案例1:机器人开发

使用 VNC 远程开发机器人项目:

# 1. 安装开发环境
sudo apt install ros-melodic-desktop
pip3 install jupyterlab

# 2. 启动机器人控制程序
roslaunch my_robot robot.launch

# 3. 通过 VNC 监控
# 可以在远程查看机器人状态、调试代码

优势

  • 无需外接显示器
  • 实时监控机器人状态
  • 远程调试代码
  • 降低硬件成本

案例2:边缘计算

将 Jetson Nano 部署为边缘计算节点:

# 1. 安装 Docker
sudo apt install docker.io
sudo usermod -aG docker $USER

# 2. 运行 AI 推理服务
docker run -d --runtime nvidia \
    -p 8080:8080 \
    nvcr.io/nvidia/deepstream-l4t:5.0.1-20.09-samples

# 3. 通过 VNC 管理服务
# 远程监控资源使用、查看日志

案例3:教学实验

搭建远程实验室:

# 1. 配置多个用户
sudo useradd -m student1
sudo useradd -m student2

# 2. 为每个用户启动 VNC
su - student1
vncserver :1 -geometry 1280x720

su - student2
vncserver :2 -geometry 1280x720

# 3. 学生通过 VNC 客户端连接
# 进行远程实验和开发

故障排查

常见问题

问题1:VNC 连接黑屏

# 解决方案:检查桌面环境
echo "mate-session &" > ~/.vnc/xstartup
chmod +x ~/.vnc/xstartup
vncserver -kill :1
vncserver :1

问题2:性能缓慢

# 优化方案:
# 1. 降低分辨率
vncserver :1 -geometry 1280x720

# 2. 使用更低的颜色深度
vncserver :1 -depth 16

# 3. 禁用桌面效果
gsettings set org.mate.Marco.general compositing-manager false

问题3:无法连接

# 检查步骤:
# 1. 检查 VNC 服务状态
sudo systemctl status vncserver@1

# 2. 检查端口监听
sudo netstat -tlnp | grep 590

# 3. 检查防火墙
sudo ufw status

# 4. 查看日志
tail -f ~/.vnc/*.log

替代方案

1. RDP(远程桌面协议)

# 安装 xrdp
sudo apt install xrdp

# 启动服务
sudo systemctl enable xrdp
sudo systemctl start xrdp

# 使用 Windows 远程桌面连接
# 或 Linux 下的 Remmina

2. X2Go

# 安装 X2Go
sudo apt install x2goserver x2goserver-xsession

# 客户端使用 X2Go Client
# 比 VNC 更流畅,支持音频转发

3. NoMachine

# 下载 NoMachine
wget https://www.nomachine.com/downloads/free/Linux/nomachine_7.10.1_1_arm64.deb

# 安装
sudo dpkg -i nomachine_*.deb

# 优势:性能更好,支持文件传输、音频

总结

通过 VNC 远程访问 Jetson Nano,我们可以:

无头运行:无需外接显示器、键盘、鼠标 ✅ 远程开发:随时随地访问开发环境 ✅ 降低成本:减少硬件投入 ✅ 提高效率:多任务并行处理 ✅ 便于管理:集中管理多个设备

最佳实践

  1. 使用 SSH 隧道提高安全性
  2. 合理配置分辨率和颜色深度
  3. 设置开机自启方便使用
  4. 定期更新系统保持安全
  5. 备份重要配置文件

下一步

  • 探索更高效的远程桌面方案(NoMachine、X2Go)
  • 配置自动化部署脚本
  • 搭建集群管理系统
  • 集成监控告警

希望这篇指南能帮助你更好地使用 Jetson Nano 进行远程开发!


相关资源: