ARTICLE DETAIL

资讯详情

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

麒麟V10服务器VNC配置实战:安装、systemd管理与黑屏排查

麒麟V10服务器VNC配置实战:安装、systemd管理与黑屏排查 前两天朋友问我说他们有一台麒麟V10服务器放在机房没有接显示器想通过VNC连上去操作图形界面但装完VNC之后连上去总是黑屏折腾了好久没搞定。这问题我真遇到过而且不止一次。我手头管过几台不同SP版本的麒麟V10服务器从SP1到SP3都有有飞腾的、有海光的VNC的坑基本都踩了一圈。今天这篇就专门讲麒麟V10服务器版SP1/SP2/SP3上VNC Server的安装、配置和使用把版本的差异、TigerVNC和x11vnc怎么选、systemd怎么管理、黑屏怎么排查全串起来。适合刚接手麒麟服务器的运维、给客户做交付实施的朋友也适合那些只是想临时开个图形桌面跑点GUI应用的人。1. 动手前先搞清楚三件事1.1 先确认SP版本、内核和桌面环境麒麟V10服务器版在发布周期里有SP1、SP2、SP3几个小版本底层基本是基于openEuler的分支构建的软件包管理习惯和RHEL系很像yum、dnf这套都能用。但SP1和SP3的软件仓库版本差别挺大的直接照搬网上教程很容易翻车。所以第一件事先看清楚机器到底啥情况cat /etc/os-release uname -a systemctl get-default/etc/os-release里能看到系统版本uname -a能看内核尤其要注意架构信息。飞腾、鲲鹏是ARM架构海光、兆芯是x86架构后面装软件包的时候架构不同rpm包千万别下错。systemctl get-default这一条很多人不看其实很关键如果返回的是multi-user.target说明这台机器默认不启动图形桌面你后面要么装一个桌面环境要么就用VNC跑独立的虚拟桌面。再看一眼系统里到底装没装桌面组件ls /usr/share/xsessions/ rpm -qa | grep -i desktop | head -20如果xsessions目录不存在或者里面没有.desktop文件基本可以判定当前是纯命令行环境。这时候你就得想清楚VNC连上去之后要给用户看什么是一个完整的桌面还是只是一个能跑GUI程序的X窗口。这个决定直接影响到你选哪种VNC方案。1.2 搞清楚“共享桌面”和“虚拟桌面”的区别很多人在这一步没想明白后面全乱套。VNC服务有两种完全不同的工作模式共享桌面x11vnc直接转发当前物理显示器上的画面。服务器如果本身已经登录了一个图形桌面x11vnc把那个会话共享出去客户端看到的就是你屏幕上正在显示的内容。适合有人机房现场操作、需要远程协助的场景。虚拟桌面TigerVNC服务器上不依赖物理显示器由Xvnc进程自己创建一个虚拟的X服务桌面在里面跑客户端连接进来看到的是这个独立桌面和物理显示器上是什么毫无关系。适合无头服务器、机房机器远程管理。麒麟V10服务器版大多数时候是没接显示器的我通常直接选TigerVNC它的systemd集成做得好服务化方便配置清晰。如果你手里那台机器有物理显示器、且桌面上已经有人登录了那你需要的其实是x11vnc。这两种东西的安装和使用逻辑完全不一样不要在同一个坑里纠结。2. 安装方式怎么选2.1 首选从yum仓库装TigerVNC麒麟V10的软件源里直接就有TigerVNC这是最省事的路径。SP1、SP2、SP3的仓库里包版本略有出入但安装方式一致yum install -y tigervnc-server tigervnc-server-module装完之后确认一下rpm -qa | grep tigervnc这个tigervnc-server-module很多人会漏掉它的作用是把VNC服务接入systemd提供vncserver.service模板文件。如果只装了tigervnc-server后面用systemd启动服务的时候会报Unit not found又得回头补装白折腾一趟。如果执行yum install提示没有可用软件包先检查一下软件源yum repolist yum makecache麒麟V10的源有时候默认没启用或者指向的是一个内网镜像。检查/etc/yum.repos.d/下面的repo文件把源地址改成能访问的镜像就行。这一步在SP1上比较常见老版本源经常因为证书过期或者地址变更导致拉不到包。2.2 有物理显示器时用x11vnc共享真实桌面如果你的服务器情况不一样——它接了显示器而且上面已经跑着一个图形桌面你想远程看到的正是这个画面那TigerVNC帮不上忙应该装x11vncyum install -y x11vnc启动方式也简单先记住你当前登录的显示编号一般是:0x11vnc -display :0 -forever -shared -rfbauth ~/.vnc/passwd -rfbport 5900-forever表示客户端断开后服务不退出-shared允许多个客户端同时连接-rfbauth指定密码文件。用x11vnc之前也需要先用vncpasswd生成一个密码文件不然它不允许启动。这种模式的好处是零配置适合临时用坏处是它必须依赖一个已经在运行的物理桌面会话服务器重启之后没人到机房登录一次x11vnc就起不来。所以绝大多数服务器远程管理的场景我还是推荐TigerVNC。2.3 离线环境带RPM包手工装有些项目现场是内网隔离的yum源根本没配这时候只能手动处理。在能联网的同架构机器上先把rpm包拉下来yum install --downloadonly --downloaddir/tmp/vnc_rpm tigervnc-server tigervnc-server-module然后把整个/tmp/vnc_rpm目录拷到内网机器上执行yum localinstall -y /tmp/vnc_rpm/*.rpm这里有个坑--downloadonly只下载指定的包不下载依赖。TigerVNC本身依赖libX11、libXext这些基础库通常系统里已经有但保险起见你可以加上--resolve参数把这层依赖关系也带全。如果内网机器连基础图形库都没装那就比较麻烦了建议直接问现场要一个完整的麒麟V10安装镜像通过挂载本地ISO做本地源比一个个rpm手工拷要稳得多。3. TigerVNC的完整配置过程3.1 安装软件包并初始化密码包装好之后先建VNC密码。注意VNC密码和系统登录密码是两码事它只用于VNC客户端连接时的认证vncpasswd执行后会问你要密码再确认一遍。这里有两个细节第一VNC协议的老规矩密码最多只能取前8位后面输入的内容会被静默截断。这是历史限制客户端和服务器都遵守这个规则你设一个12位的密码实际生效的是前8位别以为越长越安全。第二vncpasswd还会问你是否设置一个view-only密码也就是只能看不能操作的密码。如果不需要就直接回车跳过需要的话可以设置方便给围观的人开一个只读权限。密码文件会生成在~/.vnc/passwd这个文件的权限必须是600不然服务会拒绝启动chmod 600 ~/.vnc/passwd3.2 第一次启动和xstartup配置第一次启动可以手动来先不用systemd方便看输出vncserver :1这里:1是显示编号对应的VNC端口是5900 1 5901。如果写:2端口就是5902以此类推。首次启动会在~/.vnc/目录下生成一堆文件其中最关键的是xstartup。这个文件决定客户端连上来之后到底执行什么命令黑屏问题八成出在它身上。麒麟V10默认生成的xstartup内容比较简陋直接用它经常起不来桌面。我一般会改成这样#!/bin/sh unset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS export XDG_SESSION_TYPEx11 exec /etc/X11/xinit/xinitrc如果系统里装了别的桌面环境比如Mate或者UKUI可以改成对应的命令#!/bin/sh unset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS exec startxfce4 # 或者 exec mate-session # 或者 exec gnome-session # 或者 exec startkde改完之后别忘了一件关键的事chmod x ~/.vnc/xstartup我见过太多黑屏都是因为这里少了执行权限VNC能连上但xstartup根本跑不起来屏幕上就是一片灰。改完xstartup之后先杀掉旧会话再重新启动vncserver -kill :1 vncserver :1 -geometry 1600x900 -depth 24-geometry指定分辨率-depth指定颜色深度。我这里通常用24位色颜色还原准确网络带宽也扛得住。如果你是在跨互联网访问带宽紧张可以降到-depth 16画质会差一点但流畅度明显提升。3.3 用systemd把VNC做成服务手动启动的方式适合调试但正式环境不可能每次重启服务器之后都手工敲一遍命令必须交给systemd管。麒麟V10装完tigervnc-server-module之后系统里会带一个模板文件/usr/lib/systemd/system/vncserver.service直接用它当模板cp /usr/lib/systemd/system/vncserver.service /etc/systemd/system/vncserver.service vi /etc/systemd/system/vncserver.service把内容改成这样[Unit] DescriptionRemote desktop VNC (VNC Server) Aftersyslog.target network.target [Service] Typeforking Usertestuser Grouptestuser WorkingDirectory/home/testuser ExecStart/usr/bin/vncserver %i -geometry 1600x900 -depth 24 -localhost no ExecStop/usr/bin/vncserver -kill %i Restarton-failure [Install] WantedBymulti-user.target这里有几个地方要解释一下。%i是systemd的实例名。当你执行systemctl start vncserver:1.service的时候%i自动展开成:1启动的就是1号显示编号的VNC服务。这套机制的好处是一个模板文件通吃所有显示编号不需要给每个显示编号单独写一个service文件。User和Group一定要指定。注意这里指定的用户决定了VNC会话是谁的。如果你用root跑客户端连上来就是root桌面权限太大风险太高。一般我会单独建一个普通用户或者指定给某个具体的业务账号。-localhost no这个参数要特别说。默认TigerVNC为了安全只监听本机回环地址也就是你只能在服务器本机上连VNC远程客户端根本连不进来。-localhost no明确告诉它监听所有网卡这样远程才能访问。但这也意味着任何人只要知道你端口和密码就能尝试连接后面安全章节我会专门讲怎么加固先在这里留个印象。改完之后重新加载systemd配置然后启动服务systemctl daemon-reload systemctl start vncserver:1 systemctl enable vncserver:1enable这步设了开机自启服务器重启之后VNC会自动恢复不用再人工干预。3.4 防火墙与端口放行服务起来之后本机先用VNC客户端连一下能连上再考虑远程的事。如果本机能连远程不能连多半是防火墙在挡。麒麟V10服务器版默认开着firewalld需要放行对应的VNC端口firewall-cmd --permanent --add-port5901/tcp firewall-cmd --reload如果开了多个实例端口也要逐个放行。有些朋友图省事直接systemctl stop firewalld把防火墙关了短期调试没问题长期跑业务千万别这么干后面我有单独一节讲安全这里先记住一个原则VNC这种带图形界面的远程服务暴露面越小越好。4. 多用户、多实例的日常用法4.1 一个服务模板管一个显示器编号工作里经常遇到这种需求不同部门的人想要各自的桌面互相不干扰。用systemd模板的%i参数这事特别简洁。比如要给用户zhangsan开一个:1的VNC给用户lisi开一个:2的VNCcp /usr/lib/systemd/system/vncserver.service /etc/systemd/system/vncserver:1.service cp /usr/lib/systemd/system/vncserver.service /etc/systemd/system/vncserver:2.service但这样做不如直接用模板加用户更优雅。模板文件里把User写死后实际上每个服务实例就固定对应一个用户了。比如/etc/systemd/system/vncserverzhangsan.service这种命名思路在服务文件里写死Userzhangsan然后systemctl start vncserver:1.service这样不同用户的VNC实例管理起来非常清晰。每个用户的~/.vnc/目录独立各自用自己的vncpasswd密码xstartup也能独立定制互不干扰。4.2 一个用户跑多个VNC实例还有一种情况是同一个用户想同时开多个VNC桌面比如一个跑日常办公一个跑测试程序。这种情况下不需要改任何service文件直接复制模板指定不同的显示编号就行systemctl start vncserver:1.service systemctl start vncserver:2.service前提是你把模板文件里的User指定成当前用户并且该用户先执行过vncpasswd生成密码文件。每个实例占用一个端口:1对应5901:2对应5902客户端连接的时候选对端口就行。这里有个小技巧vncserver.service模板里的ExecStart写了vncserver %i%i展开成:1。如果我想让不同的实例用不同的分辨率比如:1用1600x900:2用1920x1080可以把-geometry参数放到ExecStart里注意这是写在service文件里的实例化的时候会自动带上。4.3 给固定测试用户开独立桌面做交付的时候我经常给现场留一个固定的VNC入口比如用户叫vncguest密码单独设一个桌面环境装一个浏览器和终端模拟器每次客户验收或者我们远程排查问题连上去直接就是一个干净的工作环境。对比一下如果直接给root开VNC客户连上来就是root桌面万一误操作删了什么文件谁都说不清。单独一个低权限用户权限边界清楚出问题也好定位。创建用户useradd vncguest passwd vncguest su - vncguest -c vncpasswd然后按第3章的过程给vncguest配置好~/.vnc/xstartup再用systemd模板指定相应User就可以了。5. 常见问题与排查实录5.1 “Connection refused”从哪查VNC客户端连不上的时候先别急着改配置按这个顺序一层层排查ps aux | grep -i Xvnc ss -tlnp | grep 590 systemctl status vncserver:1第一服务进程到底起没起。如果grep不到Xvnc进程说明服务没起来看systemd状态和日志journalctl -u vncserver:1 -n 50第二端口有没有在监听。ss -tlnp能列出所有监听端口如果5901不在列表里基本就是服务没起来或者配置有问题。第三防火墙挡没挡。上面ss看到端口在监听了客户端还报拒绝那就在服务器上查防火墙firewall-cmd --list-ports看看5901/tcp在不在列表里。不在就按3.4的操作加进去。还有一种情况你自己能连服务器IP但客户端连不上——先确认你连的IP和端口对不对。比如显示编号:1用端口5901:2用5902别拿5900去连:1这属于最低级的错误但真有人犯。5.2 连上了却是黑屏这个是最多的问题也是我开始提到的朋友遇到的情况。VNC服务正常、端口通、密码也过了但连上去就是一个灰扑扑的桌面啥也没有。排查思路就一条看~/.vnc/目录下的日志文件比如主机名:1.log。cat ~/.vnc/主机名:1.log | tail -50常见错误分这么几类第一xstartup没有执行权限。这是我遇到最多的。ls -l ~/.vnc/xstartup看一眼如果没有x权限chmod x补上然后vncserver -kill :1再重新启动。第二xstartup里写的桌面环境根本没装。比如你在里面写了exec startkde但系统里压根没装KDE日志里会明确报startkde: command not found。解决办法就是先确认系统里到底有什么桌面会话之前第一章命令ls /usr/share/xsessions/看输出结果再决定xstartup里写什么。麒麟V10 server版一般不带桌面你可以用yum补装一个轻量桌面比如yum install -y xfce4然后xstartup里写exec startxfce4。第三字体或组件缺失导致桌面进程崩溃。这种情况日志里会有一堆报错比如找不到字体、缺少某个动态库。我当时第一次配置的时候就是缺了一个xauth相关的东西后面用yum install -y xorg-x11-xauth补上才好的。这类问题没有统一的答案看日志找关键字缺什么装什么。第四.Xauthority权限问题。有些版本的TigerVNC启动时会对~/.Xauthority文件有权限要求如果日志里出现Xauthority does not exist或者Permission denied删除旧文件重新生成rm -f ~/.Xauthority vncserver -kill :1 vncserver :15.3 服务起不来、锁文件残留有时候vncserver -kill :1没彻底杀掉进程或者服务器异常断电再次启动的时候会报错A VNC server is already running as :1这是因为显示编号.X11-unix下的锁文件没清掉。处理方法vncserver -kill :1 ps aux | grep Xvnc kill -9 pid rm -f /tmp/.X11-unix/X1 rm -f /tmp/.X1-lock然后重新启动。这个坑在SP1上尤其常见老版本的TigerVNC对异常退出的处理没那么健壮锁文件清理不及时隔三差五就得手动清一次。5.4 VNC密码相关的坑密码问题看起来简单实际也有不少幺蛾子。一是密码截断问题前面说过只认前8位这个规则在麒麟V10各版本上都是一样的。所以设密码的时候干脆就设8位别设太长的给自己找不痛快。二是忘记密码没法找回。VNC密码是单向加密存储的不存在“找回”这个概念。忘了就直接重新运行vncpasswd覆盖旧密码然后重启VNC服务。注意覆盖之后所有客户端的旧连接会断开需要重新输密码。三是vncpasswd生成的文件权限不对。如果~/.vnc/passwd的权限是644TigerVNC会拒绝启动日志里报VNC authentication failed: password file /home/xxx/.vnc/passwd is insecure直接chmod 600 ~/.vnc/passwd解决。5.5 连接卡顿与画面质量调整VNC跑图形桌面卡顿是无法完全避免的尤其跨公网访问的时候。我自己常用的优化手段降低分辨率vncserver -geometry 1280x720小画面传输的数据量小流畅度立竿见影。降低颜色深度-depth 16比24的颜色数据量少三分之一视觉上基本看不出太大区别。客户端多做适配TigerVNC客户端和RealVNC客户端都可以设置画质优先模式有些客户端还支持JPEG压缩级别调整传输质量优先改成速度优先。尽量避免大范围画面滚动和视频播放这是VNC的天然短板。如果一定要流畅看视频那该上别的方案了VNC不适合干这个。6. 安全加固与使用建议6.1 端口别裸奔VNC服务默认端口5901起不认识这个端口的人可能不多。把VNC端口直接暴露在公网上等于给全网发了一个邀请函任何会端口扫描的人都能发现你然后就是无穷无尽的暴力尝试。我的习惯是先用防火墙限制来源IP只允许办公网段连firewall-cmd --permanent --add-rich-rulerule familyipv4 source address192.168.1.0/24 port protocoltcp port5901 accept firewall-cmd --reload如果连固定办公网段都没有那就更稳妥的做法是让VNC只监听本机然后通过SSH隧道访问。修改ExecStart里的参数把-localhost no换成-localhost yesExecStart/usr/bin/vncserver %i -geometry 1600x900 -depth 24 -localhost yes然后客户端这边用SSH隧道连ssh -L 5901:localhost:5901 userserver_ip这时候本地VNC客户端去连localhost:5901流量先走SSH加密隧道到服务器再从服务器本机转发给VNC端口。好处是5901端口对局域网内其他机器完全不可见只有登录到服务器上的人能访问安全性直接上了一个档次。6.2 用普通用户跑VNC前面提过这一点但这里还是想强调一下。很多人图省事直接用root跑VNC觉得反正内网也没啥事。问题是VNC密码一旦泄露对方拿到的是一个root权限的图形桌面系统里所有文件、服务、配置都能动这个后果比命令行被入侵更严重因为图形界面下点错一个按钮就可能搞坏整个系统。所以我标准做法是每个VNC用户都是独立的普通账号按需授予权限。如果某个用户确实需要root权限执行命令那是临时切过去的事不要让整个VNC会话直接开在root下。另外VNC密码本身要有复杂度要求和系统密码一样对待。前面说了最多8位生效那就尽量用大小写字母加数字加符号的组合别用12345678这种。6.3 维护习惯总结最后分享几个我在实际使用中一直坚持的习惯定期看日志。VNC日志在~/.vnc/目录下文件名叫主机名:显示编号.log。每次连不上、黑屏、卡顿第一件事永远是看这个日志不要瞎猜。清理残留文件。服务器重启后偶尔会有临时目录里残留的锁文件导致VNC服务起不来。每次重启完我都会顺手检查一下/tmp/.X11-unix/和/tmp/.X1-lock有残留就清掉。监控端口和服务状态。我现在管着的服务器会在监控系统里加一条检测5901端口连通性检查服务挂了立刻告警。这个比用户发现连不上再找你报障要主动得多。版本升级要谨慎。麒麟V10的SP1、SP2、SP3软件仓库更新节奏不一样不要一看到有TigerVNC新版就盲目升级。生产环境的VNC服务能不动尽量不动真要升级先在测试机上把流程走一遍再上。还有一点VNC适合做临时管理入口不适合当长期生产依赖。如果某台服务器需要频繁的图形化远程操作我更倾向于在上面装一套专业的远程桌面方案性能和稳定性都好很多。VNC作为兜底和应急手段是够用的但别指望它承载太多东西。我在实际配置中踩过最深的坑就是黑屏后来养成一个习惯每配一台新机器先把xstartup改成最简单的灰屏加终端确认链路通再往外加东西。这个办法帮我省了很多时间也推荐给你们。
返回列表