首页/新闻资讯/正文详情

Ubuntu 16.04 VNC远程桌面配置完整指南:从安装到排障

发布时间:2026/9/24 18:29:25 来源:云帆数科 栏目:资讯中心
Ubuntu 16.04 VNC远程桌面配置完整指南:从安装到排障
如果你手头还有一台还在跑Ubuntu 16.04的机器又需要在没有接显示器的情况下把它当成一个图形工作站来用VNC应该是大部分人第一反应会想到的方案。相比RDP、X2Go这些VNC胜在跨平台、客户端多、部署简单一个安装包加一段配置就能让Windows笔记本远程操作Linux桌面。这篇文章就是我之前的完整操作记录从装桌面环境、选VNC服务端、写配置文件、做成systemd服务到客户端连不上时该从哪里排查都按实际动手的顺序写一遍适合放在运维手册里当参考。文中所有操作都基于我实际环境验证过不同内核版本、不同软件源可能略有差异但排查思路是通用的。1. 这活儿到底在做什么什么时候用得上1.1 一句话理解VNC的工作方式VNC全称Virtual Network Computing核心就是一个“屏幕共享”加“反向输入控制”的协议。服务端在你的Ubuntu 16.04上维护一个虚拟桌面客户端通过TCP端口把键盘鼠标事件发过去同时把桌面画面按帧传回来。和我们平时用到的远程控制软件原理类似只是它是开源的、跨平台的不依赖厂商云服务内网环境甚至断网机器之间都能用。我经常遇到这种需求一台Ubuntu 16.04的旧服务器放在机房角落里没有键盘、没有鼠标、也没接显示器但偶尔需要跑一次带图形界面的安装向导或者要在上面调试一个Qt程序。命令行能解决大部分问题但总是有绕不过去的时候这种场景下VNC就是最省事的方案。1.2 适用场景与不适用场景适合用的有这几种图形化安装软件、调试GUI程序、在服务器上开浏览器访问内网管理页面、临时给别人演示Linux桌面。不适合的也很明确大量视频播放或者画面频繁刷新的3D渲染任务因为VNC协议传输的是压缩位图画质越复杂带宽占用越高延迟也会随之上升。另外你要是指望VNC像本地桌面一样用GPU跑深度学习训练可视化那也得提前做好心理准备它并不擅长这种场景。2. 环境准备与方案选型2.1 我的机器环境我这次用的机器是一台戴尔的老款工作站CPU是Xeon E3内存16GB装的是Ubuntu 16.04.7 LTS内核版本4.15。VNC安装本身对硬件要求不高内存不低于2GB一般都不会有太大问题。需要注意一点Ubuntu 16.04官方软件源里的桌面组件版本比较老安装前先把源里的包索引更新一遍否则可能会在安装过程中遇到404或者版本冲突。我这里补充一个很多人忽略的检查先确认系统是64位还是32位。用uname -m看一下如果是x86_64就可以放心装如果是i386或者i686软件源里的桌面包会少很多VNC服务端的兼容性也差一些后面的方案建议换老版本的系统镜像。2.2 服务端选型tightvnc还是x11vnc还是tigervncUbuntu 16.04下常见的VNC服务端有三个tightvncserver、x11vnc、tigervncserver。它们的侧重点完全不同。tightvncserver是最主流的选择自带虚拟显示器不需要你已经有一个X会话设置简洁文档也多。x11vnc干的事情和tightvnc相反它是把你本机的真实显示器内容共享出去如果没有物理显示器它就工作不了除非配合Xvfb这类虚拟显示服务。tigervncserver更现代支持更好的压缩算法和加密扩展但在Ubuntu 16.04的官方源里不是默认包需要手动加PPA或者编译安装步骤多一些。我的建议很明确如果没有特殊需求直接用tightvncserver一条apt命令装完配置也最省心。2.3 桌面环境选择从Xfce到Unity的取舍这一步很多人会纠结是要装完整的Ubuntu桌面还是轻量桌面。默认的Unity桌面在16.04上吃得内存比较多而且如果不小心装了太多自带应用VNC首次连接时的卡顿会很明显。我更推荐Xfce轻量、稳定、兼容性好启动速度比Unity快很多日常操作完全够用。如果你确实想要接近原生Ubuntu的感觉也可以装ubuntu-desktop但我个人不太建议在远程环境里用。因为你很难享受到完整桌面带来的体验反而要面对Unity在VNC小分辨率下布局错乱、菜单栏渲染不正常这类问题。Xfce在这种场景下就扎实得多。3. 安装步骤实录3.1 更新系统与安装桌面先执行系统更新这步不能跳过sudo apt update sudo apt upgrade -y然后安装Xfce桌面。直接装xfce4和xfce4-goodies后面那个包是一组实用小工具包括文件管理器增强、剪贴板工具等按需安装即可。sudo apt install xfce4 xfce4-goodies -y这里有个经验安装完成后先不要急着重启机器。Ubuntu 16.04的桌面软件包依赖比较多有时候apt装完会提示需要重启才能加载新内核模块这个可以延后但要在后续启动VNC时留意显示管理器有没有冲突。我当时为了省时间没有装完整的gdm或者lightdm因为VNC服务端自己会创建一个新的X会话不需要系统层面的显示管理器介入。3.2 安装VNC服务端桌面装完以后安装tightvncserversudo apt install tightvncserver -y安装过程没有交互提示十几秒就能完成。装完检查一下版本tightvncserver -version能看到版本号就说明装好了。顺便说一句网上有些教程会用vnc4server这个包在16.04上也存在但它本质上和tightvncserver是同一套东西功能和配置方法几乎一样。除非你已经装了vnc4server不想动否则直接装tightvncserver就好避免同时装两个类服务端造成端口和配置冲突。3.3 初始化VNC会话并设置密码第一次启动前需要先初始化。直接用普通用户执行vncserver :1这行命令做的事情包括生成~/.vnc目录、弹出两次密码设置提示、创建默认的xstartup和日志文件然后启动一个监听在5901端口的VNC会话。密码长度在8位以内会比较保险很多老客户端对超过8位的密码会截断处理。注意第一次执行vncserver提示密码的时候会问你是否要创建只读密码这个建议选n。只读密码的权限粒度太粗登录进去能看到屏幕但不能操作一旦误开启实际使用中很容易产生“到底是谁在动桌面”的困惑。直接不创建最干净。启动成功后用ps -ef | grep vnc能看到Xvnc进程。停止这个测试会话可以执行vncserver -kill :1。4. 配置能用的VNC会话4.1 重写xstartup文件第一次启动生成的默认xstartup其实很简单只启动了一个x-window-manager连桌面环境都没有指定直接用它连过去大概率是灰屏或者黑屏。我们必须把默认文件替换掉。先编辑nano ~/.vnc/xstartup写入下面这段#!/bin/sh unset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS startxfce4 第一行是脚本声明接下来两行用于清理会话管理器和DBus的环境变量这是VNC远程会话里非常关键的细节。如果不清理Xfce启动时可能因为检测不到本地会话管理器而报错退出。最后一行启动Xfce。写完以后给脚本加执行权限chmod x ~/.vnc/xstartup很多第一次接触的人会忘记这一步导致后面vncserver怎么重启都进不了桌面问题其实就出在这里。4.2 分辨率、色彩与参数优化默认启动的会话分辨率是1024x768颜色深度是按系统默认值走的。如果显示器或者远程客户端的窗口比较大看着会很局促。我习惯直接指定分辨率启动vncserver -kill :1 vncserver :1 -geometry 1920x1080 -depth 24-geometry指定分辨率-depth 24表示24位真彩色。用户端如果分辨率比这个低VNC客户端会自动缩放但更常规的做法是按你日常使用设备的屏幕比例来设比如办公笔记本用1600x900外接2K屏的用2560x1440也跑得动。分辨率设得太高会明显增加带宽和CPU占用尤其是滚动大量文字或者打开大表格时。如果你是在内网千兆环境下用1920x1080毫无压力如果是跨公网远程操作建议降到1280x720左右。4.3 做成systemd服务手动执行vncserver有个麻烦机器一旦重启VNC服务不会自动起来。生产环境里这是不可接受的。Ubuntu 16.04用的是systemd我们可以写一个service文件把它变成系统服务。创建文件sudo nano /etc/systemd/system/vncserver.service内容如下[Unit] DescriptionVNC Server for %i Aftersyslog.target network.target [Service] Typeforking User你的用户名 Group你的用户组 WorkingDirectory/home/你的用户名 ExecStartPre/bin/sh -c test -x /usr/bin/vncserver ExecStartPre/bin/sh -c /usr/bin/vncserver -kill :%i /dev/null 21 || : ExecStart/usr/bin/vncserver :%i -geometry 1920x1080 -depth 24 -alwaysshared ExecStop/usr/bin/vncserver -kill :%i Restarton-failure [Install] WantedBymulti-user.target这里的%i是systemd模板单元的特性会把服务名里的数字自动带进来。比如 service 文件叫vncserver.service启动时执行systemctl start vncserver1%i就会被替换成1对应会话:1。要注意ExecStartPre后面的kill命令它先尝试杀掉旧的同编号会话如果杀不掉也不报错这样重复执行systemctl restart不会留下僵尸进程。写完文件后sudo systemctl daemon-reload sudo systemctl enable vncserver1 sudo systemctl start vncserver1然后看状态sudo systemctl status vncserver1看到active (running)就说明服务正常。以后重启机器VNC也会自动拉起。4.4 多会话与多用户隔离如果你想同时在机器上给多个用户开VNC会话不需要重新写服务文件直接复制一个service文件的思路就能用。比如第2个用户执行vncserver :2它就会监听5902端口登录时用第二个用户对应的密码即可。有人会问同一个用户能不能同时开两个会话答案是能但没必要。同一个用户的两个会话并不共享桌面状态你在会话1里开的窗口会话2看不到反而会消耗双倍内存和CPU排障时也容易混淆。我做过多用户环境下的VNC之后最大的感受是每个用户必须单独执行一次初始化因为~/.vnc目录是在当前用户的家目录下生成的root执行的和普通用户执行的完全是两套配置。root用户的VNC权限过大除非确实必要否则不要用root开VNC。5. 从Windows和手机连进来的客户端配置5.1 Windows平台TigerVNC Viewer服务端就绪了客户端这边其实简单很多。Windows下我推荐用TigerVNC Viewer它体积小、绿色免安装、协议兼容性好连接速度也不差。下载后打开在“VNC Server”栏输入IP:端口比如192.168.1.100:1然后回车。也可以写完整端口号192.168.1.100:5901。两种写法服务端都能识别。这里有个需要注意的地方冒号后面的数字是会话编号5901等于5900加1如果你启动的是vncserver :2那对应端口就是5902。会话编号和端口号各是各的别搞混。5.2 手机端连接有时候人不在工位上临时想用手机看一眼服务器的桌面状态这时候可以用Android或iOS上的VNC客户端比较常见的是bVNC和RealVNC Viewer。连接方式和Windows客户端一样填IP和会话编号就行。手机屏小触控操作虚拟键盘在真实桌面里会比较别扭但只要不是高频输入应急查状态、点按钮这些操作还是能胜任的。不过我的体会是手机端分辨率适配是个问题。手机屏幕普遍是细长比例服务端如果是1920x1080手机客户端会先缩放再放大局部区域操作精度下降很多。这种场景下建议给手机专门开一个低分辨率会话比如1280x720反而比硬撑高分辨率体验好。5.3 防火墙放行与本地网络限制Ubuntu 16.04默认没开ufw防火墙但有些服务器镜像里是开着的如果你发现客户端连接超时第一件事就是检查防火墙sudo ufw status如果状态是active需要放行VNC端口sudo ufw allow 5901/tcp更稳妥的做法是限制来源IP只允许公司内网网段访问sudo ufw allow from 192.168.1.0/24 to any port 5901 proto tcp假如你用的是云主机那么云平台的安全组规则也要同步放行。服务器本机的防火墙只是第一层外面还有一层安全组两层都得检查到才行。6. 常见问题与排查思路6.1 连接被拒绝Connection refused处理客户端连不上提示unable connect to socket: Connection refused这类报错在10061端口出现时尤其常见。我一般按下面这个顺序排查第一确认服务端进程还在不在。ps -ef | grep Xvnc。如果日志文件里显示没有启动看~/.vnc/目录下有没有对应的日志文件比如box01:1.log。第二确认端口有没有监听。netstat -tlnp | grep 5901。没有监听的话检查是不是systemd服务没起来或者xstartup脚本执行失败导致服务端自杀了。第三确认客户端填的IP和端口。IP尽量从服务端用ip addr核实不要凭印象填。第四防火墙和安全组都要看一眼。这一步往往是最容易被忽略的特别是云服务器场景。6.2 黑屏问题能连上、密码也正确但进去以后整个屏幕是黑色的。这个问题十有八九出在xstartup文件上。常见原因有三个文件没有可执行权限脚本里的路径写错startxfce4卡在执行了但没有注册到显示进程上。我的排查技巧是先手动启动一个测试会话直接看一下日志输出vncserver -kill :1 vncserver :1 cat ~/.vnc/box01:1.log日志里如果有类似touch: cannot touch ... Permission denied的字段多半是~/.vnc目录的属主不对。用chown或者chmod修正即可。6.3 无法在VNC里启动3D程序另一个高频问题是在VNC里运行带OpenGL的程序时直接报错比如很多人遇到过的ROS可视化工具rviz起不来。这是因为VNC默认的X环境不支持硬件GPU渲染程序找不到可用的GL上下文。我遇到时会在启动命令前加一行环境变量export LIBGL_ALWAYS_INDIRECT1或者在启动程序时临时加LIBGL_ALWAYS_INDIRECT1 rviz如果还是不行就检查显卡驱动和Xorg日志出现No devices detected时基本可以放弃硬解改用llvmpipe软渲染。性能会差一些但至少窗口能拉起来。6.4 密码错误与连接频繁掉线有时候密码明明输入正确客户端却一直报认证失败。这种情况要先确认VNC密码和系统登录密码不是同一套。VNC的密码是单独存在~/.vnc/passwd里的只能通过vncpasswd修改修改系统密码不会同步更新它。另一个容易踩的坑是如果你拿root权限启动了会话客户端也得用root的VNC密码登录而不是当前普通用户的密码。连接频繁掉线则是另一个独立问题通常和网络环境有关。无线网络下信号波动大VNC长时间空闲后客户端容易超时断开。解决方式是在客户端里开启“自动重连”选项同时把服务端启动参数加上-alwaysshared允许同一会话被反复接入。7. 安全加固与日常维护7.1 改端口换密码VNC默认不加密密码如果设置得太简单局域网里很容易被扫到。运维环境里我给出的基础安全建议有三条第一密码不要和系统账户密码一样第二不要用默认端口5900/5901第三定期更新密码。修改VNC密码用vncpasswd命令它会更新~/.vnc/passwd文件。改完后记得重启对应的VNC会话才能生效。注意执行位置不要写错普通用户执行的vncpasswd只对当前用户的VNC会话有效root用户的VNC会话得用root账户再执行一遍。7.2 用SSH隧道保护流量如果你需要跨公网操作不想把VNC端口直接暴露在公网上最稳妥的方式是先用SSH打通隧道再让VNC客户端走隧道访问。这是运维里比较标准的做法。具体逻辑是不在防火墙上放行5901端口只保留SSH的22端口然后在本机执行SSH端口转发命令把远程会话映射到本地端口上。操作起来步骤如下ssh -L 15901:127.0.0.1:5901 -N -f 用户名服务器IP然后VNC客户端连接127.0.0.1:15901。流量会经过SSH加密端口也不需要对外开放安全性提升非常明显。7.3 磁盘占用与进程清理VNC跑久了会在~/.vnc目录下积累大量日志尤其是经常崩溃重连的会话日志文件可能长到几百MB。我养成的习惯是每个月做一次清理把对应的日志文件用truncate清掉内容而不是直接删文件。直接删有可能导致VNC进程拿着文件句柄继续写空间不会真正释放。进程清理也有讲究。如果vncserver -kill :1杀不干净用ps -ef | grep vnc找到残留的Xvnc进程再kill掉。但不要使用pkill -9 vnc这种全杀命令它会把正在运行的会话全部干掉哪怕那个会话是别人正在使用的。最后再分享一个实在的经验在Ubuntu 16.04这类老系统上VNC相关坑和Ubuntu 20.04以上的差别不小。你如果照着新版教程来做老系统很可能会被软件源版本、依赖关系折腾一番。所以排查问题时第一件事永远是先确认系统版本和服务端版本再动手改配置。VNC本身不复杂绝大多数问题都出在“服务没起、端口没通、桌面没启动”这三件事上。把这三点从头到尾验证一遍基本能把九成故障解决掉。

