Ubuntu 14.04 无头机器远程桌面:TigerVNC 安装配置与避坑指南 1. 为什么还要折腾一台老系统的远程桌面手里头还跑着 Ubuntu 14.04 的机器说实话现在不算少见。工控机、老旧的测试设备、某些只认旧内核的采集卡配套主机甚至一些嵌入式开发板系统版本被死死锁在 14.04 上动都动不了。这些机器通常没有接显示器放在机柜里或者角落里需要图形界面的时候只能靠远程桌面连过去操作。VNC 就是干这个的。它把整台机器的桌面环境通过网络搬到你眼前鼠标键盘操作跟坐在机器前面几乎一样。跟 SSH 的区别在于SSH 只能敲命令而 VNC 能让你看到完整的图形界面跑那些必须点鼠标才能用的工具比如某些老版本的配置软件、波形查看器、或者基于 Qt 的采集程序。这篇文章面向的是手里有 Ubuntu 14.04 机器、需要远程图形界面、但又不想重装系统的朋友。我会把整个安装配置过程拆开讲清楚包括为什么这么选、每一步在干什么、参数怎么定、踩过的坑怎么绕。Ubuntu 14.04 这个版本比较特殊它的软件源、桌面环境、初始化系统都跟后来的版本有差异网上很多新教程直接套用会出问题所以这里专门针对 14.04 来讲。需要提前说明的是VNC 传输本身是不加密的默认情况下数据在网络上裸奔。所以这套方案只适合在受控的内网环境里用比如机房内部、实验室局域网。如果要在不可信网络里用得额外套一层加密通道这个后面会提。另外 Ubuntu 14.04 已经停止官方支持很久了软件源需要换成归档地址才能正常安装这是第一个要解决的问题。2. 方案选型与前置准备2.1 为什么选 TigerVNC 而不是其他Ubuntu 上能用的 VNC 服务端有好几个常见的有 TightVNC、TigerVNC、x11vnc还有 RealVNC 的商业版。在 14.04 这个环境下我最终选的是 TigerVNC理由有这么几条。TightVNC 在老系统上兼容性不错但它的剪贴板同步经常出问题复制粘贴中文的时候容易乱码而且高分辨率下的性能一般。x11vnc 的思路不一样它是直接共享当前已经存在的 X 会话也就是说机器上必须已经有一个登录的图形会话它才能用对于无头机器没接显示器、没登录桌面就不太合适。RealVNC 商业版功能全但免费版限制多而且授权管理麻烦。TigerVNC 的优势在于它自己启动一个独立的 X 会话不依赖物理显示器无头机器也能用性能在同类里算好的支持多种编码方式剪贴板同步相对稳定而且它在 14.04 的软件源里就有安装方便。虽然 TigerVNC 后来版本变化挺大但 14.04 源里那个版本足够稳定用着没问题。提示如果你只是偶尔连一下、机器上本来就开着图形界面x11vnc 可能更省事。但如果是长期无头运行、需要独立会话TigerVNC 是更稳妥的选择。2.2 系统源的处理Ubuntu 14.04 的官方源早就移到归档服务器了直接apt-get update会报一堆 404。所以第一步是把源地址改掉。打开/etc/apt/sources.list把里面所有archive.ubuntu.com和security.ubuntu.com替换成old-releases.ubuntu.com。用 sed 一条命令就能搞定sudo sed -i s/archive.ubuntu.com/old-releases.ubuntu.com/g /etc/apt/sources.list sudo sed -i s/security.ubuntu.com/old-releases.ubuntu.com/g /etc/apt/sources.list sudo apt-get update这一步不做后面什么都装不上。我见过有人卡在这里半天以为是网络问题其实是源地址失效了。2.3 桌面环境的确认TigerVNC 启动的会话需要一个桌面环境来渲染。Ubuntu 14.04 默认装的是 Unity但这个桌面环境比较重而且对 VNC 会话的支持不算好容易出现窗口管理器冲突。我的建议是装一个轻量的桌面环境比如 Xfce 或者 LXDE。Xfce 在 14.04 上很成熟资源占用低跟 VNC 配合稳定。sudo apt-get install xfce4 xfce4-goodies如果你机器上已经有 GNOME 或者 KDE也能用但配置起来要多调几个地方。为了简单起见下面都以 Xfce 为例。装完之后不用管它VNC 会话启动的时候会指定用 Xfce 作为桌面。2.4 安装 TigerVNC 服务端sudo apt-get install tigervncserver装完之后可以确认一下版本vncserver -version14.04 源里的版本大概是 1.3.x 这个级别够用了。注意包名是tigervncserver不是tigervnc-standalone-server后者是后来版本的包名在 14.04 上装不到。3. 核心配置与启动流程3.1 首次启动与密码设置TigerVNC 第一次启动的时候会让你设置一个访问密码。直接运行vncserver它会提示你输入密码这个密码是连接时用的跟系统登录密码是两回事。密码长度最多 8 位这是 VNC 协议本身的限制不是 TigerVNC 的问题。输入完之后它会问你要不要设一个只读密码view-only一般选 n 就行。启动成功后它会告诉你会话号比如:1对应的端口是 5901。VNC 的端口规则是 5900 加上会话号所以:1就是 5901:2就是 5902以此类推。这时候其实已经能连了但连上去看到的桌面可能不太对因为默认的启动脚本用的是很简陋的配置。所以下一步是改配置文件。3.2 配置文件的位置与内容TigerVNC 的配置文件在用户主目录下的.vnc文件夹里主要两个文件xstartup和config。xstartup决定了 VNC 会话启动时执行什么也就是启动哪个桌面环境。默认的内容大概是启动一个很基础的 twm 窗口管理器界面丑而且不好用。我们要把它改成启动 Xfce。先停掉刚才启动的会话vncserver -kill :1然后编辑~/.vnc/xstartup把它改成这样#!/bin/sh unset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS exec startxfce4这里解释一下这几行的作用。unset SESSION_MANAGER和unset DBUS_SESSION_BUS_ADDRESS是为了清掉可能从系统环境继承过来的变量避免跟 VNC 自己的会话冲突。如果不加这两行有时候会出现桌面启动到一半卡住、或者窗口管理器报错的情况。exec startxfce4就是启动 Xfce 桌面。改完之后给执行权限chmod x ~/.vnc/xstartupconfig文件是 TigerVNC 的运行参数可以设分辨率、色深、是否允许剪贴板等。一个常用的配置geometry1440x900 depth24 localhostno alwayssharedgeometry是分辨率根据你本地屏幕来定别设得比本地屏幕还大不然要滚动。depth24是色深24 位真彩色画质好带宽占用也能接受。如果网络特别差可以降到 16。localhostno表示允许从其他机器连接如果设成 yes 就只能本机连。alwaysshared允许多个客户端同时连同一个会话方便协作或者多设备切换。3.3 启动脚本与开机自启手动敲vncserver启动太麻烦而且重启机器后就没了。可以写一个 systemd 服务来实现开机自启。Ubuntu 14.04 用的是 Upstart 而不是 systemd所以这里要用 Upstart 的写法放在/etc/init/vncserver.confdescription VNC Server start on runlevel [2345] stop on runlevel [!2345] respawn exec su - youruser -c /usr/bin/vncserver :1 -geometry 1440x900 -depth 24把youruser换成实际的用户名。这样开机就会自动启动:1会话。注意 Upstart 和 systemd 的语法完全不同网上很多 systemd 的教程在 14.04 上直接抄会失败这是常见的坑。注意用 Upstart 启动的时候环境变量可能跟手动登录时不一样如果xstartup里依赖某些 PATH 或者环境变量最好在脚本里显式设置避免启动失败。3.4 防火墙与端口如果机器开了防火墙需要放行 5901 端口或者你用的会话号对应的端口。Ubuntu 14.04 默认的 ufw 一般是关闭的但如果开了sudo ufw allow 5901/tcp如果是 iptables 直接管理就加对应的规则。这一步不做的话连接会一直超时但机器上看起来一切正常容易误判成 VNC 没启动。4. 连接测试与常见问题排查4.1 客户端连接服务端配好之后用 VNC 客户端连。客户端软件很多Windows 上可以用 TightVNC Viewer、RealVNC ViewerLinux 上可以用vncviewer命令macOS 自带的屏幕共享也能连。连接地址填机器IP:1或者机器IP:5901两种写法都行。连上之后输入之前设的密码应该就能看到 Xfce 桌面了。第一次连可能会提示证书或者加密相关的警告选继续就行因为 VNC 本身不加密这个提示是正常的。4.2 黑屏或者只有灰底这是最常见的问题连上了但桌面出不来只有一片灰或者黑。原因基本都在xstartup上。要么是脚本没执行权限要么是启动的桌面环境命令不对要么是环境变量冲突。排查步骤先看~/.vnc/目录下的日志文件名字类似机器名:1.log里面会记录启动过程中的报错。如果看到startxfce4: command not found说明 Xfce 没装好或者路径不对。如果看到 dbus 相关的错误就是前面说的环境变量没清干净。还有一种情况是xstartup里用了exec但前面还有别的命令没加导致卡住。记住exec是替换当前进程它后面不能再有别的命令。4.3 剪贴板不同步VNC 的剪贴板同步有时候不灵复制了东西粘不过去。这跟客户端和服务端的实现都有关系。TigerVNC 服务端这边确保config里没有禁用剪贴板相关的选项。客户端那边有些客户端默认关闭了剪贴板同步需要在设置里打开。如果还是不行可以装一个autocutsel来辅助sudo apt-get install autocutsel然后在xstartup里exec startxfce4之前加上autocutsel -fork autocutsel -selection PRIMARY -fork它会在后台同步 X 的剪贴板能解决大部分复制粘贴的问题。4.4 分辨率不对或者无法调整分辨率是在启动时通过-geometry参数或者config文件定的启动之后再改就不生效了。如果连上去发现分辨率不对先 kill 掉会话改配置再重新启动。vncserver -kill :1 vncserver :1 -geometry 1920x1080 -depth 24注意分辨率不能超过客户端屏幕太多否则操作起来要不停滚动很难受。一般设成跟本地屏幕一样或者略小一点最舒服。4.5 连接被拒绝或者超时分几种情况。如果是Connection refused说明端口没开或者服务没起来检查vncserver进程在不在端口有没有监听ps aux | grep vnc netstat -tlnp | grep 5901如果是超时多半是防火墙或者网络不通先 ping 一下机器再检查防火墙规则。还有一种可能是config里设了localhostyes只允许本机连外部就连不上改成 no 即可。4.6 常见问题速查表现象可能原因处理方式黑屏/灰底xstartup 配置错误检查执行权限和桌面启动命令连接被拒服务未启动或端口未监听检查进程和端口确认 config 中 localhostno连接超时防火墙拦截放行对应端口剪贴板失效同步未开启安装 autocutsel 并在 xstartup 中启动分辨率不对启动参数未生效kill 会话后重新用 -geometry 启动中文显示方块缺少中文字体安装中文字体包桌面卡顿色深过高或网络差降低 depth 到 165. 安全加固与性能调优5.1 传输加密的必要性前面反复提到VNC 协议本身不加密密码和画面数据都是明文传输。在内网里问题不大但如果网络环境不完全可信就必须加一层保护。最常用的做法是通过 SSH 隧道转发 VNC 端口。具体来说在客户端这边执行ssh -L 5901:localhost:5901 user目标机器这样本地的 5901 端口就通过 SSH 加密通道转发到了目标机器的 5901。然后 VNC 客户端连localhost:1就行了数据全程走 SSH 加密。这个方案不需要改服务端任何配置只要 SSH 能连上就行非常方便。提示用 SSH 隧道的时候服务端的config里可以把localhost设成 yes这样只有本机能连 VNC 端口外部即使知道端口也连不上安全性更高。5.2 密码与访问控制VNC 密码最多 8 位而且加密强度有限所以不要用太简单的密码。另外可以定期更换改密码用vncpasswd它会重新设置~/.vnc/passwd文件。这个文件的权限要是 600只有属主能读否则 TigerVNC 会拒绝启动。如果多人使用可以给每个人分配不同的会话号和端口各自独立互不干扰。alwaysshared选项要慎用开了之后任何人都能连同一个会话适合协作但不适合有隐私要求的场景。5.3 性能调优的几个参数VNC 的性能主要受分辨率、色深、编码方式影响。分辨率越高、色深越大数据量越大网络差的时候就越卡。在config里可以调这些depth16 比 24 省带宽但颜色会有损失看文字为主的场景 16 够用。geometry按需设别盲目追求大。compresslevel压缩级别0 到 9越高越省带宽但越费 CPU。老机器 CPU 弱的话别设太高5 左右比较平衡。qualityJPEG 压缩质量1 到 100越低越省带宽但画质越差。文字场景可以设 6 到 8 这个级别注意这个参数在不同版本里取值范围不一样14.04 的版本里是 0 到 9。这些参数没有万能值得根据实际网络和机器性能试。我的经验是内网千兆环境下1440x900、24 位色、压缩 5用起来基本跟本地差不多。如果是跨网段或者无线就得降分辨率或者色深。5.4 日志与监控VNC 的日志在~/.vnc/下每个会话一个日志文件。出问题的时候第一时间看日志比瞎猜快得多。日志里会记录启动过程、连接记录、报错信息。如果日志文件太大可以定期清理或者配置日志轮转。另外可以写个简单的监控脚本定期检查 VNC 进程和端口挂了就自动重启。Upstart 的respawn已经能处理进程崩溃的情况但如果是配置问题导致启动失败respawn 会一直重试这时候就得看日志找原因了。6. 实操中的经验与避坑总结6.1 几个容易忽略的细节第一个是用户权限问题。VNC 服务是以某个用户身份跑的那个用户必须对~/.vnc目录有读写权限xstartup要有执行权限。如果是以 root 跑很多桌面环境会拒绝启动所以别用 root。第二个是 locale 设置。如果系统 locale 没配好Xfce 启动的时候可能报错或者界面显示异常。检查/etc/default/locale确保有合理的LANG设置比如en_US.UTF-8或者zh_CN.UTF-8。中文环境还要装中文字体否则中文全是方块。第三个是多个会话的端口冲突。如果你启动了:1又想启动:1会报错。要么 kill 掉旧的要么用新的会话号。查看当前有哪些会话vncserver -list6.2 我踩过的坑有一次在一台工控机上配 VNC怎么都连不上日志里也没明显报错。折腾半天发现是那台机器的 hosts 文件里主机名解析有问题导致 VNC 启动时卡在解析主机名上。后来在/etc/hosts里加了一行127.0.0.1 主机名就好了。这个坑很隐蔽因为表面上看服务是启动了的但实际没完全起来。还有一次是剪贴板死活不同步装了 autocutsel 也不行。最后发现是客户端的问题换了个客户端就好了。所以遇到问题要两边都排查别只盯着服务端。另外 Upstart 的启动脚本里如果su - youruser后面的命令路径写的是相对路径开机自启会失败因为 Upstart 的工作目录跟登录 shell 不一样。所有命令都用绝对路径最保险。6.3 关于老系统的维护建议Ubuntu 14.04 毕竟太老了软件源虽然能用归档地址但很多新软件装不上安全更新也没有了。如果条件允许还是建议逐步迁移到新系统。但如果短期内必须用那就把该做的安全措施做到位VNC 只监听内网、用 SSH 隧道、密码设复杂点、定期检查日志。另外可以把整个 VNC 配置过程写成一个脚本新机器部署的时候一键执行省得每次重复劳动。脚本里包括换源、装 Xfce、装 TigerVNC、写配置文件、设权限、配 Upstart跑完重启就能用。这个脚本我后来在好几台机器上复用省了不少时间。最后再分享一个小技巧如果只是临时用一下图形界面不想配一堆东西可以用x11vnc -display :0 -once这种一次性模式连完就退出适合应急。但长期用还是 TigerVNC 这套方案更稳。