Ubuntu 14.04 上安装配置 VNC Server 远程桌面完整指南
1. 为什么要在 Ubuntu 14.04 上折腾 VNC ServerUbuntu 14.04 这个版本放到今天来看确实有点年头了。它发布于 2014 年 4 月官方标准支持早在 2019 年就已经结束。但现实情况是不少工业控制设备、老旧的测试仪器配套主机、还有一些内网隔离环境下的专用工作站至今仍然跑着这个版本的系统。这些机器往往不方便重装也不允许随便升级因为上面跑着的业务软件可能只兼容这个特定的系统环境。在这些场景下远程图形化操作就成了一个刚需。你可能需要远程看一下桌面上的某个配置工具或者操作一个只有图形界面才能跑起来的采集程序。这时候 VNC 就是最直接的选择。它足够轻量不需要额外的显示硬件也不需要复杂的会话管理机制装完配置好就能用。VNC 的全称是 Virtual Network Computing直译过来就是虚拟网络计算。它的工作方式其实很朴素服务端把整个桌面画面按照变化区域切分成小块压缩后通过网络推送给客户端客户端再把鼠标键盘事件回传过去。你可以把它理解成一种“画面直播加远程操控”的组合只不过直播的内容是你自己的桌面。在 Ubuntu 14.04 上装 VNC Server有几个绕不开的坑。首先是桌面环境的选择14.04 默认的 Unity 桌面和 VNC 配合得并不好经常出现黑屏、花屏或者只有壁纸没有图标的情况。其次是权限和会话管理VNC 服务默认是以当前用户身份启动的但如果你用 root 去跑又会遇到权限混乱的问题。再就是开机自启的配置14.04 用的是 Upstart 而不是后来的 systemd网上很多教程直接给 systemd 的配置照抄根本跑不起来。这篇文章会从实际操作的视角把整个安装配置流程拆开来讲。每一步为什么这么做参数怎么定遇到问题怎么排查都会说清楚。目标读者是那些手头有一台 Ubuntu 14.04 机器、需要远程图形界面、但又不想在这上面花太多时间折腾的人。如果你刚好是这种情况下面的内容应该能帮你省下不少查资料和试错的时间。2. 装之前先把这几个概念理清楚2.1 VNC Server 和 X Server 的关系很多人第一次配 VNC 的时候会懵我明明已经装了桌面环境为什么 VNC 连上去还是黑屏要搞明白这个问题得先理清 X Server、桌面环境和 VNC Server 这三者的关系。X Server 是 Linux 图形界面的底层服务它负责管理显示设备、输入设备并提供绘图接口。桌面环境比如 Unity、GNOME、XFCE是跑在 X Server 之上的一个大型客户端程序它负责画窗口、画任务栏、管理图标。而 VNC Server 本质上是一个特殊的 X Server它不往真实的显示器上画东西而是把画面内容通过网络发送出去。所以正确的启动顺序是VNC Server 先启动它会创建一个虚拟的显示端口比如 :1 对应 5901 端口然后桌面环境作为客户端连接到这个虚拟显示端口上。如果你只启动了 VNC Server 但没有启动桌面环境那连上去自然就是一个空白的 X 根窗口也就是我们常说的黑屏。Ubuntu 14.04 默认的 Unity 桌面对 VNC 的支持比较差因为它依赖 3D 加速和 Compiz 合成管理器而 VNC 的虚拟显示端口通常没有硬件加速能力。所以更稳妥的做法是换一个轻量级的桌面环境比如 XFCE 或者 LXDE。这两个桌面环境对 2D 渲染的依赖更少在 VNC 下跑起来更稳定。2.2 显示端口编号与端口号的对应关系VNC 的显示端口编号和实际监听的 TCP 端口号之间有一个固定的换算关系端口号等于 5900 加上显示编号。比如 :1 对应 5901:2 对应 5902以此类推。这个规则在配置防火墙和客户端连接的时候都要用到。在 Ubuntu 14.04 上如果你用vncserver命令启动服务它会自动从 :1 开始找空闲的显示编号。如果你想指定编号可以用vncserver :2这样的形式。每个显示编号对应一个独立的桌面会话互不干扰。这一点在多用户或者需要同时开多个远程桌面的场景下很有用。注意显示编号不要和系统上已有的 X Server 冲突。Ubuntu 14.04 本机如果启动了图形界面通常会占用 :0也就是 5900 端口。所以 VNC 一般从 :1 开始用。2.3 两种常见的 VNC 服务端方案对比在 Ubuntu 14.04 上能用的 VNC 服务端不止一种。常见的有 TightVNC、TigerVNC 和 RealVNC。它们各有特点选哪个取决于你的具体需求。方案优点缺点适用场景TightVNC安装包小配置简单兼容性好压缩效率一般高分辨率下带宽占用较高内网环境对画质要求不高TigerVNC压缩效率高支持多种编码方式在 14.04 上依赖稍多配置略复杂网络带宽有限需要流畅操作RealVNC商业版功能强免费版够用免费版有连接数限制配置项多需要跨平台客户端对稳定性要求高从实际使用经验来看TightVNC 在 Ubuntu 14.04 上的安装和配置是最省心的。它的软件包在官方源里就有直接apt-get install就能装上不需要额外添加第三方源。TigerVNC 的压缩算法确实更好但在 14.04 这个老系统上有时候会遇到依赖库版本不匹配的问题需要手动处理。RealVNC 的免费版对于个人使用来说够用但如果你需要同时连多台机器可能会碰到授权限制。我个人的建议是如果只是临时用一下或者内网带宽充足直接上 TightVNC。如果是要长期跑在生产环境里而且网络条件一般可以考虑 TigerVNC但要做好多花点时间调依赖的准备。3. 从零开始的完整安装与配置流程3.1 系统准备与依赖安装在开始装 VNC 之前先把系统更新到最新状态。这一步不是可有可无的因为 Ubuntu 14.04 的官方源里有些软件包版本比较老更新一下能避免不少兼容性问题。sudo apt-get update sudo apt-get upgrade -y更新完成后安装一个轻量级的桌面环境。这里选 XFCE因为它对系统资源的占用比较小而且在 VNC 下的表现最稳定。sudo apt-get install xfce4 xfce4-goodies -yxfce4是核心桌面环境xfce4-goodies包含了一些常用的插件和工具比如终端模拟器、文本编辑器、文件管理器等。装完之后系统里会多出一个 XFCE 会话选项但默认的显示管理器可能还是 Unity。这个不影响 VNC因为 VNC 会话是独立启动的不走显示管理器。接下来安装 TightVNC Serversudo apt-get install tightvncserver -y安装完成后先不要急着启动。TightVNC 在第一次启动时会要求你设置一个访问密码这个密码是客户端连接时用的。但如果你直接运行vncserver它会用默认的配置启动一个会话这个会话的桌面环境可能不是你想要的 XFCE。所以更稳妥的做法是先手动配置好启动脚本再启动服务。3.2 配置 VNC 会话的启动脚本VNC 会话启动的时候会去读用户主目录下的~/.vnc/xstartup文件。这个文件决定了 VNC 会话里启动哪个桌面环境、加载哪些程序。默认情况下TightVNC 会生成一个很简单的 xstartup里面只启动了一个基本的 X 终端。我们需要把它改成启动 XFCE。先备份一下默认的 xstartupmv ~/.vnc/xstartup ~/.vnc/xstartup.bak然后创建一个新的 xstartup 文件nano ~/.vnc/xstartup写入以下内容#!/bin/sh unset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS exec startxfce4这几行的含义需要解释一下。unset SESSION_MANAGER和unset DBUS_SESSION_BUS_ADDRESS是为了清除当前 shell 环境里可能存在的会话管理变量。如果不清理VNC 会话可能会尝试去连接本机的会话管理器导致启动失败或者桌面环境加载异常。exec startxfce4是启动 XFCE 桌面环境的命令exec表示用这个进程替换当前 shell 进程这样 XFCE 就成为了 VNC 会话的主进程。保存文件后给它加上可执行权限chmod x ~/.vnc/xstartup提示如果你用的是其他桌面环境比如 LXDE把exec startxfce4换成exec startlxde即可。但不要用exec unityUnity 在 VNC 下基本跑不起来。3.3 首次启动与密码设置配置好 xstartup 之后就可以启动 VNC 服务了。第一次启动时系统会提示你设置一个密码vncserver :1你会看到类似这样的输出You will require a password to access your desktops. Password: Verify:输入密码并确认。这个密码是客户端连接时用的长度建议在 6 到 8 位之间。TightVNC 的密码验证机制只取前 8 位字符所以设太长也没用。另外这个密码不是系统登录密码是独立的 VNC 访问密码不要搞混。密码设置完成后VNC 服务会在 :1 显示端口上启动对应 TCP 5901 端口。你可以用netstat确认一下端口是否在监听netstat -tlnp | grep 5901如果看到LISTEN状态的输出说明服务已经正常启动了。3.4 客户端连接与桌面验证在另一台机器上安装 VNC 客户端然后连接你的服务器IP:5901。连接成功后应该能看到 XFCE 的桌面环境。如果看到的是黑屏或者只有鼠标指针说明 xstartup 配置有问题需要回头检查。第一次连接时可能会弹出一个提示说连接未加密。这是因为 TightVNC 默认不使用加密传输。在内网环境下这个可以接受。但如果你的网络环境不太安全建议通过 SSH 隧道来转发 VNC 流量。具体做法是在客户端上执行ssh -L 5901:localhost:5901 用户名服务器IP然后在 VNC 客户端里连接localhost:5901。这样 VNC 流量就会走 SSH 加密通道安全性会好很多。连接成功后你可以试着打开终端、文件管理器确认桌面环境的功能是否正常。如果发现某些程序打不开或者界面显示异常可能是缺少某些依赖库。这时候可以回到服务器上用apt-get install把缺失的包补上。4. 开机自启与多用户配置的实操细节4.1 用 Upstart 配置开机自启Ubuntu 14.04 用的是 Upstart 作为初始化系统而不是后来 Ubuntu 16.04 才开始用的 systemd。所以网上很多针对 systemd 写的 VNC 自启配置在 14.04 上是跑不通的。你需要用 Upstart 的配置文件格式。在/etc/init/目录下创建一个名为vncserver.conf的文件sudo nano /etc/init/vncserver.conf写入以下内容description VNC Server author Your Name start on runlevel [2345] stop on runlevel [!2345] respawn respawn limit 10 5 setuid yourusername setgid yourusername exec /usr/bin/vncserver :1 -geometry 1280x720 -depth 24这里有几个关键点需要说明。setuid和setgid指定了运行 VNC 服务的用户身份必须换成你自己的用户名。不要用 root 去跑 VNC否则会有一堆权限问题而且客户端连接后桌面环境的行为也会很奇怪。-geometry 1280x720指定了虚拟桌面的分辨率你可以根据自己的显示器调整。-depth 24指定了颜色深度24 位色对于大多数场景已经足够了再高会显著增加带宽占用。保存文件后用以下命令启动服务sudo start vncserver如果启动失败可以查看日志sudo tail -f /var/log/upstart/vncserver.log日志里通常会给出具体的错误原因比如权限不足、端口被占用、xstartup 执行失败等。4.2 多用户环境下的显示编号分配如果一台机器上有多个用户都需要远程桌面每个用户需要分配不同的显示编号。比如用户 A 用 :1用户 B 用 :2用户 C 用 :3。每个用户在自己的主目录下维护独立的~/.vnc/xstartup和密码文件互不影响。在 Upstart 配置里你可以为每个用户创建一个单独的配置文件比如vncserver-userA.conf、vncserver-userB.conf分别指定不同的setuid和显示编号。这样管理起来比较清晰也方便单独启停某个用户的服务。注意显示编号不能重复。如果两个用户都用了 :1第二个启动的会失败。你可以用vncserver -list查看当前已经占用的显示编号。4.3 分辨率与颜色深度的取舍分辨率和颜色深度是影响 VNC 使用体验的两个关键参数。分辨率越高画面越清晰但传输的数据量也越大。颜色深度越高色彩越丰富但同样会增加带宽消耗。在 14.04 这个老系统上很多机器的显卡性能有限网络带宽也可能不太充裕。所以我的建议是分辨率设置在 1280x720 到 1600x900 之间颜色深度用 24 位。这个组合在清晰度和流畅度之间取得了比较好的平衡。如果你发现操作有明显卡顿可以先把颜色深度降到 16 位试试通常能明显改善流畅度但画质会有所下降。另外TightVNC 支持一种叫做“JPEG 质量”的参数可以在客户端连接时调整。降低 JPEG 质量可以减少带宽占用但画面会出现压缩伪影。这个参数在客户端设置里可以找到根据实际网络情况调整即可。5. 常见故障的排查思路与修复方法5.1 连接后黑屏或只有鼠标指针这是最常见的问题根本原因通常是 xstartup 没有正确启动桌面环境。排查步骤如下首先确认 xstartup 文件的内容是否正确。用cat ~/.vnc/xstartup看一下确保里面有exec startxfce4这一行而且没有语法错误。其次确认 xstartup 有可执行权限用ls -l ~/.vnc/xstartup检查。如果没有执行权限用chmod x加上。如果这两步都没问题那可能是 XFCE 的某些依赖没有装全。可以试着在服务器上直接运行startxfce4看看有没有报错信息。如果有报错根据提示安装缺失的包。还有一种可能是 VNC 会话启动时环境变量没有正确设置。可以在 xstartup 里加上export PATH/usr/bin:/usr/sbin:/bin:/sbin确保基本的路径变量存在。5.2 端口被占用导致启动失败如果你看到类似“A VNC server is already running as :1”的提示说明 :1 显示编号已经被占用了。这时候有两个选择要么用vncserver -kill :1把原来的会话杀掉要么换一个显示编号比如vncserver :2。如果vncserver -kill也杀不掉可能是进程卡死了。可以用ps aux | grep vnc找到对应的进程 ID然后用kill -9强制结束。之后再重新启动。提示在 Upstart 配置里如果设置了respawn服务被杀掉后会自动重启。如果你在调试阶段不想让它自动重启可以先把respawn那行注释掉调试完再打开。5.3 客户端连接超时或拒绝连接连接超时通常意味着网络不通或者防火墙拦截了 5901 端口。先在服务器上用netstat -tlnp | grep 5901确认端口在监听。如果端口没监听说明 VNC 服务没启动成功回去检查服务状态和日志。如果端口在监听但客户端还是连不上那可能是防火墙的问题。Ubuntu 14.04 默认没有开启 ufw 防火墙但如果你手动开过需要放行 5901 端口sudo ufw allow 5901/tcp如果服务器在云平台上还需要检查云平台的安全组规则确保 5901 端口对客户端 IP 开放。5.4 桌面环境卡顿或响应缓慢VNC 的流畅度受网络带宽、服务器性能、客户端解码能力等多方面因素影响。如果感觉操作明显卡顿可以从以下几个方面优化降低分辨率比如从 1920x1080 降到 1280x720。降低颜色深度从 24 位降到 16 位。在客户端设置里降低 JPEG 质量。关闭桌面环境里不必要的视觉效果比如窗口动画、阴影、透明效果等。XFCE 的设置管理器里可以找到这些选项。如果服务器本身性能就很弱比如只有 1GB 内存的老机器那可能还需要考虑换一个更轻量的桌面环境比如 LXDE 或者 IceWM。这些桌面环境对系统资源的占用更少在 VNC 下跑起来会更流畅。6. 长期使用中的维护经验与安全建议6.1 定期清理无用的 VNC 会话VNC 会话如果长时间不关闭会一直占用内存和显示端口。如果你经常连接和断开可能会积累一堆僵尸会话。定期用vncserver -list查看当前有哪些会话在跑把不需要的用vncserver -kill :编号清理掉。在 Upstart 配置里可以设置respawn limit来限制自动重启的次数避免某个会话反复崩溃又反复重启把系统资源耗尽。6.2 密码管理与访问控制VNC 的密码文件存放在~/.vnc/passwd是用vncpasswd命令生成的。这个文件是经过加密的但加密强度不高。如果你的环境对安全性要求比较高建议定期更换密码并且不要用太简单的密码。另外VNC 默认只监听所有网络接口。如果你只想让本机或者特定网段访问可以在启动参数里加上-localhost这样 VNC 就只监听 127.0.0.1外部必须通过 SSH 隧道才能连接。这个做法在内网环境里很实用既方便又安全。6.3 日志监控与问题预警VNC 的日志文件在~/.vnc/目录下文件名通常是主机名:显示编号.log。里面记录了会话启动、客户端连接、错误信息等内容。定期查看日志可以提前发现一些潜在问题比如磁盘空间不足、权限异常、依赖库缺失等。如果你把 VNC 用在生产环境里建议配置一个简单的日志监控脚本当日志里出现特定错误关键字时自动发送告警。这样可以在问题影响业务之前就介入处理。6.4 系统升级与兼容性考量Ubuntu 14.04 已经停止官方支持这意味着不再有安全更新和软件包更新。如果你的 VNC 服务需要长期运行建议评估一下是否有升级系统的可能性。如果实在不能升级那至少要把 VNC 相关的软件包锁定在当前版本避免因为误操作导致版本冲突。另外如果你在 14.04 上用的是第三方源安装的 VNC 软件要注意这些源可能已经不再维护。定期检查源的可用性必要时切换到更稳定的安装方式。我在实际维护这类老系统的过程中最大的体会是文档和配置一定要留好。因为时间一长当初怎么配的、为什么这么配很容易忘掉。把关键的配置步骤、参数含义、排查方法记在一个单独的文件里下次遇到问题的时候能省很多时间。另外对于生产环境尽量把 VNC 服务做成可快速重建的比如写一个自动化脚本一键完成安装、配置、启动的全过程。这样即使系统出问题需要重装也能在最短时间内恢复服务。