相关推荐

用AI教孩子管压岁钱:打造家庭财商启蒙系统
用AI教孩子管压岁钱:打造家庭财商启蒙系统

你是不是也说过这句话:“压岁钱妈妈先帮你存着,等你长大了给你。”说的时候理直气壮,孩子点头也点得挺配合,但几年后你发现,孩子不仅对这笔钱完全没概念,甚至开始偷偷翻你钱包、对你的“存着”产生信任危机… · 2026/9/24 18:29:19

AI压岁钱教练:用对话式大模型帮孩子建立财商
AI压岁钱教练:用对话式大模型帮孩子建立财商

1. 为什么“帮你存着”这句话,是压岁钱教育里最失败的一步每年春节后,我朋友圈里都会出现一批“云储蓄”家长。孩子前脚刚把红包递过来,后脚就换来一句“妈妈先帮你存着”,然后这笔钱就像被黑洞吸走一样再也没出现过。孩子追问起来… · 2026/9/24 18:29:19

AI检测原理拆解:零成本手动改写去AI痕迹全攻略
AI检测原理拆解:零成本手动改写去AI痕迹全攻略

写这篇东西的起因,是我上周在一个写作群里看到一位新手作者发的求助:他用AI生成了文章,结果发出去没两天,后台提示“疑似AI生成内容,推荐量受限”,阅读直接掉到两位数。群里炸了锅,有人说用某某… · 2026/9/24 18:29:19

