从TightVNC到x11vnc:Ubuntu远程桌面踩坑实录

发布时间:2026/10/22 9:46:29
从TightVNC到x11vnc:Ubuntu远程桌面踩坑实录 上周为了一台 Ubuntu 工作站能远程办公我连续折腾了两个晚上。最开始我天真地以为装个 TightVNC、开个端口就完事结果第一个连接就给了我一记重锤vncserver 启动成功VNC Viewer 连上去却只有一片黑色和灰色背景桌面环境影子都没见到。后面又陆续踩了 Xauthority 权限、锁屏冲突、GNOME 会话起不来等好几个坑最后换到 x11vnc 才终于稳定下来。这篇文章就把这趟从 TightVNC 到 x11vnc 的完整踩坑过程写出来包括每一步的根因、排错命令和最终可用配置希望能帮你在远程桌面这件事上少浪费几个晚上。1. 为什么我没选 RDP也没直接用 x11vnc很多人第一次配 Ubuntu 远程桌面时都会在 VNC 和 RDP 之间犹豫。我当时也纠结过一阵先说说最终选择 VNC 这条路的原因。RDP 协议在 Windows 上体验确实好但 Linux 下面想用 RDP往往要装 xrdp 这类服务端。xrdp 本身不算复杂问题在于它和现代桌面会话的“挂接”经常出现奇奇怪怪的状况尤其是 Ubuntu 新版本带 GNOME 的情况下xrdp 拉起来的会话很容易变成一个孤立会话看起来登录进去了实际桌面组件没起来或者操作特别卡。另一方面VNC 的客户端生态非常成熟Windows、macOS、手机上都有一堆现成的客户端Server 端也有好几种实现出了问题排错资料也相对好找。所以我最后还是把主力放在了 VNC 上。但 VNC 内部也有很大区别。TightVNC 的定位是“创建一个虚拟显示器并在这个显示器上启动一套新的桌面”本质上是另起炉灶x11vnc 则是“直接读取当前物理显示器的画面并转发出去”更像一个远程监控加控制的桥梁。按理说我没少看博客应该一开始就选 x11vnc但当时想着 TightVNC 是老牌方案、教程多就想着先拿它试一把结果这一试就试出了后面三个大坑。后来回头看这个选择本身没有绝对的对错但一定要明白两者的模型差异。如果你需要的是“远程查看物理屏上正在跑的东西”x11vnc 从一开始就是更合适的如果你只是想要一个随时可用的独立桌面会话TightVNC 反而有它的价值。很多教程默认把 VNC 当成一个整体来写导致踩坑的人根本不知道问题出在“桌面启动”和“画面传输”是两件完全独立的事。2. TightVNC 的第一层黑色滤镜vncserver 启动了客户端却只看得到背景壁纸2.1 安装和启动其实很简单问题全在后面TightVNC 的安装过程非常顺手基本就是两条命令的事sudo apt update sudo apt install tightvncserver安装之后先设置一个 VNC 访问密码vncpasswd这个密码会被保存在~/.vnc/passwd文件里VNC 客户端连接时要用它登录跟系统的登录密码没有关系我一开始还傻傻地试了系统密码结果一直认证失败。接着启动虚拟显示器vncserver :1 -geometry 1440x900 -depth 24参数含义很直观:1表示创建编号为 1 的显示:0保留给物理屏幕所以一般从 1 开始-geometry是分辨率-depth 24是色彩深度。启动成功后终端会显示类似New 你的主机名:1 (用户名) desktop is :1的信息看起来一切正常。然后我打开 VNC Viewer输入IP:1心想这次总该见到桌面了。结果屏幕上只有两种颜色大面积的黑或者一块平平无奇的灰底偶尔能看见鼠标光标在动但就是没有任何窗口、任务栏或桌面图标。2.2 黑屏的根因VNC 服务端只负责“屏幕输出”不负责“启动桌面”这个问题最气人的地方在于日志里没有明显报错网上搜索出来的答案五花八门有人说是显卡驱动问题有人说是加密问题甚至有人建议重装系统。其实绝大多数情况下罪魁祸首就是~/.vnc/xstartup这个启动脚本没有配置好。TightVNC 启动一个虚拟显示器后这个显示器上默认是什么都不跑的它不会自动启动 GNOME、XFCE 或者任何桌面环境。它只是一个空白的 X 显示等待用户告诉它该启动什么。如果没有在xstartup里写清楚要启动的桌面命令那客户端看到黑屏和灰底就再正常不过了。VNC 服务端和桌面启动是两件事这个认知是我这次踩坑最大的收获。你可以把 VNC 服务端理解成一台摄影机它负责把你需要看的画面编码传走但如果镜头前面什么都没有再好的摄影机也只能拍出黑屏。xstartup就是那个“布置摄影棚”的脚本。2.3 修复 xstartup 并让桌面真正跑起来找到~/.vnc/xstartup如果文件不存在就手动创建。我最后的配置是这样的#!/bin/bash export XAUTHORITY$HOME/.Xauthority xrdb $HOME/.Xresources 2/dev/null || true dbus-launch --exit-with-session startxfce4 注意两件事第一脚本要有执行权限第二我在这里选择了 XFCE 桌面而不是 GNOME原因后面会说。给权限并重启服务chmod x ~/.vnc/xstartup vncserver -kill :1 vncserver :1 -geometry 1440x900 -depth 24再连一次桌面就正常出现了。如果你执着于用系统原本的 GNOME 桌面环境把最后一行替换成unset DBUS_SESSION_BUS_ADDRESS unset SESSION_MANAGER dbus-launch --exit-with-session gnome-session --sessionubuntu 但我不太推荐在 TightVNC 下面硬跑 GNOME原因下面会展开。2.4 养成看 VNC 日志的习惯排查黑屏问题时最容易走弯路是因为很多人不看日志。VNC server 的日志在~/.vnc/目录下文件名类似你的主机名:1.log。每次启动失败或者桌面没起来用下面命令看最后几十行tail -50 ~/.vnc/你的主机名:1.log常见的错误类型其实就那么几种症状大概率原因日志里提示command not foundxstartup 里的桌面启动命令不存在需要先安装对应桌面日志里提示xauth: file ... does not existXauthority 路径不对检查export XAUTHORITY日志里提示dbus-launch相关报错缺少 dbus 会话环境需要加 dbus-launch 包裹启动命令看日志这个习惯救了我很多次后面 x11vnc 出问题也是靠 journalctl 定位的别嫌麻烦。3. 权限和会话的连环坑能连上桌面的并不代表能正常操作3.1 桌面出来了操作却像“隔了一层纱”黑屏问题解决之后我以为一切就要顺利了结果新的问题马上来了VNC 连上去确实能看到桌面但鼠标点击没什么反应键盘输入偶尔丢失窗口也拖不动整个桌面像一个只读的截图。当时我一度怀疑是网络延迟但本地局域网延迟根本不至于这么严重。后来仔细排查才发现这个问题的根源不在网络而在 X 会话的权限和桌面环境依赖。X Window 系统有一套自己的授权机制核心文件是~/.Xauthority。TightVNC 创建虚拟显示器的时候会生成自己的认证信息但桌面进程真正运行起来还需要访问用户的 dbus 会话、密钥环等一系列服务。如果环境变量没有正确传递特别是DBUS_SESSION_BUS_ADDRESS这个变量缺失GNOME 类的桌面就会出现“只显示界面、无法操作”的诡异状态。解决方案其实很简单就是在 xstartup 里用 dbus-launch 把所有桌面进程包起来让整个桌面会话跑在一个正确的 dbus 环境里。这也是为什么我在上一节的配置里特意加了dbus-launch --exit-with-session。另外一个容易忽略的点是~/.Xauthority的权限。如果这个文件权限太宽比如 644其他本地用户就能读到你的授权 cookieX 服务出于安全考虑会拒绝加载反过来导致桌面组件起不来。我把它改成 600 之后很多说不清的怪问题都消除了chmod 600 ~/.Xauthority3.2 为什么在 TightVNC 里我用 XFCE 而不是 GNOME如果你测试过几轮就会发现在 TightVNC 的虚拟显示器里启动 GNOME经常出现各种小毛病面板不见了、扩展加载失败、会话管理器报错。原因在于 GNOME 默认跟系统登录管理器深度绑定依赖整个 systemd 用户会话流程而 TightVNC 自己创建的虚拟显示器与这套流程是割裂的。相比之下XFCE 是一个轻量级桌面环境对 dbus、systemd 的依赖小得多启动速度快远程场景下资源占用也更低。我装的这套配置里XFCE 只需要一条命令就能在虚拟显示器上跑起来sudo apt install xfce4 xfce4-terminal可能有人会觉得 XFCE 没有 GNOME 漂亮但远程办公场景下速度和稳定比那点视觉差异重要太多了。我后来一直用 XFCE 跑 TightVNC再也没出现桌面“假死”的问题。3.3 性能和色彩的几个参数建议如果远程桌面操作还是觉得卡可以从分辨率和色彩深度下手。把启动命令改成vncserver :1 -geometry 1280x720 -depth 16分辨率降低之后需要传输的像素量大幅减少-depth 16虽然会牺牲一些颜色精度但日常开发、看文档完全够用。客户端那边也可以开启 JPEG 压缩选项实测对延迟改善明显。我最终的体验是TightVNC 在局域网里是能用的但上限摆在那里如果单位网络复杂、跨网段访问频繁卡顿会直接抹掉使用体验。这也是我后来下定决心换 x11vnc 的导火索之一。4. 锁屏和无人值守之间的取舍4.1 最让人崩溃的一幕远程看到锁屏页而不是工作界面TightVNC 跑顺之后我自以为可以高枕无忧了。某一天我离开办公室让电脑自己运行一个程序回家后想用 VNC 远程看一眼进度。连上之后屏幕上赫然是锁屏界面需要输入密码但我没有物理键盘远程键盘输了半天也没法解锁场面极其尴尬。这个问题的本质其实是“锁屏锁的是物理显示器而不是 VNC 虚拟显示器”。TightVNC 创建的:1虚拟会话和物理屏幕:0的锁屏状态没有直接关系。也就是说物理屏幕上锁没锁虚拟会话完全不理会反过来虚拟会话里的桌面状态也不代表物理屏上真的在发生什么。如果你想要“远程给同事演示当前现场屏幕”或者“远程看到物理屏上正在跑的 GUI 程序”TightVNC 这种虚拟会话模式从根本上就无法满足。这时候 x11vnc 的优势就体现出来了。4.2 无人值守场景下的锁屏处理如果你像我一样需要无人值守远程访问最简单的做法是关闭自动锁屏。GNOME 环境下可以用 gsettings 调整gsettings set org.gnome.desktop.screensaver lock-enabled false gsettings set org.gnome.desktop.session idle-delay 0第一条关闭锁屏功能第二条禁止空闲超时。这样无论物理屏还是虚拟会话都不会在空闲时跳锁屏页。但这里必须强调安全性关闭锁屏意味着任何能连到你这个 IP 和端口的人都可能直接看到桌面内容所以下面这一步一定不能省。4.3 防火墙只对可信网段开放很多人配置完 VNC 顺手一行sudo ufw allow 5900/tcp这等于把 5900 端口对全世界开放配合一个弱密码基本等于裸奔。我推荐用限定来源 IP 的方式sudo ufw allow from 192.168.1.0/24 to any port 5900 proto tcp这个命令的意思是只允许192.168.1.0/24这个内网网段的机器访问 5900 端口其他来源一律丢弃。如果你有多台设备在外网需要连接不要图省事直接全开更稳妥的办法是走带认证的远程网关而不是把端口裸奔到公网。我后来为了兼顾“出门在外也能连”在自己可控的路由器上只把特定来源网段转发到工作站其余全部拒绝。折腾一圈之后你会发现远程桌面最大的风险往往不是软件配置错而是端口开放策略太随性。5. x11vnc 的接入把“虚拟屏”换成“真实屏”5.1 压垮 TightVNC 的最后一件事真正让我决定切换的是一次现场调试。当时我在物理屏前启动了一个图形化软件然后远程需要用 VNC 看这个软件的运行画面。结果可想而知TightVNC 的虚拟会话里干干净净什么都没有因为那个软件跑在物理屏会话里跟虚拟显示器完全不在一个世界。这时候我才彻底明白如果我要远程看到“当前这台机器实际屏幕上发生的一切”就必须让 VNC 服务端直接读取物理显示器。x11vnc 干的就是这件事。打个比方TightVNC 是你在隔壁房间开了一个新办公室远程的人看到的是新办公室的样子和你在的原办公室无关x11vnc 则像在原办公室装了一个直播摄像头远程的人看到的就是你那间真实办公室的样子。对于要远程操作当前物理桌面的人来说x11vnc 才是正确的工具。5.2 安装、设置密码、手动启动验证x11vnc 的安装同样简单sudo apt install x11vnc然后生成一个密码文件以后 x11vnc 启动时直接从文件读认证信息sudo x11vnc -storepasswd 你的访问密码 /etc/x11vnc.pass注意密码文件权限要收一下不然系统会拒绝加载。先手动跑一次确认能够读取当前物理显示sudo x11vnc -display :0 -auth guess -rfbauth /etc/x11vnc.pass -forever -shared -noxdamage -rfbport 5900这里参数比较多逐个解释一下-display :0直接读取编号为 0 的物理显示器。-auth guess让 x11vnc 自动猜 Xauthority 文件位置。这个参数极其关键因为手动启动时我们可能不在图形会话环境里没有它经常会报x11vnc: unable to open display :0。-forever客户端断开后服务端不要退出继续等待下一次连接。-shared允许多个客户端同时连接同一画面。-noxdamage关闭 XDamage 优化。部分显卡驱动下不开这个会导致画面不断闪烁开了以后稳定很多。-rfbport 5900显式指定监听端口。如果一切顺利终端会显示类似The VNC desktop is: 你的主机名:0的信息用 VNC Viewer 连接同一个 IP 的 5900 端口就能看到物理屏上的真实内容了。5.3 把 x11vnc 做成开机自启服务手动启动断掉终端就停了不够靠谱我把它写成了 systemd 服务。在/etc/systemd/system/x11vnc.service里放下面这份配置[Unit] Descriptionx11vnc remote desktop service Afternetwork.target display-manager.service [Service] Typesimple ExecStart/usr/bin/x11vnc -display :0 -auth guess -forever -shared -rfbauth /etc/x11vnc.pass -rfbport 5900 -noxdamage Restarton-failure RestartSec3 [Install] WantedBymulti-user.target然后启用并启动sudo systemctl daemon-reload sudo systemctl enable --now x11vnc这里最值得注意的还是-auth guess。systemd 服务运行在系统上下文中跟图形会话的环境完全隔离它不知道 DISPLAY 是几也不知道 Xauthority 文件在哪。如果不加这个参数服务会反复尝试打开:0然后失败。加上-auth guess之后x11vnc 会主动去常见位置寻找认证信息大部分情况下都能直接搞定。查看服务状态和端口监听情况systemctl status x11vnc ss -tlnp | grep 5900看到LISTEN状态就说明服务已经正常跑起来了。日志用journalctl -u x11vnc -n 50查看出问题时别只看客户端提示服务端日志往往已经写明了原因。5.4 一个容易忽略的大前提Wayland 会拦住 x11vnc如果你用的是 Ubuntu 22.04 之后的版本默认登录会话很可能是 Wayland而 x11vnc 这类工具只能访问传统的 Xorg 显示服务器在 Wayland 下会直接失败或黑屏。我在另一台机器上就撞了一次。排查方法很简单在图形终端里执行echo $XDG_SESSION_TYPE如果输出是wayland那就意味着当前会话不是 Xorg。解决办法是登录界面上选择“Ubuntu on Xorg”再重新登录一次切回 X11 会话后 x11vnc 才能正常工作。如果登录界面没有该选项就需要确认对应桌面环境是否安装了额外的 Xorg 会话支持包。这个前提如果不知道配再多参数都是白搭。我见过有人折腾了两天最后发现根本不是配置问题而是会话类型不对。6. 这趟折腾之后我留下的配置模板与避坑清单6.1 一份可以直接照抄的最终配置模板把前面所有内容浓缩成一份可复现的步骤按顺序执行就行# 1. 安装工具 sudo apt update sudo apt install tightvncserver x11vnc xfce4 xfce4-terminal # 2. 配置 x11vnc 密码文件 sudo x11vnc -storepasswd 你的访问密码 /etc/x11vnc.pass sudo chmod 600 /etc/x11vnc.pass # 3. 配置 x11vnc 服务 sudo tee /etc/systemd/system/x11vnc.service /dev/null EOF [Unit] Descriptionx11vnc remote desktop service Afternetwork.target display-manager.service [Service] Typesimple ExecStart/usr/bin/x11vnc -display :0 -auth guess -forever -shared -rfbauth /etc/x11vnc.pass -rfbport 5900 -noxdamage Restarton-failure RestartSec3 [Install] WantedBymulti-user.target EOF sudo systemctl daemon-reload sudo systemctl enable --now x11vnc # 4. 防火墙限制来源网段 sudo ufw allow from 192.168.1.0/24 to any port 5900 proto tcp执行完之后用 VNC Viewer 连接主机IP:5900输入密码就能看到物理桌面了。6.2 踩坑速查表症状可能原因解决动作TightVNC 连接后黑屏xstartup 没配置或没启动桌面补全 ~/.vnc/xstartup 并 chmod x连接后看到桌面但无法点击dbus 会话环境缺失用 dbus-launch 包裹桌面启动命令操作卡顿、颜色花分辨率和色深太高降低分辨率和色彩深度远程看到锁屏界面无人值守前未关闭自动锁屏用 gsettings 关闭锁屏x11vnc 无法打开 :0缺少 Xauthority 信息加上 -auth guessWayland 下 x11vnc 黑屏会话不是 Xorg登录界面切到 Ubuntu on Xorg服务启动成功但外网连不上防火墙未放行或来源受限检查 ufw 规则和监听端口6.3 几个我后悔没早点知道的习惯配置完之后我养成了三个习惯。第一修改任何 VNC 相关配置后一定要看服务日志而不是反复重试验证TightVNC 看~/.vnc/*.logx11vnc 看journalctl -u x11vnc。第二不要贪图省事把防火墙端口全开限网段、强密码、小权限是底线。第三所有配置文件改动之前先备份尤其是 xstartup 和 systemd 服务文件一次改错还能快速回滚。整个折腾下来的最大体会是远程桌面的坑大多不是软件安装问题而是对“虚拟屏幕”和“真实屏幕”的模型没分清。如果你一开始就知道自己是要远程查看物理桌面那直接上 x11vnc别在 TightVNC 的虚拟会话里浪费时间如果你只是需要一个跟物理屏无关的独立工作环境再考虑 TightVNC。现在我这台工作站已经稳定跑了两个多月无论在家还是在办公室都能随时看到现场画面再也没出现过黑屏或者锁屏卡死的闹剧。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询