☰
麒麟V10服务器VNC配置实战:安装、systemd管理与黑屏排查
2026/10/1 14:18:35 网站建设 项目流程

前两天朋友问我,说他们有一台麒麟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帮不上忙,应该装x11vnc:

yum install -y x11vnc

启动方式也简单,先记住你当前登录的显示编号,一般是:0:

x11vnc -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/passwd

3.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_TYPE=x11 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] Description=Remote desktop VNC (VNC Server) After=syslog.target network.target [Service] Type=forking User=testuser Group=testuser WorkingDirectory=/home/testuser ExecStart=/usr/bin/vncserver %i -geometry 1600x900 -depth 24 -localhost no ExecStop=/usr/bin/vncserver -kill %i Restart=on-failure [Install] WantedBy=multi-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@:1

enable这步设了开机自启,服务器重启之后VNC会自动恢复,不用再人工干预。

3.4 防火墙与端口放行

服务起来之后,本机先用VNC客户端连一下,能连上再考虑远程的事。如果本机能连远程不能连,多半是防火墙在挡。

麒麟V10服务器版默认开着firewalld,需要放行对应的VNC端口:

firewall-cmd --permanent --add-port=5901/tcp firewall-cmd --reload

如果开了多个实例,端口也要逐个放行。有些朋友图省事直接systemctl stop firewalld把防火墙关了,短期调试没问题,长期跑业务千万别这么干,后面我有单独一节讲安全,这里先记住一个原则:VNC这种带图形界面的远程服务,暴露面越小越好。

4. 多用户、多实例的日常用法

4.1 一个服务模板管一个显示器编号

工作里经常遇到这种需求:不同部门的人想要各自的桌面,互相不干扰。用systemd模板的%i参数,这事特别简洁。

比如要给用户zhangsan开一个:1的VNC,给用户lisi开一个:2的VNC:

cp /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/vncserver@zhangsan.service这种命名思路,在服务文件里写死User=zhangsan,然后:

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 :1

5.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的权限是644,TigerVNC会拒绝启动,日志里报:

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-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="5901" accept' firewall-cmd --reload

如果连固定办公网段都没有,那就更稳妥的做法是让VNC只监听本机,然后通过SSH隧道访问。修改ExecStart里的参数,把-localhost no换成-localhost yes:

ExecStart=/usr/bin/vncserver %i -geometry 1600x900 -depth 24 -localhost yes

然后客户端这边用SSH隧道连:

ssh -L 5901:localhost:5901 user@server_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改成最简单的灰屏加终端,确认链路通,再往外加东西。这个办法帮我省了很多时间,也推荐给你们。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询