ARTICLE DETAIL

资讯详情

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

openEuler 20.03 TigerVNC 远程桌面安装与排障全记录

openEuler 20.03 TigerVNC 远程桌面安装与排障全记录 平时在信创环境里折腾系统最烦的就是机房没显示器、服务器却装了图形界面或者某个研发非要在远程看一眼Oracle安装器的图形输出。我这次在openEuler 20.03上装TigerVNC本来以为就是个普通的yum install结果前后折腾了小半天踩了服务配置、桌面启动脚本、防火墙策略好几个坑。这篇就把完整安装配置过程记下来包括那些不写到文档里的排查思路给后面要在openEuler 20.03上做远程桌面的朋友当个参考。需要说明的是这里用的是openEuler 20.03 LTS版本基于RPM体系下面的命令在20.03、22.03等版本上基本通用但不同小版本的包名和服务配置写法会有细微差异我会在关键位置标注清楚。1. 为什么我放弃了X11转发和RDP选了TigerVNC1.1 远程图形桌面的几种主流方案对比说清楚选型原因比直接给安装命令更重要。做远程图形桌面常见方案其实就那么几种我按实际体验做个对比。X11转发ssh -X是很多人第一个想到的方案。它的优点是零额外安装成本SSH天然加密但缺点同样明显网络延迟一高就卡成PPT而且现在GNOME这种重量级桌面跟X11转发的兼容性越来越差动不动就是各种颜色异常、刷新撕裂、菜单渲染不全。在机房跨交换机远程操作体验很不稳定。RDPRemote Desktop Protocol在Windows生态里是王者Linux下的xrdp虽然也能用但openEuler 20.03的默认仓库里没有xrdp包得编译或者加第三方源这在内网环境里就是个麻烦事。另外xrdp要额外引入一个Xorg服务进程跟系统原本的桌面会话存在抢session的风险。再就是各类商业远控向日葵、ToDesk之类在公网场景下确实好用但信创内网环境里要么需要专门的代理组件要么存在外联管制的问题不合规的可能性很高。碰上要求严格的项目这类软件本身就在禁用名单里。TigerVNC的优势在于openEuler 20.03的官方仓库直接提供tigervnc-server和tigervnc-server-module断网也能用本地镜像装它走的是RFB协议在局域网内的流畅度比X11转发好一大截而且它只负责把显示画面传出去不挑桌面环境GNOME、XFCE、KDE都能配合。对做运维的人来说仓库里原生就有、不引入额外组件就是最大的优势。1.2 openEuler 20.03仓库里的TigerVNC组件构成在openEuler 20.03上TigerVNC相关的包主要有这么几个tigervnc-server服务端主程序、tigervnc-server-moduleInetd/Xinetd扩展模块、tigervnc客户端和共享库、tigervnc-icons图标文件。很多教程只让你装tigervnc-server其实tigervnc-server-module在配置systemd实例服务时虽然不强制依赖但装了之后可以多一个Xvnc模块化的选择我的建议是干脆一起装了免得后面需要的时候又缺依赖。这里有个版本细节值得留意openEuler 20.03仓库里的TigerVNC是1.10.x系列这个版本的vncserver命令已经统一到了/usr/bin下面配置文件的写法和老版本的/etc/sysconfig/vncservers完全不同。如果你在网上搜教程看到让改/etc/sysconfig/vncservers的基本都是CentOS 6/7时代的写法在20.03上不好使编译一下能跑起来但systemd托管会有各种各样的坑。所以版本识别是第一道关。2. 开装前先把这三件事确认完省得后面返工2.1 网络和yum源最小化安装最容易卡在这里openEuler 20.03如果是最小化安装第一件事不是急着yum install而是确认网络通不通、yum源配没配好。这个环节看起来基础恰恰是很多人卡住的地方。检查网络我用的是最朴素的命令ip a ping -c 4 192.168.1.1 # 改成你的网关地址 ping -c 4 114.114.114.114 # 如果内网环境不允许外联跳过这一步不通的话看网卡配置openEuler 20.03默认网卡命名是ens160这种形式配置文件在/etc/sysconfig/network-scripts/ifcfg-ens160。需要确认ONBOOTyes然后systemctl restart NetworkManager。yum源这一块openEuler 20.03默认自带的源指向了repo.openeuler.org。如果你在内网环境大概率需要改成内部镜像源或者挂载本地ISO。我这次用的是内网OSS上的repo源配置写在/etc/yum.repos.d/openEuler.repo里改完执行yum clean all yum makecache这里有个容易忽略的细节openEuler 20.03区分了OS、everything、EPOL、debuginfo、source这几个仓库类别。tigervnc-server在OS仓库里就有但如果你后面还要装groupinstall图形桌面组件建议确认everything仓库也是可用状态否则可能出现软件包不存在的提示。2.2 图形桌面环境没有桌面VNC连上去也是黑屏TigerVNC本身只是一个远程显示传输工具它不负责提供桌面。如果服务器上装的是不带GUI的最小化系统VNC连上去之后你会发现只有一个灰茫茫的空桌面甚至直接黑屏。这一点很多人都没提前意识到装完了VNC才来问为什么连不上、连上了为什么是黑屏。所以在装VNC之前先判断系统里有没有桌面环境systemctl get-default输出是multi-user.target就说明当前是命令行启动模式需要确认是否安装了桌面组件。openEuler 20.03提供了几个图形桌面组最常用的有Server with GUI带GNOME的服务器版、GNOME纯GNOME桌面、Xfce轻量级桌面。安装命令是yum groupinstall -y Server with GUI如果你的服务器配置不高比如2核4G我更推荐装Xfce资源占用比GNOME低不少远程操作时流畅度感知更明显yum groupinstall -y Xfce这里有个选择题到底是用GNOME还是XFCE我的经验是如果只是为了跑个Oracle安装器或者看看图形化运维工具XFCE完全够用而且VNC传输带宽占用明显小于GNOME如果想体验接近本地桌面的操作那就上GNOME代价是会多占用约1GB内存。2.3 防火墙与SELinux的预检图形桌面的事解决完之后下一步是看防火墙状态。很多内网服务器为了省事直接关了防火墙但如果你的机器开着firewalld不把VNC端口放行客户端连接时就会一直卡在Connect timeout状态排查了半天也找不到原因。openEuler 20.03默认可能已经启用了firewalld检查与放行命令如下systemctl status firewalld firewall-cmd --permanent --add-servicevnc-server firewall-cmd --permanent --add-port5901-5903/tcp firewall-cmd --reloadvnc-server这个service zone是firewalld里预定义好的会把5900-5909端口批量放行。不过不同的openEuler小版本里这个service定义不一定存在如果执行报错直接改用--add-port方式手动放行即可效果一样。SELinux这边先看状态getenforce如果是EnforcingVNC相关的SELinux布尔值很可能会导致客户端能连接但画面刷新异常或者home目录下的vnc配置读取权限被拒。检查与放行命令getsebool -a | grep vnc setsebool -P vnc_home_t 1 setsebool -P vnc_export_all 1vnc_home_t这个布尔值如果不打开VNC进程读取用户家目录下的.vnc目录和xstartup脚本时会被SELinux拦截具体表现就是连接认证成功但桌面又黑屏了。这个问题非常隐蔽日志里甚至不会直接报SELinux拒绝得翻阅/var/log/audit/audit.log才能看到端倪。3. 安装tigervnc-server与初始化密码的实操记录3.1 通过yum安装完整组件环境确认完毕下面进入正式安装。openEuler 20.03的包管理工具是dnf/yum兼容的直接用yum命令没问题。yum install -y tigervnc-server tigervnc-server-module tigervnc装完之后验证一下版本rpm -qa | grep tigervnc vncserver --version正常情况下输出类似TigerVNC Server 1.10.1 - built Feb 12 2021 10:20:36 Copyright (C) 1999-2020 TigerVNC Team and many others这个版本信息没报错就说明基本环境已经就绪。顺便说一下tigervnc这个客户端包有些场景下你需要在服务器本机上测试回环连接没有一个本地vncviewer会很不方便所以我习惯把客户端也一起装掉。3.2 vncpasswd设置用户密码的细节这一步坑比较多我单独拿出来说。VNC的认证密码跟系统登录密码是两套独立的体系需要用vncpasswd单独设置而且它是按用户区分的——root有root的VNC密码oracle用户有oracle用户的VNC密码互不共享。举一个实际场景我要让root用户能通过VNC登录那就用root账号执行vncpasswd然后按提示输入两次密码。验证密码文件是否生成ls -la /root/.vnc/生成的文件是/root/.vnc/passwd这个文件的权限应该是600。如果权限不对VNC服务会直接拒绝启动或者连接时反复要求输入密码因为TigerVNC对passwd文件的权限检查很严格。这里分享一个技巧除了手动交互式输入密码vncpasswd还支持从stdin直接读取密码适合写脚本批量部署echo YourPassword | vncpasswd -f /root/.vnc/passwd chmod 600 /root/.vnc/passwd注意-f参数会把密码写到标准输出所以要用重定向方式落盘然后手动把权限收紧。另外TigerVNC 1.10默认密码复杂度校验不严但建议至少设置8位以上混合密码后面讲安全加固的时候还会细说。4. systemd服务单元配置从单用户到多用户实例4.1 vncserver.service文件的编写这是整个安装配置过程的重头戏也是新版TigerVNC和CentOS 6/7老教程的区别所在。openEuler 20.03上用systemd管理VNC服务服务单元文件路径是/etc/systemd/system/vncserver.service注意这里的符号不是装饰它表示这是一个模板服务后面的参数会作为实例名传入。先备份默认生成的文件然后创建自定义配置cp /lib/systemd/system/vncserver.service /etc/systemd/system/vncserver.service vim /etc/systemd/system/vncserver.service我的配置内容如下[Unit] DescriptionRemote desktop service (VNC) Aftersyslog.target network.target [Service] Typeforking Userroot Grouproot WorkingDirectory/root ExecStartPre/bin/sh -c /usr/bin/vncserver -kill %i /dev/null 21 || : ExecStart/usr/bin/vncserver %i -geometry 1280x720 -alwaysshared -fg ExecStop/usr/bin/vncserver -kill %i [Install] WantedBymulti-user.target逐个字段解释一下因为这里每个参数都关系到服务能不能稳定跑起来。Typeforking表示vncserver启动时是fork到后台运行的systemd需要配合这个行为做状态跟踪。如果你的Type类型写错服务启动时会出现Timeout start operation或者启动后立刻变inactive的情况。ExecStartPre这行是启动前的清理动作。VNC服务如果上一次非正常退出会在/tmp/.X11-unix/目录留下socket文件在/run/vncserver下留下pid文件不清理的话再次启动会直接报Address already in use。这行命令的逻辑是先尝试杀掉同名实例杀不掉就算了不阻塞启动流程。ExecStart里的-geometry 1280x720是默认分辨率-alwaysshared允许同一个桌面被多个客户端同时连接-fg是前台运行模式。这里我特意用了-fg让vncserver以前台模式跑在systemd管理的进程里配合Typeforking反而能让systemd更精准地追踪主进程状态。%i是systemd模板服务的内置变量它代表后面的实例名。比如服务名是vncserver:1.service那么%i就等于:1这个参数会直接传给vncserver当作显示编号。4.2 端口、显示编号与多实例的对应关系理解了%i的用法就理解了VNC的多实例原理。TigerVNC的显示编号从:1开始每个编号对应一个端口端口号等于5900编号。所以:1- 端口5901:2- 端口5902:3- 端口5903每多一个编号就相当于开了一个独立的桌面会话不同用户可以分别占用不同端口远程登录互不干扰。在服务器上想开第二个会话给另一个用户比如oracle用户只需要再执行cp /etc/systemd/system/vncserver.service /etc/systemd/system/vncserver:2.service sed -i s/Userroot/Useroracle/ /etc/systemd/system/vncserver:2.service sed -i s/WorkingDirectory\/root/WorkingDirectory\/home\/oracle/ /etc/systemd/system/vncserver:2.service或者说直接修改模板文件的User字段后用不同的实例名启动也是可以的。注意每个VNC用户都需要独立执行一次vncpasswd来生成自己家目录下的.vnc/passwd否则登录时会提示认证失败。4.3 启动、开机自启与服务状态验证配置完成后重载systemd并启动服务systemctl daemon-reload systemctl start vncserver:1.service systemctl enable vncserver:1.service这里我习惯加一句检查systemctl status vncserver:1.service看到Active: active (running)才表示启动成功。另外还可以通过端口监听状态来验证ss -tlnp | grep 5901输出应该能看到0.0.0.0:5901的LISTEN状态。这里有个小细节如果你发现VNC只监听在127.0.0.1:5901而不是0.0.0.0:5901说明配置文件里可能存在-localhost参数这只允许本机回环连接外部客户端是连不上的。还有一点容易忽略启动服务时如果提示找不到vncserver命令大概率是/usr/bin没有加入systemd服务的PATH环境或者tigervnc-server包安装不完整。可以在ExecStart里写全路径/usr/bin/vncserver来规避这也是我配置里用全路径的原因。5. 客户端连接与开机黑屏的排查全过程5.1 从vncviewer到浏览器Web端服务起来了接下来就是客户端连接。我最常用的客户端是TigerVNC自带的vncviewer也有用RealVNC Viewer的两者都支持RFB协议。连接时填服务器IP:5901然后输入第3步设置的VNC密码不是系统登录密码注意区分。如果只是偶尔连一次还有一种更轻量的方式在浏览器里加一个noVNC前端。TigerVNC服务端支持WebSocket协议转发但需要额外的网关组件。这在openEuler 20.03官方仓库里没有现成包如果你有兴趣可以单独研究这边不展开。我用vncviewer的实测体验是在局域网内1280x720分辨率下刷新的流畅度虽然比不上RDP但做日常运维操作完全合格鼠标点击延迟大概在100毫秒以内。如果是跨公网使用建议把分辨率再调低一些或者用下面的SSH隧道方案。5.2 黑屏和闪退的根因xstartup设计缺陷连接成功后黑屏是VNC排障里出现频率最高的问题没有之一。绝大多数原因是VNC默认生成的启动脚本没有正确启动桌面环境。服务启动时vncserver会执行/root/.vnc/xstartup这个脚本来拉起桌面会话。TigerVNC首次启动时会生成一个默认的xstartup但这个默认脚本往往只启动了xterm和twm这种极简窗口管理器不细看就觉得是黑屏。如果连xterm都没启那就是纯黑。我的xstartup配置如下#!/bin/sh unset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS exec /usr/bin/gnome-session注意下载步骤里要保证这个文件有执行权限chmod x /root/.vnc/xstartup写完之后重启VNC服务systemctl restart vncserver:1.service这里有个容易翻车的地方如果你在xstartup里写的是gnome-session但系统装的是Xfce那仍然会黑屏或报错。所以xstartup里的桌面启动命令必须跟系统实际安装的桌面环境一致。检查系统已安装的desktop environmentls /usr/share/xsessions/看输出的.desktop文件名就能确认。如果啥都没有说明图形环境没装全需要先回去执行groupinstall。另外一个常见坑是DBus相关的环境变量没清干净导致桌面进程启动一半就退出表现就是VNC窗口闪一下又断开。这也是为什么我在脚本前面加unset SESSION_MANAGER和unset DBUS_SESSION_BUS_ADDRESS的原因。5.3 端口不通和认证失败的处置顺序另一类高频问题是客户端根本连不上或者认证失败。这种情况我建议按照下面的顺序排查。第一步确认服务状态和端口监听ss -tlnp | grep 590如果没有输出说明vncserver没有监听端口先看服务状态和日志journalctl -u vncserver:1.service -n 50日志里一般会有明确报错信息比如密码文件缺失、vncserver命令找不到、端口被占用等。第二步如果端口监听正常但连接超时大概率是防火墙没放行。第三步如果连接正常但认证失败检查是不是多个VNC用户之间密码文件串了比如你用oracle的VNC登录root的端口密码校验自然过不了。另外提一个进阶的定位工具在服务端临时用前台模式启动vncserver排查问题/usr/bin/vncserver -kill :1 /usr/bin/vncserver :1 -geometry 1280x720 -alwaysshared -fg前台模式能把所有启动日志直接打到终端上错误信息一目了然排查完再CtrlC停掉恢复systemd托管方式即可。这个技巧在排查服务起来了但客户端连不上的神隐问题时特别有效能直接把systemd吞掉的日志捞出来。6. 分辨率、多用户、安全加固这几个进阶配置一次说清6.1 分辨率自适应与GNOME缩放的实践VNC的分辨率在启动参数-geometry里定义但实际使用中发现客户端屏幕如果和服务器分辨率不匹配操作体验会很别扭。TigerVNC 1.10支持-autoraise参数但这需要客户端支持实测下来不是所有vncviewer版本都能适配得很好。如果客户端是1920x1080的屏幕服务器VNC分辨率固定1280x720画面会被拉伸或者出现滚动条。我的解决方案是在VNC启动参数里直接设成和客户端一致的分辨率比如ExecStart/usr/bin/vncserver %i -geometry 1920x1080 -alwaysshared -fg如果客户端分辨率不固定也可以在vncviewer里使用Virtual Mode或者Fullscreen模式让客户端主动适配服务器桌面。但这类设置在不同客户端里叫法不一样最好统一团队内部的标准避免每次连接都要调。还有一个细节如果你用GNOME桌面但是觉得图标和字体太大或者太小可以在GNOME设置里调整缩放比例。VNC作为远程传输协议不会自动感知客户端DPI手动调整是唯一方案。轻量级的XFCE桌面在缩放方面不如GNOME灵活这也是它在高分屏场景下不如GNOME的一个劣势。6.2 第二用户、第三用户的VNC实例扩展多用户VNC在运维场景里很常见比如DBA要连上去跑Oracle图形安装研发要连上去看测试环境界面。按照4.2节的方式为每个用户创建独立的实例即可。这里我把整套流程再串一遍为oracle用户设置VNC密码su - oracle vncpasswd exit基于模板创建新实例cp /etc/systemd/system/vncserver.service /etc/systemd/system/vncserver:2.service sed -i s/Userroot/Useroracle/ /etc/systemd/system/vncserver:2.service sed -i s#WorkingDirectory/root#WorkingDirectory/home/oracle# /etc/systemd/system/vncserver:2.service为oracle用户准备xstartupmkdir -p /home/oracle/.vnc cat /home/oracle/.vnc/xstartup EOF #!/bin/sh unset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS exec /usr/bin/gnome-session EOF chown -R oracle:oracle /home/oracle/.vnc/ chmod x /home/oracle/.vnc/xstartup启动新实例systemctl daemon-reload systemctl start vncserver:2.service systemctl enable vncserver:2.service这样oracle用户就能通过5902端口连接自己的独立桌面了。多用户和单用户的最大不同在于文件权限和SELinux上下文你自己跑的时候如果发现oracle用户连接黑屏优先检查.vnc目录归属和权限另外确认SELinux的vnc_home_t布尔值对oracle用户同样生效。6.3 安全加固建议SSH隧道替换直连VNC的RFB协议默认传输是明文的也就是说如果有人在网络链路中做抓包你的VNC密码和桌面屏幕上的一切操作都能被还原出来。在内网环境里很多人觉得无所谓但如果是涉密环境或者跨网段远程这个风险不能忽视。我的建议是不用纠结改VNC本身的安全配置直接用SSH隧道把所有VNC流量封装起来最省事也最可靠。具体做法是客户端机器上执行ssh -L 5901:127.0.0.1:5901 root服务器IP这个命令将本机的5901端口映射到服务器的127.0.0.1:5901然后vncviewer连接127.0.0.1:5901即可实际数据全部走SSH加密隧道VNC本身可以在服务器端配置只监听回环地址ExecStart/usr/bin/vncserver %i -geometry 1280x720 -alwaysshared -fg -localhost加了-localhost参数后VNC只在端口以回环地址方式监听外部直接连接5901端口的请求会被拒绝必须通过SSH隧道转发才能访问。这样即使防火墙规则写错了或者被人扫到端口也无法直接绕过SSH获取VNC会话。另外补充一句关于密码策略的建议VNC密码不要和系统登录密码一样不要用弱密码定期换。如果公司有堡垒机或跳板机尽量把VNC端口收窄到只允许堡垒机访问别向整个网段开放。最后再多说一个我实际踩过的坑openEuler 20.03上如果CPU核数很少比如2核VNC连接后桌面操作会有明显的卡顿感特别是在GNOME环境下。这种情况下要么降低分辨率要么换成XFCE桌面要么直接评估是不是非要远程图形。有些场景下ssh -X配合轻量级应用反而比VNC更流畅这个需要根据实际使用场景来权衡。以上是我在openEuler 20.03上安装配置TigerVNC的全过程从环境预检到服务配置再到问题排查和进阶加固基本覆盖了从零到生产可用的完整链路。如果你也准备在欧拉系统上部署VNC按着这个顺序来应该能少走不少弯路。
返回列表