上个月接了个内网信创环境的活,对方甩给我一台银河麒麟V10-SP1的服务器,说是系统里带了图形桌面,但机器在隔壁楼的机房里,运维同事不想每次都跑过去接显示器敲键盘。需求很朴素:用VNC远程连接这台服务器的系统桌面,在自己办公电脑上看到完整的图形界面,能开终端、能点菜单、能拖文件,最好还能用中文输入法。听起来像是十分钟的活,真动手才发现从VNC服务端选型、xstartup怎么写,到防火墙放行、黑屏灰屏、输入法切不出来,每一步都有坑。这篇就把我这次从头到尾的完整过程记下来,包含方案选型的理由、配置文件的细节、参数取舍的计算逻辑,以及我实际踩过的坑和排查思路。目标很实在:你看完能照着在银河麒麟V10-SP1上把VNC服务端跑起来,客户端能连上,并且出了问题知道该往哪儿看,而不是对着黑屏瞎猜。
1. 先把方案定下来:为什么最终选了VNC
1.1 服务器上开图形桌面,真实诉求到底是什么
先别急着装包,得先想清楚这台机器为什么要图形界面。很多人一听"服务器开桌面"就觉得不专业,其实在信创办公和内网运维场景里,需求往往很具体:有些管理工具、配置程序只有图形客户端没有命令行版本;有些测试需要跑带界面的客户端做联调;还有的是因为业务软件本身是图形化的,必须点着操作。这种情况下远程桌面就不是"图方便",而是刚需。
另一个必须提前确认的点是:你面对的是银河麒麟高级服务器操作系统V10 SP1,还是银河麒麟桌面操作系统V10 SP1。名字像,默认状态差别很大。高级服务器版如果是最小化安装,系统里压根没有图形环境,你直接装VNC会连上一个空壳;桌面版则自带完整的UKUI桌面会话,装完VNC基本就能用。我这次碰到的就是前者——机器是服务器版,之前为了跑某个图形化工具装过桌面组,但装得不完整,缺了几个组件,导致后面第一次连接时只看到一片灰色加一个终端窗口,这个坑后面会详细讲。
所以第一步不是装软件,而是确认"桌面到底装没装全"。命令很简单:cat /etc/os-release和cat /etc/kylin-release看系统版本,echo $XDG_CURRENT_DESKTOP看当前会话类型,ls /usr/share/xsessions/看系统里注册了哪些可登录的图形会话。如果/usr/share/xsessions/目录是空的,那说明图形会话根本没注册,后面所有的VNC配置都是白搭,得先把桌面组装上。
1.2 VNC、X11转发、RDP三条路,各自适合什么场景
远程访问Linux图形界面,常见的有三条路,我列个表对比一下,你就知道为什么VNC在这类场景里最合适。
| 方案 | 原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| VNC | 服务端把完整桌面渲染到内存帧缓冲,通过网络传像素差异 | 会话独立、断开后程序继续跑、跨平台客户端多 | 视频类操作卡、默认不加密需自行加固 | 长时间挂着跑图形工具、多人各自独立桌面 |
| X11转发 | 通过SSH把单个X程序窗口转发到本地 | 配置简单、走SSH天然加密、只传一个窗口 | 每个程序都要开一次、窗口多了很乱、断线即断会话 | 临时跑一两个图形小工具 |
| RDP | 微软的远程桌面协议 | 带宽效率高、体验好 | Linux服务端实现(xrdp)在UKUI上兼容性一般、偶发闪退 | 主要面向Windows客户端、对流畅度要求高 |
我最终选VNC的核心原因是"会话持久"。X11转发最要命的一点是:只要网络抖一下、笔记本合盖睡眠、SSH断一次,你正在跑的那个图形程序就被杀了。而VNC是把桌面跑在服务端的虚拟显示上,客户端的连接只是一个"显示器",断开重连之后程序还在原地,进度不丢。对于需要跑几小时甚至跨天的图形化任务,这一点几乎是决定性的。
至于RDP,不是说不行,xrdp在部分国产桌面环境上确实能跑,但我在UKUI上试过,登录后桌面偶尔会花屏或者窗口管理器崩溃,排查成本明显高于VNC。而且VNC的客户端生态更广,Windows、macOS、Linux甚至手机端都有成熟客户端,出差用笔记本临时连一下也不折腾。所以这篇的经验全部基于VNC这条路线。
2. 动手前的环境盘点:三分钟摸清家底
2.1 确认系统版本、桌面环境与图形组件是否齐全
这一步千万别跳。我见过太多人直接yum install tigervnc-server,装完启动服务,客户端一连,黑屏,然后就陷入了漫长的瞎试。先把家底摸清,能省掉百分之八十的无效排查。
先看系统版本,确认自己面对的是哪个SP:
cat /etc/kylin-release cat /etc/os-release uname -r然后是图形环境。银河麒麟V10 SP1的桌面环境是UKUI,检查它装了没有:
rpm -qa | grep -i ukui | head -20 ls /usr/share/xsessions/如果rpm -qa一条都搜不出来,说明桌面根本没装。这时候要用yum的组安装,但组名不能凭记忆写,必须先从系统里查出来:
yum grouplist | grep -i -E "ukui|desktop|gui|x11"输出的组名才是真实可用的。查出来之后照着名字装,比如:
yum groupinstall -y "UKUI Desktop"这里有个实操经验:组安装的包数量很大,如果内网源不全或者网速慢,很容易装到一半失败,留下一个"半残"的桌面——有窗口管理器没输入法,或者有面板没会话管理器。这种情况下yum history看下最后一次事务,用yum history undo回滚重来,比在残局上一个个补包靠谱得多。我这次就是栽在这,第一次组安装中断过,后续连接只出灰屏,后来干脆yum groupremove清掉重装才彻底解决。
另外提醒一句:有些工具在只有Xorg没装完整的情况下也能跑,但VNC依赖的是虚拟显示,如果你选择的是"用Xorg模块共享真实显示"这种模式,那还得确认显卡驱动是否支持,复杂度会陡增。我强烈建议走独立的虚拟显示模式,也就是后文要讲的TigerVNC默认方式,跟物理显卡彻底解耦。
2.2 网络与账户前提,别在第一步就卡住
环境确认完,接着确认三件事:网络可达、账户可用、时间同步。
网络方面,先在客户端ping一下服务器的内网IP,确认通,然后用telnet 服务器IP 22确认SSH端口开放。为什么先确认22?因为后面我推荐的加固方案是走SSH隧道,如果22都不通,说明网络策略有拦截,得先找网络管理员。另外要提前规划好VNC的端口,VNC用的是5900加display号,:1对应5901,:2对应5902,以此类推。先跟管理员确认内网防火墙允不允许这些端口的内部访问,能省掉后面反复扯皮的时间。
账户方面,千万不要用root直接跑VNC会话。一方面权限过大,一个误操作就是系统级的;另一方面很多桌面组件在root下会拒绝启动或者出现异常,因为图形会话本身是为普通用户设计的。正确做法是建一个专用的普通账户,或者用现有的业务账户:
useradd -m -s /bin/bash vncuser passwd vncuser时间同步这事听着八竿子打不着,但它真会影响VNC。VNC的认证握手对时间偏差比较敏感,如果服务器和客户端时间差了太多,连接可能直接被拒,而且日志里只给一个含糊的"authentication failure"。所以顺手确认一下timedatectl status,没开NTP就开一下。这些准备工作加起来不到十分钟,但能把后面一堆莫名其妙的报错提前掐掉。
3. 安装与配置VNC服务端,以TigerVNC为主线
3.1 装包选型:为什么是TigerVNC
银河麒麟V10的软件源里通常能找到好几套VNC实现,常见的有tigervnc、vnc-server(RealVNC的老版本)、以及一些第三方包。我选TigerVNC的理由有三个,都是实际用下来验证过的。
一是跟systemd的集成度最好。新版本的TigerVNC自带vncserver@.service模板,用实例化服务管理多用户多会话非常干净,systemctl enable --now vncserver@:1.service一条命令就搞定开机自启和启动。二是性能不错,它的编码器支持Tight、ZRLE等压缩算法,在内网百兆环境下调整一下色深和压缩等级,操作流畅度是可以接受的。三是配置模型清晰,会话参数放在~/.vnc/config里,密码单独管理,跟桌面会话文件解耦,排障时能快速定位是哪一层出的问题。
查包和装包:
yum provides "*/vncserver" yum install -y tigervnc-server rpm -ql tigervnc-server | grep -E "systemd|config"装完之后先别急着启动,把rpm -ql的输出看一眼,重点确认两个路径:systemd单元文件在哪(通常在/lib/systemd/system/或/usr/lib/systemd/system/),以及配置目录是不是/etc/tigervnc/。不同小版本的路径会有差异,不要照抄网上的旧教程直接改/etc/sysconfig/vncservers,那是很老版本的做法,在银河麒麟V10 SP1的TigerVNC上根本不生效,改了也是白改,还会让你以为是自己配置错了,白白浪费时间。
3.2 密码、用户映射与配置文件怎么排
TigerVNC新版本的配置分三层,理解了这个分层结构,后面出问题你能立刻判断该查哪个文件。
第一层是用户到display的映射,文件是/etc/tigervnc/vncserver.users。它决定哪个display号归哪个用户,格式是一行一个映射:
vim /etc/tigervnc/vncserver.users内容形如:
:1=vncuser这行的意思就是:display:1(对应端口5901)由vncuser这个账户运行。注意这里是系统级的声明,不是你自己随便启动一个会话,后面用systemd启动vncserver@:1.service时,它会读这个文件,然后以vncuser的身份拉起服务。这一点非常重要,很多人手动vncserver启动能连上,改用systemd就失败,根因就是没写这个映射。
第二层是用户自己的会话参数,文件是~/.vnc/config。以vncuser身份登录后创建:
su - vncuser mkdir -p ~/.vnc vim ~/.vnc/config一个我实际在用的配置示例:
session=ukui geometry=1920x1080 depth=24 localhost alwaysshared这里逐项解释一下取舍。session=ukui告诉TigerVNC去加载/usr/share/xsessions/ukui.desktop这个会话,这是让桌面完整启动的推荐做法,比自己在xstartup里手写一堆exec要可靠得多,因为TigerVNC会帮你把dbus、环境变量这些琐碎的东西处理好。geometry是虚拟桌面的分辨率,1920x1080是个比较平衡的值,太大会增加传输量,太小用起来憋屈。depth=24是色深,24位真彩色看着舒服,如果内网带宽紧张可以降到16,画质会变差但速度明显提升。localhost这一项是安全关键,它让VNC只监听127.0.0.1,外网根本连不上,必须通过SSH隧道才能访问——这是我最推荐的部署方式,后面会展开。alwaysshared允许多个客户端同时连同一个会话,方便交接班或者两个人一起看同一个界面。
第三层是VNC自己的密码,文件是~/.vnc/passwd,用vncpasswd生成:
vncpasswd chmod 600 ~/.vnc/passwd这里有个细节值得强调:VNC的密码和系统账户密码是两套东西,各管各的。有人以为改了系统密码VNC就跟着变,结果连不上还查半天。另外vncpasswd最多只取前8个字符,超过的部分会被截断,这是VNC协议的历史遗留问题,不是bug。所以你的VNC密码设8位就够了,设长了反而容易记混,你以为输的是12位,实际生效的是前8位。
注意:
~/.vnc/passwd的权限必须是600,只能所有者读写。权限过宽时TigerVNC会直接拒绝启动,日志里提示密码文件权限不安全,很多人卡在这一步还以为是密码错了。
3.3 xstartup决定了你连上去看到什么
~/.vnc/xstartup是决定"连上去之后显示什么"的脚本。如果你在~/.vnc/config里已经写了session=ukui,那TigerVNC会用系统会话机制启动桌面,xstartup可以不写或者写得很简单。但如果你用的是比较老的版本,或者session=这个参数不生效,那就得靠xstartup自己把桌面拉起来。
我遇到过session=不起作用的情况,最后的兜底方案是手写xstartup:
vim ~/.vnc/xstartup chmod +x ~/.vnc/xstartup内容:
#!/bin/sh unset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS export XMODIFIERS="@im=fcitx" export GTK_IM_MODULE="fcitx" export QT_IM_MODULE="fcitx" [ -x /etc/X11/xinit/xinitrc ] && exec /etc/X11/xinit/xinitrc exec /usr/bin/ukui-session这段脚本里每一行都有用。unset SESSION_MANAGER和unset DBUS_SESSION_BUS_ADDRESS是为了清掉从SSH登录环境带进来的变量,不清的话桌面会话会跟SSH会话抢dbus,典型表现就是连上去之后桌面元素加载不全,或者网络管理器之类的组件起不来。三个export是给中文输入法铺路,具体后面单独讲。exec /etc/X11/xinit/xinitrc是走标准启动流程,最后exec /usr/bin/ukui-session是真正把UKUI桌面拉起来。
chmod +x这一步绝对不能省。脚本没有执行权限时,VNC会话能启动、端口能监听、密码验证也能过,客户端连上之后却是一片纯黑,什么反应都没有。这个现象特别迷惑人,因为从外面看一切正常,只有日志里会有一行不起眼的提示。我第一次踩的就是这个坑,对着黑屏验证了半天密码和网络,最后才发现是权限问题。
4. 用systemd把VNC服务管起来
4.1 两种托管方式,以及display号与端口的对应关系
TigerVNC在systemd下有两条路走。老一点的做法是把模板单元复制出来改成具体服务,比如把vncserver@.service复制成/etc/systemd/system/vncserver@:1.service,然后手工修改里面的ExecStart和User字段。新版本直接用实例化模板,systemctl start vncserver@:1.service,它会自动去读/etc/tigervnc/vncserver.users里的映射拿到用户,不需要改单元文件。
怎么判断自己该用哪种?装完包之后看一眼:
ls /lib/systemd/system/ | grep vnc cat /lib/systemd/system/vncserver@.service如果单元文件里出现了vncserver.users或者类似的引用,说明是新版本,直接用实例化方式;如果里面写死了ExecStart=/usr/bin/vncserver %i还带着一堆PIDFile路径,那多半是旧版模板,需要复制出来改。我这次的系统是新版,直接走实例化,省事很多。
display号和端口的对应关系必须记牢,这是排障时最常换算的东西:
| display号 | 监听端口 | systemd服务名 | 说明 |
|---|---|---|---|
| :1 | 5901 | vncserver@:1.service | 第一个会话,通常给主用户 |
| :2 | 5902 | vncserver@:2.service | 第二个会话,可给另一个用户 |
| :3 | 5903 | vncserver@:3.service | 以此类推 |
算法很简单:端口 = 5900 + display号。客户端连接时写服务器IP:1或者服务器IP::5901,这两种写法是等价的,前者用display号,后者用绝对端口号,不同客户端支持情况不一样,TigerVNC和RealVNC的客户端两种都认。
4.2 启停、开机自启与状态确认的标准动作
配置改完,重载并使能服务:
systemctl daemon-reload systemctl enable --now vncserver@:1.service systemctl status vncserver@:1.servicestatus的输出要看几件事:进程有没有起来、监听在哪个地址和端口、有没有报错。正常的话你会看到类似Listening on 127.0.0.1:5901这样的行,如果显示的是0.0.0.0:5901而你配置里写了localhost,那说明配置没生效,得回去检查~/.vnc/config的拼写和位置。
服务起来之后,顺手确认端口确实在监听:
ss -lntp | grep 590这条命令比netstat好用,参数也好记:-l只看监听,-n不做域名解析,-t只看TCP,-p显示进程。看到vncuser对应的进程占着5901,就说明服务端这一侧基本没问题了。
日志是排障的核心。两条路径都要会看:
journalctl -u vncserver@:1.service -f tail -f ~/.vnc/*.logjournalctl记录的是systemd层面的启动过程,比如进程起没起、退出码是多少;~/.vnc/下面的日志记录的是会话层面的细节,比如桌面加载到了哪一步、哪个组件报错了。先看journalctl确认服务本身活着,再看会话日志确认桌面有没有起来,这个顺序能帮你快速把问题范围缩小一半。
4.3 会话冲突与残留处理
VNC会话偶尔会留下残留,典型场景是服务异常退出,或者你手动kill了进程但锁文件没清掉。这时候再启动会报A VNC server is already running on display :1,明明ps里看不到进程了,它就是说在跑。
原因在于X11在/tmp下留了锁文件。清理方式:
rm -f /tmp/.X1-lock rm -rf /tmp/.X11-unix/X1X1里的数字对应display号,:1就清X1,:2就清X2。删完再systemctl restart,基本就能起来。这里有个经验:不要用kill -9暴力杀VNC进程,给了它正常退出的机会,锁文件一般会自己清理干净。频繁kill -9是制造残留的主要来源。
另外提一句多用户并发的资源问题。每个VNC会话本质上是一个完整的桌面环境常驻在内存里,UKUI这一套下来,一个空闲会话大概占几百兆到一点几G内存,具体看开了多少组件。如果服务器内存本来就紧,同时挂三四个桌面会话,是会明显吃力的。所以别把display号当成"免费资源"随便开,按需分配,用完的会话及时停掉。
5. 防火墙、安全与访问控制
5.1 防火墙放行端口的标准操作
银河麒麟V10默认用的多是firewalld。先确认状态:
systemctl status firewalld firewall-cmd --state如果是running,放行VNC端口:
firewall-cmd --permanent --add-port=5901/tcp firewall-cmd --reload firewall-cmd --list-ports--permanent和--reload这两步缺一不可,只加permanent不reload,规则不会生效;只加运行时的规则不写permanent,重启防火墙就没了。
如果你像我一样在~/.vnc/config里写了localhost,那其实根本不需要放行5901,因为服务只监听127.0.0.1,外部流量进不来,放行了也没用。这恰恰是这种配置的安全优势——攻击面为零。反过来,如果你确实需要内网其他机器直连,那就把localhost去掉,同时必须放行端口,但这时候务必配合后文的访问控制手段。
除了firewalld,别忘了SELinux:
getenforce如果输出是Enforcing,VNC有可能被策略拦掉。判断方法不是直接关SELinux,而是先看审计日志:
ausearch -m avc -ts recent | tail -20如果有跟vnc相关的拒绝记录,再考虑调整策略。临时验证可以setenforce 0跑一下,确认是SELinux的问题之后再去找对应的布尔值或策略,验证完记得把状态改回去。直接永久关闭SELinux是不负责任的做法,属于用一个更大的安全问题去换一个小问题的解决。
5.2 SSH隧道:我最推荐的加固方式
前面反复提到localhost加SSH隧道,这里完整讲一遍。原理是把VNC流量塞进SSH的加密通道里,VNC服务本身完全不对外暴露,外部扫描扫不到任何VNC端口。
在客户端机器上执行:
ssh -L 5901:127.0.0.1:5901 -N -f vncuser@192.168.1.100参数含义:-L做本地端口转发,把本地5901映射到远端127.0.0.1:5901;-N表示不需要执行远程命令,纯粹做转发;-f让SSH转到后台运行。执行完会让你输系统账户密码,验证通过后隧道就建立了。这时候在VNC客户端里连127.0.0.1:5901或者localhost:1,流量会自动经SSH到服务器,再落到本地的VNC服务上。
这套方案的收益很实在:一是加密,VNC协议本身的密码认证是弱加密的,走SSH就完全不用担心被嗅探;二是不用在内网防火墙上开口子,网络管理员那边也好沟通;三是访问控制天然清晰,谁能SSH到这台机器,谁就能连VNC,权限模型统一。唯一的代价是多一层隧道,连接时多敲一条命令。嫌麻烦可以写个shell脚本或者配置SSH的config文件,起个别名一键连。
5.3 账户与口令的基本加固
除了隧道,还有几件小事值得做。VNC密码虽然只有8位有效,但别用12345678这种;vncpasswd支持设置只读密码(view-only),如果需要给别人看界面但不希望他操作,可以设一个view-only密码,主密码自己留着。这个细节知道的人不多,但在演示或者排障交接场景里特别有用。
会话层面还可以通过~/.vnc/config限制一些行为,比如加上SecurityTypes=VNCAuth明确认证方式,或者用MaxDisconnectionTime控制异常断开的清理策略。这些参数建议在理解了含义之后再改,不要从网上抄一堆参数堆进去,改多了反而容易互相冲突。
6. 客户端连接与画面调优
6.1 客户端怎么选,连接参数怎么写
客户端这块,跨平台首选TigerVNC Viewer,开源、免费、和TigerVNC服务端同源,兼容性最好。Windows下装完是个绿色小工具,输入地址就能连。RealVNC的VNC Viewer也不错,界面更友好,但要注意免费版对商业用途有限制,企业内网用之前先确认授权。Linux桌面下直接装tigervnc包就自带vncviewer命令,命令行和图形两种都能用。手机端也有几个成熟的客户端,临时应急看一下界面完全够用。
连接时的地址写法有三种,都得知道:
| 写法 | 含义 | 备注 |
|---|---|---|
127.0.0.1:1 | 本地display 1,端口5901 | 走SSH隧道时用这个 |
127.0.0.1::5901 | 本地绝对端口5901 | 双冒号,等价于上一行 |
192.168.1.100:1 | 服务器IP加display号 | 直连场景,需放行端口 |
我建议隧道方案统一用127.0.0.1:1这种写法,直观好记。第一次连接会提示证书指纹,确认一下接受即可,之后就不会再问。
6.2 分辨率、色深与带宽的取舍
画面流畅度取决于三个变量:分辨率、色深、网络带宽。三者是此消彼长的关系,得根据实际网络调。
内网千兆环境,直接用geometry=1920x1080加depth=24,体验基本接近本地。如果是跨机房或者带宽只有几兆的链路,就得降:把depth降到16,分辨率降到1600x900,画面会明显变糊但操作跟手。还有个技巧是客户端侧的"自适应质量"选项,TigerVNC Viewer里有自动调节编码质量的功能,网络好的时候自动提画质,差了自动降,不用手工来回改配置。
另外,别用VNC去看视频或者跑3D应用。VNC传的是像素差异,画面大面积变化时代码再优化也扛不住,这不是配置问题,是协议本身的特性。真有这类需求,得换别的方案。
如果连上之后发现很卡但带宽看着还挺宽裕,先别急着调参数,用top在服务器上看一眼:是不是桌面里某个组件在疯狂吃CPU。我遇到过一次,UKUI的某个索引服务在后台狂扫磁盘,把CPU占满了,看起来像是VNC卡,实际跟VNC一点关系没有。定位问题比调参数重要。
7. 踩坑实录:黑屏、灰屏、闪退与输入法
7.1 常见故障速查表
这部分是整篇最值钱的地方,我把这次遇到的和以前踩过的坑整理成一张表,出问题先对号入座。
| 现象 | 最可能的原因 | 排查与处理 |
|---|---|---|
| 连上后纯黑,无任何反应 | xstartup没有执行权限 | chmod +x ~/.vnc/xstartup后重启服务 |
| 灰底加一个终端窗口 | 桌面会话没起来,只起了兜底的xterm | 检查session=ukui是否生效,确认UKUI组件装全 |
| 连接直接被拒绝 | 服务未启动,或端口未放行,或监听在localhost | systemctl status、ss -lntp、检查localhost配置 |
| 提示认证失败 | 密码文件权限不对或密码被截断 | 重新vncpasswd,确认只输前8位,chmod 600 |
| 启动报已存在会话 | 上次异常退出留下锁文件 | 删/tmp/.X1-lock和/tmp/.X11-unix/X1 |
| 画面卡顿明显 | 色深过高或带宽不足 | 降到depth=16,分辨率降一档 |
| 连上几秒后闪退 | 桌面组件崩溃或dbus冲突 | 看~/.vnc/*.log末尾的报错,清理环境变量 |
| 中文输入法切不出来 | 环境变量未设置 | 在xstartup里导出fcitx三个变量 |
7.2 中文输入法与剪贴板这两个高频痛点
中文输入法的问题几乎人人都会撞上。明明服务器上装了fcitx,物理登录时能打中文,VNC连上去就是切不出来。原因很明确:VNC会话启动时没有继承到输入法需要的环境变量。解决办法就是前面xstartup里那三行:
export XMODIFIERS="@im=fcitx" export GTK_IM_MODULE="fcitx" export QT_IM_MODULE="fcitx"XMODIFIERS是X11层面的输入法标识,GTK和QT这两个分别管不同图形库写的程序。三个都设上,才能覆盖系统里各种类型的应用。只设其中一个,典型表现就是"浏览器能打中文,但终端里打不出来",或者反过来。设完之后重启VNC服务生效,注意是重启会话,不是重启输入法,改的是会话启动环境。
剪贴板是另一个容易忽略的点。VNC默认不同步剪贴板,想在本地和远端之间复制粘贴文字,需要服务端有一个叫vncconfig的辅助进程在跑。在xstartup里加一行:
vncconfig -nowin &-nowin表示不显示那个小配置窗口,只在后台跑。加上之后,本地复制的文字就能粘到远端,远端复制的也能拿回来。这个功能用起来不起眼,一旦缺了会非常影响效率,尤其是需要把命令或者路径从本地文档粘到远端终端的时候。
7.3 会话残留、多会话冲突与日常维护习惯
最后聊聊维护。VNC跑起来之后不是一劳永逸,几个习惯能让它长期稳定。
第一,定期看一眼会话日志的大小。~/.vnc/下的日志会随着时间增长,如果某个组件一直在刷错误,日志能涨到几百兆甚至把磁盘占满。做法很简单,配个简单的日志清理,或者装个logrotate规则,别等到磁盘告警才想起来。
第二,会话用完就停。不是所有人都需要常驻桌面,如果只是临时跑一个图形程序,跑完systemctl stop vncserver@:1.service停掉,省内存也减少暴露面。用systemctl disable关掉开机自启,需要的时候再手动起。
第三,显示号做规划。一台服务器上如果要跑多个用户的会话,提前把display号分配好并记录在案,:1给A、:2给B,写进运维文档。别今天这个人用:1,明天另一个人也起一个:1,冲突了再互相排查,纯粹是给自己找事。
第四,改配置之前先备份。cp /etc/tigervnc/vncserver.users /etc/tigervnc/vncserver.users.bak这种动作就一秒钟,但出问题时能让你一分钟回滚,而不是从零重建。
我自己在实际操作中的体会是,VNC这类看起来很"基础"的服务,坑几乎都不在VNC本身,而在它跟桌面环境、systemd、防火墙、SELinux这一圈的交互上。所以真出了问题,别只盯着VNC的配置翻来覆去改,先把"服务活着没、桌面起来没、网络通没通"这三件事按顺序确认一遍,多半能快速定位到真正的故障点。这套流程我在这次银河麒麟V10-SP1的部署里走了一遍,从最开始的黑屏折腾到后面稳定运行,前后大概花了一个下午,其中大部分时间都消耗在桌面组件没装全和xstartup权限这两件事上——现在这些经验写出来,你照着走,应该半小时就能搞定。