GPT 6 Astra vs Opus 5.5:同一张“鹈鹕骑自行车”,不同思考档位能差多少?
GPT 6 Astra vs Opus 5.5:同一张“鹈鹕骑自行车”,不同思考档位能差多少?

可以。下面我直接按 CSDN/技术博客 的风格给你整理一版,图片位置也一起放进去。为了避免把单次样例说成普遍结论,我会把文章定位成一次 实际体验对比。 GPT 6 Astra vs Opus 5.5:同一张“鹈鹕骑自行车”,不同思考档位能差多少&… · 2026/9/24 19:07:21

手机存储空间不足别只清缓存:从原理到实操的完整清理指南
手机存储空间不足别只清缓存:从原理到实操的完整清理指南

我手机里最常出现的"劝退"信号,从来不是卡顿,而是那条怎么躲都躲不掉的"存储空间不足"。64G的老机型,连哄带骗用了三年,最后连在朋友圈发张照片都得先腾地方。真正开始琢磨这个问题,是我发现系统自… · 2026/9/24 19:07:14

ARIMA+SVM混合模型:股票价格预测的残差建模与Python实战
ARIMA+SVM混合模型:股票价格预测的残差建模与Python实战

简介:这份资源面向具备一定MATLAB基础、希望入门时间序列与机器学习组合建模的金融数据分析学习者,核心是用支持向量机改进ARIMA股票价格预测。包内共3个文件,以2个m脚本和1个xlsx数据表为主,压缩包约13KB,脚本承担ARI… · 2026/9/24 19:07:14

