noVNC 是一个基于 HTML5 Canvas 的 Web VNC 客户端,通过浏览器即可远程访问 Linux 桌面,无需安装任何客户端软件。

实际环境安装了什么

本环境(Debian/Deepin ARM64)实际安装的 noVNC 相关组件:

1. noVNC 前端 (v1.6.0)

  • 位置: ~/Documents/.novnc/
  • 方式: 独立下载的 noVNC 发行版(非 pip 包)
  • 作用: 提供 Web 端的 VNC 客户端,即浏览器中看到的 VNC 页面
  • 前端文件: vnc.htmlvnc_lite.html

2. websockify (v0.13.0)

  • 位置: pip 安装到系统 Python 3.12
  • 路径: /usr/local/python3.12/bin/python3.12 -m websockify
  • 作用: 将 WebSocket 流量转换为 TCP 流量,桥接浏览器和 VNC Server

3. x11vnc (v0.9.13)

  • 位置: ~/Documents/dev/.apt/usr/bin/x11vnc
  • 方式: 非系统 apt,而是通过 dev 环境管理的独立二进制(ELF 64-bit ARM aarch64)
  • 作用: 捕获现有 X11 桌面会话,提供标准 VNC 服务

4. VNC 相关系统库

通过系统包管理已安装的依赖库:

  • libvncclient1:arm64 — VNC 客户端库
  • libvncserver1:arm64 — VNC 服务器库
  • x11vnc-udcp — x11vnc UDP 增强版
  • remmina-plugin-vnc — Remmina 的 VNC 插件

noVNC 架构原理

1
浏览器 (WebSocket)  ──→  websockify (:6080)  ──→  x11vnc (:5900)  ──→ X11 桌面 (DISPLAY :1)
  1. 用户在浏览器打开 http://IP:6080/vnc.html
  2. noVNC 前端通过 WebSocket 连接 websockify
  3. websockify 将 WebSocket 协议转换为标准 TCP/VNC 协议
  4. x11vnc 捕获 X11 桌面画面并响应 VNC 交互

安装步骤

第一步:下载 noVNC 前端

1
2
mkdir -p ~/Documents/.novnc
# 从 https://github.com/novnc/noVNC/releases 下载解压至此目录

第二步:安装 websockify

1
pip install websockify

验证安装:

1
2
pip show websockify
# 输出:websockify 0.13.0

第三步:准备 x11vnc 二进制

本环境使用 dev 环境中预编译的 ARM64 版本:

1
2
~/Documents/dev/.apt/usr/bin/x11vnc --version
# 输出:0.9.13

第四步:生成 VNC 密码

1
echo "1234" | ~/Documents/dev/.apt/usr/bin/x11vnc -storepasswd -quiet /tmp/.vnc_passwd

密码文件生成在 /tmp/.vnc_passwd,密码为 1234

第五步:启动 x11vnc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
DISPLAY_NUM=1   # 根据实际 DISPLAY 变量设置

AUTH_FILE="$HOME/.Xauthority"
if [ -f "$AUTH_FILE" ]; then
VNC_AUTH_OPT="-auth $AUTH_FILE"
else
VNC_AUTH_OPT="-rfbauth /tmp/.vnc_passwd"
fi

env DISPLAY=:$DISPLAY_NUM ~/Documents/dev/.apt/usr/bin/x11vnc \
-display ":$DISPLAY_NUM" \
$VNC_AUTH_OPT \
-rfbport 5900 \
-forever -shared -noxdamage

参数说明

参数 说明
-auth .Xauthority 使用 X11 认证文件(免密码),不存在则 fallback 到密码文件
-rfbport 5900 VNC 监听端口
-forever 不因客户端断开而退出
-shared 允许多客户端同时连接
-noxdamage 禁用 XDamage 扩展(避免某些场景下的画面异常)

第六步:启动 websockify 桥接

1
2
3
4
5
nohup /usr/local/python3.12/bin/python3.12 -m websockify \
--web "$HOME/Documents/.novnc" \
--idle-timeout=86400 \
-6 \
6080 localhost:5900

参数说明

参数 说明
--web ~/Documents/.novnc 指定 noVNC 前端页面目录
--idle-timeout=86400 24 小时空闲超时
-6 支持 IPv6
6080 localhost:5900 WebSocket 端口转发到 VNC 端口

第七步:浏览器访问

1
http://<服务器IP>:6080/vnc.html

点击 Connect 按钮,密码为 1234

一键安装启动脚本

本环境的 ~/Documents/start_all.sh 包含了所有服务的自动启动,其中 Step 9 负责 noVNC 远程桌面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# ========== 相关配置 ==========
NOVNC_PORT=6080
NOVNC_DIR="$HOME/Documents/.novnc"
VNC_PASSWD_FILE="/tmp/.vnc_passwd"
DISPLAY_NUM=1
# =============================

# 1. 生成VNC密码文件(首次)
if [ ! -f "$VNC_PASSWD_FILE" ]; then
echo "1234" | $HOME/Documents/dev/.apt/usr/bin/x11vnc -storepasswd -quiet $VNC_PASSWD_FILE 2>/dev/null
fi

# 2. 启动x11vnc(优先 .Xauthority)
AUTH_FILE="$HOME/.Xauthority"
[ -f "$AUTH_FILE" ] && VNC_AUTH_OPT="-auth $AUTH_FILE" || VNC_AUTH_OPT="-rfbauth $VNC_PASSWD_FILE"

nohup env DISPLAY=:$DISPLAY_NUM $HOME/Documents/dev/.apt/usr/bin/x11vnc \
-display ":$DISPLAY_NUM" \
$VNC_AUTH_OPT \
-rfbport 5900 \
-forever -shared -noxdamage \
> /tmp/x11vnc.log 2>&1 &

# 3. 启动websockify + noVNC
nohup /usr/local/python3.12/bin/python3.12 -m websockify \
--web "$NOVNC_DIR" \
--idle-timeout=86400 \
-6 \
$NOVNC_PORT localhost:5900 \
> /tmp/websockify.log 2>&1 &

echo "浏览器访问 http://0.0.0.0:$NOVNC_PORT/vnc.html (密码:1234)"

注意事项

  1. x11vnc 路径:本环境 x11vnc 不在系统 PATH 中,需使用完整路径 ~/Documents/dev/.apt/usr/bin/x11vnc
  2. Python 路径:websockify 通过 /usr/local/python3.12/bin/python3.12 运行
  3. 认证优先级.Xauthority 存在时优先使用(免密码),否则使用密码文件
  4. DISPLAY 设置:实际环境可能为 :1 而非默认的 :0,注意动态获取
  5. 前端页面:访问 vnc.html 而非 vnc_lite.html(后者无设置界面,前者有连接设置面板)
  6. 密码为 1234:仅用于内网开发环境,生产环境请修改