ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

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

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本身不复杂绝大多数问题都出在“服务没起、端口没通、桌面没启动”这三件事上。把这三点从头到尾验证一遍基本能把九成故障解决掉。
返回列表