ARTICLE DETAIL

资讯详情

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

Linux VNC远程桌面安装全攻略:在线与离线部署实战

Linux VNC远程桌面安装全攻略:在线与离线部署实战 最近帮朋友处理了几台内网服务器要图形化部署工具的活儿遇到最多的就是VNC远程桌面的安装问题。要么机器没法联网yum装不了包要么手动下载rpm包之后被依赖关系折磨到怀疑人生折腾一整天桌面还是黑屏的。想了下干脆把VNC在线和离线安装的完整流程、rpm包怎么找、依赖怎么处理、服务端怎么配、客户端怎么连全部串起来写一篇照着抄就行。这篇东西适合所有需要在Linux上开远程桌面的朋友不管是CentOS、Ubuntu还是国产麒麟系统不管是能联网的环境还是彻底隔离的内网思路和命令基本都是通用的。我尽量把每一步的原理和坑都讲透而不是只丢几条命令让你背。1. 先说清楚VNC远程桌面到底解决什么问题1.1 VNC的原理和适用场景VNCVirtual Network Computing的原理其实特别朴素它把远程主机的屏幕图像通过网络实时转发给客户端同时把客户端的键盘鼠标事件回传给主机。说白了你看到的是实实在在的图形桌面画面不是像SSH那样只能敲命令行。正因为这个特性VNC最适合的场景就这几类服务器上跑了图形化配置工具比如数据库安装向导、磁盘管理工具人不在机房没法点鼠标内网隔离环境下的图形应用演示需要把桌面共享给别的人看领导或者同事需要远程操作一台Linux桌面但对方只会用鼠标不会敲命令虚拟机或云主机没有接物理显示器出问题时要看到桌面才能排查。我第一次正经用VNC是帮一台放在弱电间的CentOS服务器装商业数据库安装向导是图形界面的SSH连上去完全没法下一步最后就是靠VNC一条通道搞定的。所以记住这个定位VNC是命令行之外的一双眼睛它不是用来替代SSH做批量运维的而是专门解决必须看到图形界面这类问题的。1.2 在线安装和离线安装到底怎么选这是个决策问题我的原则很简单只要目标机器能访问系统自带的软件源也就是yum/dnf/apt能联网拉到包一律走在线安装。省事依赖自动解决版本也经过发行版测试验证过出问题概率最低只有在内网隔离、完全无法访问软件源的场景下才考虑离线安装也就是手动把rpm包下载好拷贝进去再装。这里有个很大的坑很多人把离线理解成我有网络只是目标机器没网然后直接跑到各种下载站随便下了一个VNC的rpm包拷到服务器上一装报依赖缺失再跑去搜另一个依赖包装完又报还缺直接陷入依赖地狱。后面我会专门讲怎么系统性地解决依赖问题避免走这条路。1.3 服务端软件选型TigerVNC、RealVNC、x11vnc怎么选Linux下常见的VNC服务端主要有三个阵营我直接说结论服务端维护状态适用场景备注TigerVNC活跃企业Linux/服务器优先选择CentOS/RHEL/Fedora自带仓库就有systemd管理方便RealVNC Server商业免费版跨平台、需要加密增强个人免费版够用但二进制要官网下载x11vnc活跃已有图形桌面、只做镜像转发不创建新会话只共享当前桌面性能开销小我默认推荐TigerVNC。原因很直接主流Linux发行版的仓库里都有命令统一vncserver/vncpasswd/vncviewersystemd单元文件集成度高配置改动后直接重启服务就行。本文后续所有实操都以TigerVNC为例其他服务端思路大同小异命令换个名字而已。2. 在线安装yum和apt一分钟装好VNC Server2.1 RHEL/CentOS系的在线安装在CentOS 7、RHEL 7、Rocky Linux、AlmaLinux这类系统上在线安装极其简单两条命令的事# 先确认系统版本避免下载了不匹配的包 cat /etc/redhat-release # CentOS 7/RHEL 7用yumCentOS 8/RHEL 8建议dnf命令参数一样 yum install -y tigervnc-server # 或者 dnf install -y tigervnc-server装完检查一下确认成功rpm -qa | grep tigervnc能看到类似tigervnc-server-1.13.1-3.el9.x86_64的输出就说明装好了。这里要特别提醒大家区分两个包tigervnc-server是服务端tigervnc不带-server后缀是客户端工具。你在服务器上只需要装服务端vncviewer那个客户端通常装在你自己的电脑或跳板机上。2.2 Debian/Ubuntu系的在线安装Debian和Ubuntu用的是apt安装命令也很直接# 先更新源索引再安装 apt update apt install -y tigervnc-standalone-server tigervnc-common这里必须要指出一个版本差异Ubuntu 18.04及之前的仓库里默认的VNC服务端包叫vnc4server或者tightvncserver属于比较老旧的实现了。如果你用的是20.04及以上版本直接装tigervnc-standalone-server就行。很多网上教程比较老会教你apt install tightvncserver在新版系统上虽然也能装但功能上肯定不如新维护的TigerVNC完整。2.3 银河麒麟等国产系统的在线安装现在国产系统的使用场景越来越多相关提问也特别多。银河麒麟、中标麒麟、统信UOS这些系统的底层来源各不相同要区别对待银河麒麟V10X86架构底层基于CentOS技术路线包管理就是yum/dnf在线安装直接yum install -y tigervnc-server部分版本的软件源配置不完整或者内网镜像只同步了基础包这时候yum可能报找不到包就只能按离线方案处理ARM架构的机器比如飞腾、鲲鹏芯片的服务器安装时要注意包架构是aarch64不是x86_64下错包必然装不上。遇到国产系统装包失败我有个小技巧先看/etc/os-release里的ID和VERSION_ID字段再用yum repolist检查源是否可用。很多时候问题真不是系统本身而是源的mirror地址被改成了内网地址但没生效或者没有对应的发行版源。3. 离线安装rpm包下载与依赖处理全流程这是整篇文章的重头戏也是标题最大的关键词所在。离线安装VNC本质上就四步准备环境、找包下载、分析依赖、按序安装。每一步都有讲究。3.1 准备工作确认系统版本和架构别下错包离线安装的第一步不是下载而是搞清楚三件事操作系统的发行版和具体版本号CentOS 7还是RHEL 8麒麟V10还是其他CPU架构x86_64还是aarch64需要哪些依赖包、依赖关系怎么理用这几条命令一次性搞定cat /etc/os-release uname -m rpm --versionos-release能看到系统的ID和版本号uname -m确认架构rpm --version确认rpm工具本身可用。我见过太多人辛辛苦苦下载了x86_64的rpm包结果目标机器是ARM架构或者把el7的包装到el9上最后装不上还以为是系统坏了。这一步确认好后面可以少走很多弯路。3.2 获取rpm包的正确姿势离线安装的前提是有一台可以联网的下载机而且这台下载机的发行版、版本、架构最好和目标机器保持一致。否则你下载的包可能依赖于目标机上根本没有的库到时候排依赖排到崩溃。方式一yumdownloader 自动拉取在联网机器上如果配置了和目标机器同版本的软件源最推荐的方式是# 安装yum-utils工具包 yum install -y yum-utils # 下载tigervnc-server--resolve会把所有依赖一起拉下来 yumdownloader --resolve tigervnc-server加--resolve参数后yum会把安装这个包所需的所有依赖rpm文件自动下载到当前目录这会省去大量手动分析依赖的工作。这是我最常用的方式强烈推荐。方式二repoquery查依赖再单独下载如果你没有yumdownloader或者需要精确控制下载哪些包可以先查依赖清单# 安装yum-utils后就有repoquery命令 yum install -y yum-utils # 查看tigervnc-server的完整依赖列表 repoquery --requires --resolve tigervnc-server输出会列出所有依赖包名然后再用yumdownloader 包名逐个下载。方式三直接从镜像站手工下载没有yumdownloader工具时也可以直接访问国内各大镜像站在目录树里按路径找包# 以清华镜像源为例CentOS 7 x86_64的包路径 https://mirrors.tuna.tsinghua.edu.cn/centos/7/os/x86_64/Packages/ # 或者EPEL扩展源路径部分包在扩展源里 https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/Packages/在页面里搜tigervnc-server找到类似tigervnc-server-1.8.0-24.el7.x86_64.rpm的文件右键复制链接下载即可。这种方式适合只缺一两个包的情况如果依赖链条长一个个手动找会非常痛苦。方式四翻本地缓存碰运气如果机器以前能联网、只是现在断网了可以看看/var/cache/yum/yum缓存或/var/cache/dnf/dnf缓存下有没有缓存的rpm包有时候系统自动更新留下的缓存正好有你需要的版本。3.3 rpm命令详解与本地安装拿到rpm包之后在下机联网机器上可以先做验证确认包没问题再往目标机器拷# 查看rpm包基础信息确认版本、架构、供应商 rpm -qpi tigervnc-server-1.13.1-3.el9.x86_64.rpm # 查看这个包依赖哪些动态库或能力 rpm -qpR tigervnc-server-1.13.1-3.el9.x86_64.rpm把rpm包通过U盘、scp或者内网共享拷贝到目标机器后安装命令是# 单个包安装不会自动解决依赖 rpm -ivh tigervnc-server-1.13.1-3.el9.x86_64.rpm # 如果报依赖缺失可以把多个包一起安装rpm会一起处理 rpm -ivh tigervnc-server-*.rpm libX11-*.rpm glib2-*.rpm # 强制安装跳过所有依赖检查谨慎使用 rpm -ivh --nodeps tigervnc-server-*.rpm提示--nodeps是双刃剑。有时候依赖缺失但软件本身能跑比如某些依赖库只在特定功能下才需要这时候用--nodeps能快速装完但可能埋下隐患。我的建议是先用正常方式装如果依赖确实卡死再查清楚缺失依赖的影响面判断能不能用--nodeps绕过。生产环境慎用别为了图快把环境搞坏。3.4 依赖问题的处理策略依赖问题是离线安装最大的拦路虎。我的实战经验是分层处理第一层先明确缺失的依赖有哪些。rpm -ivh tigervnc-server-*.rpm # 报错会提示具体缺什么类似 # error: Failed dependencies: # libXtst.so.6()(64bit) is needed by tigervnc-server-...第二层查这个动态库或能力属于哪个包。在联网机器上用repoquery或者yum provides# 查询某个能力由哪个包提供 repoquery --whatprovides libXtst.so.6()(64bit) # 输出通常是libXtst-1.2.3-1.el9.x86_64 # yum provides也行效果类似 yum provides libXtst.so.6()(64bit)第三层补齐下载缺失的依赖包按依赖层级从底层到顶层安装。先装动态库包再装主程序包。把所有rpm包放在同一目录然后一次install是可行的但如果你对依赖顺序没把握就分开装一层一层来。第四层如果目标机器上连rpm命令都没有那就参考后面常见问题里专门讲的没找到rpm命令这节。4. 服务端配置与启动装好软件只是第一步VNC真正能连上还需要配置密码、启动服务、放行防火墙和SELinux。这一节全部走一遍。4.1 设置VNC密码VNC的密码不是系统登录密码而是VNC会话专属的用vncpasswd命令设置# 首次执行会提示输入密码二次确认还会问是否设置view-only密码 vncpasswd # 生成的密码文件默认在 ~/.vnc/passwd ls -l ~/.vnc/passwd注意VNC密码最长8位超过8位会被截断。这是个很老的限制但很多人踩坑——设了个16位强密码后面怎么连都报密码错误其实是密码被截断了。另外密码里尽量不要用单引号、双引号这类特殊字符某些客户端解析会出问题。4.2 首次启动与systemd管理现在的Linux发行版都推荐用systemd方式管理VNC服务以CentOS 7/8为例# 方法一直接启动一个会话简单粗暴适合临时用 vncserver :1 # 会在5901端口监听5900编号N # 方法二用systemd管理服务可以设置开机自启 systemctl start vncserver:1.service systemctl enable vncserver:1.service如果是systemd方式不同发行版的单元文件模板略有差异。CentOS 7下常见的配置是这样的# 修改 /etc/systemd/system/vncserver.service [Unit] DescriptionRemote desktop VNC service Aftersyslog.target network.target [Service] Typeforking Userroot ExecStart/usr/sbin/vncserver %i -geometry 1280x720 ExecStop/usr/sbin/vncserver -kill %i [Install] WantedBymulti-user.target改完后重新加载并启动systemctl daemon-reload systemctl start vncserver:1.service systemctl status vncserver:1.service注意service文件的具体路径以你自己系统上rpm -ql tigervnc-server查到的为准。有些新版TigerVNC的模板在/lib/systemd/system/vncserver.service或者/usr/lib/systemd/system/建议复制一份到/etc/systemd/system/再修改避免升级软件包时模板被覆盖。4.3 让远程桌面显示正确的图形界面xstartup配置这是VNC最容易出问题的环节。VNC启动后会执行~/.vnc/xstartup脚本这个脚本决定启动什么样的桌面环境。如果脚本内容不对常见的表现是能连上但只有一片灰色背景加一个叉形光标啥图标都没有看起来就像卡死了一样。典型配置一启动GNOME完整桌面#!/bin/sh unset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS exec gnome-session典型配置二启动Xfce轻量桌面内网机器经常选这个占资源少#!/bin/sh startxfce4 典型配置三只启动一个基础窗口管理器最保险但功能少#!/bin/sh exec xfce4-session写完记得赋予执行权限并重启VNC会话让配置生效chmod x ~/.vnc/xstartup # 重启VNC会话 vncserver -kill :1 vncserver :1提示升级系统或切换桌面环境后xstartup里的桌面会话名称可能失效比如gnome-session在新版系统里变成了gnome-session-binary。遇到这种情况多查日志日志位置在~/.vnc/machine:1.log重点看最后的报错行里面会直接告诉你哪个命令找不到。4.4 防火墙与SELinux处理防火墙是VNC连接超时最常见的原因。VNC默认使用TCP 5900编号端口比如vncserver :1对应5901。放行命令# firewalld体系 firewall-cmd --permanent --add-port5901/tcp firewall-cmd --reload # 或者如果有预定义服务直接添加服务 firewall-cmd --permanent --add-servicevnc-server firewall-cmd --reload如果是CentOS 6时代遗留的iptables工具iptables -I INPUT -p tcp --dport 5901 -j ACCEPT service iptables saveSELinux方面如果开了SELinux且VNC连接一直失败先看状态getenforce # 临时关闭测试仅排查用 setenforce 0如果确认是SELinux拦截可以用ausearch -m avc | grep vnc查看审计日志再针对性调整。虽然一台内网服务器关SELinux影响不大但我还是建议先定位清楚再处理别一上来就永久关闭不健康。5. 客户端连接与使用服务端配好了现在讲讲怎么从自己的电脑连上去。5.1 VNC Viewer连接VNC客户端最常用的就是RealVNC出品的VNC ViewerWindows、macOS、Linux都有对应版本手机端也有Android和iOS版。下载时要区分平台不要下错。连接方式# 在客户端机器上输入 vncviewer 192.168.1.100:1 # 或者直接用完整端口写法推荐语义更清晰 vncviewer 192.168.1.100:5901首次连接会弹一个未加密连接的警告点Continue继续。然后输入VNC密码回车就能看到远程桌面了。如果连不上大概率是防火墙、端口监听地址或者密码的问题到第6节对应排查。5.2 分辨率、色彩深度等常用参数连接体验和带宽之间需要平衡特别是内网带宽不高的时候分辨率启动服务端时用-geometry 1280x720指定或者客户端连接时实时调整色彩深度-depth 24画质最好-depth 16或-depth 8画质会降但带宽占用少局域网内一般-depth 24毫无压力跨公网链路、RDP隧道或者移动网络建议从-depth 16起步。我实际用下来的感受是VNC对带宽的消耗比RDP要大不少如果画面频繁变化比如播放视频带宽占用会飙升。所以VNC更适合日常操作和维护用来传输视频流就有点强人所难了。5.3 多用户与多显示器场景如果一台服务器要多个用户同时通过VNC登录可以给每个用户分配不同的显示编号# 用户alice启动 vncserver :1 # 用户bob启动 vncserver :2 # 分别对应5901和5902端口查看当前所有会话vncserver -list注意一点一个用户启动的VNC会话另一个用户知道密码之后也可以连但实际上操作的是同一个桌面。如果想让每个用户有独立桌面需要各自用各自的系统账号登录并启动自己的vncserver实例会话之间互不干扰。6. 常见问题与排查实录这一节全是从实际干活里踩坑踩出来的经验含金量比前面所有命令加起来都高。6.1 常见问题速查表现象最可能原因排查方法连接超时防火墙或安全组没放行590x端口firewall-cmd --list-ports检查端口能连上但黑屏xstartup配置不对或桌面环境缺失查~/.vnc/*.log日志一直提示密码错误密码超过8位被截断或大小写不对vncpasswd重新设置短密码服务起不来systemd单元文件配置错误systemctl status vncserver:1.service看报错端口占用其他进程已经用了5901ss -tlnp | grep 5901确认鼠标键盘不响应VNC服务异常或会话卡死vncserver -kill :1后重启会话连接后画面极其模糊色彩深度设太低客户端设置里把depth调到246.2 没找到rpm命令是什么情况热词里频繁出现没找到rpm命令大概率是两类情况第一类系统压根没有rpm包管理工具。Debian/Ubuntu系列默认用dpkg/apt不是rpm安装包后缀是.deb所以你在Ubuntu里敲rpm命令当然报command not found。解决方案很简单换用apt安装VNC如果你确实想用rpm包需要确认系统是否兼容比如Ubuntu服务器版装rpm会有不少兼容性问题不建议这么干。第二类系统是极度精简的容器或定制版比如某些Docker镜像基于Alpine包管理是apk或者裁剪过不带rpm。这种情况先确认发行版再决定化安装方式别硬来。提示判断一个系统用什么包管理器最简单的方式就是看安装包后缀.deb对应dpkg/apt.rpm对应rpm/yum/dnf.apk对应apk。拿rpm去装deb包大概率装不上这不是你的姿势问题是工具不匹配。6.3 连接黑屏/会话登录不显示桌面的排查黑屏是VNC咨询量最大的问题没有之一。我的排查路径是固定的先看日志cat ~/.vnc/machine:1.log日志里会明确告诉你卡在哪一步最常见的是xfce4-session: command not found或者gnome-session: command not found检查xstartup脚本权限有没有执行权限ls -l ~/.vnc/xstartup chmod x ~/.vnc/xstartup确认系统里是否真的装了对应的桌面环境# CentOS系查已安装的桌面组 yum grouplist | grep -i desktop尝试最小化验证把xstartup改成只启动一个xterm终端#!/bin/sh xterm 能出终端窗口就说明VNC通道本身是通的问题出在桌面环境配置上。后来我还发现一个更隐蔽的坑登录用户的HOME变量不要乱改xstartup里的相对路径和权限必须一致。比如VNC用root身份运行但会话配置放在了某个普通用户目录下文件找错地方就会一直黑屏。用echo $HOME确认一下当前用户的家目录再决定去哪个.vnc目录下找配置。6.4 踩坑记录与独家技巧最后分享几个实操过才知道的细节软件版本兼容问题。TigerVNC新版客户端可以连旧版服务端但某些加密扩展会不兼容。连不上时先在客户端设置里关掉TLS加密再试一次。如果关掉就能连上说明是加密协商的锅别去折腾服务端。systemd改了geometry不生效。如果你改了service文件里的-geometry参数改完必须执行systemctl daemon-reload再重启服务否则设置不会生效。这个坑很多人踩以为是配置写错了其实是systemd缓存了旧的unit文件。VNC默认监听0.0.0.0但如果服务启动时因为某种原因只监听127.0.0.1外部怎么都连不上。建议排查时先看监听地址ss -tlnp | grep 5901内网跨网段连接时如果VNC端口通了但SSH端口不通不要直接怀疑VNC配置先确认网络层通不通。ping一下目标主机的VNC端口# 在客户端机器上测试TCP端口连通性 timeout 3 bash -c echo /dev/tcp/192.168.1.100/5901 echo port open || echo port closed虚拟机或云主机场景如果防火墙放行了还是连不上先检查云安全组和网络ACL是不是还有一层拦截。这种问题的典型特征是本地防火墙已放行、服务监听正常、但外部就是连不上那大概率就是平台安全策略的问题。这套东西本质上就是在线能装就装离线会找依赖出问题看日志。VNC本身不复杂难的是不同发行版、不同桌面环境、不同网络条件下的组合问题。先把系统确认清楚再选安装方式依赖用工具分析而不是瞎猜配置出问题优先看日志——这套思路换哪个发行版都通用。至于更高级的玩法比如SSH端口转发配合VNC做加密通道、多显示器下的布局调整那是基础链路打通之后值得研究的方向但先把这篇的步骤走通再说别的。
返回列表