shadcn-vue Navigation Menu 组件实战:基于 reka-ui 构建可访问的网站导航栏
shadcn-vue Navigation Menu 组件实战:基于 reka-ui 构建可访问的网站导航栏

shadcn-vue Navigation Menu 组件实战:基于 reka-ui 构建可访问的网站导航栏 【免费下载链接】shadcn-vue Vue port of shadcn-ui 项目地址: https://gitcode.com/gh_mirrors/sh/shadcn-vue Navigation Menu 是 shadcn-vue 提供的用于网站导航的组件集合&… · 2026/9/24 19:07:14

Node.js服务端开发实战:从事件循环到异步I/O与部署
Node.js服务端开发实战:从事件循环到异步I/O与部署

先说清楚一件事:Node.js 不是一门语言,也不是一个框架,它是一个“服务端运行时环境”。很多人刚接触的时候,下载安装完 Node.js,打开一个黑乎乎的终端敲了两行代码,然后问我:“所以这东西到底解… · 2026/9/24 19:07:08

kpartx命令详解:轻松挂载多分区磁盘镜像
kpartx命令详解:轻松挂载多分区磁盘镜像

1. kpartx 到底解决什么问题:从一次“挂不上镜像”说起 做嵌入式Linux开发、玩树莓派镜像、或者帮朋友恢复一张整盘备份的人,几乎都遇到过同一个尴尬:手里拿到一个 xxx.img 文件,明明里面有好几个分区,用 mount -o … · 2026/9/24 19:07:08

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码