一台 CentOS 7.X 的服务器摆在机架上,24 核、64G 内存、一块不算新的专业卡,白天跑仿真和数据处理,晚上还要留给团队里几个人各自开图形界面看结果。这里面的痛点很具体:SSH 能敲命令,但看不了波形图、拖不动曲线、跑不了需要 OpenGL 的图形工具。有人提议装个远程桌面共享一个屏幕轮流用,问题是三个人同时在线,谁都不想等谁,而且共享控制台意味着一个人误操作,其他人的窗口全乱。
这就是多人使用服务器桌面的典型诉求:同一台物理机、同一套系统、多个用户同时在线、每人一个独立桌面会话、互不可见、互不干扰。满足这个诉求的成熟做法是 VNC 系方案,而在 CentOS 7 上,RealVNC的服务端是少数能把"多会话管理、加密传输、权限隔离"这几件事一次性做完整的商业级实现。它本质上是一个 RFB 协议服务端,把 X 服务器的帧缓冲编码后推给客户端,客户端把键鼠事件回传,用户在远端看到的就是一个真实的 X 桌面。适合谁来参考?手上有一台闲置算力、需要给两到五个人分配图形桌面的运维或开发;也适合单人多机、想在家里连公司服务器跑图形工具的从业者。下面这套流程我在不同配置的机器上跑过多轮,从裸系统到五人并发稳定在线,踩过的坑都写在里面。
1. 方案选型与多人并发的核心逻辑
1.1 为什么在几个 VNC 实现里挑 RealVNC
CentOS 7 上能选的 VNC 服务端大致有这么几类:TigerVNC、x11vnc、TurboVNC,再加上 RealVNC。它们的定位差别很大,选错了后面全是返工。
TigerVNC 是 CentOS 7 官方源里的默认选手,yum install tigervnc-server就能装,配置vncserver@.service模板也能实现多用户。它的优点是免费、社区资料多、和系统集成度高;缺点是会话管理要靠手写 systemd 模板,加密只有 TLS 一种模式且配置琐碎,多用户并发时端口和 display 号的维护全靠人肉记账,用户多了容易乱。
x11vnc 走的是另一条路——它依附在已经存在的物理 X 会话上,把当前控制台的画面推出去。这东西适合"我就想看看机器现在什么样",但要实现多用户各自独立桌面,它根本不合适,因为它压根不创建新会话,所有人看到的是同一块屏幕。
TurboVNC 是给高性能图形场景优化的,针对 3D 和视频做了 JPEG 分块和 TurboVNC 编码,跑 OpenGL 应用确实快。但它的多用户管理和 RealVNC 比还是偏底层,账号、密码、会话生命周期都要自己搭。
RealVNC 的不同点在于它把"多会话"当成一等公民来设计。安装完自带两个服务:vncserver-x11-serviced管物理控制台共享,vncserver-virtuald管虚拟桌面。每个用户执行vncserver-virtual :N就得到一个完全独立的 Xvnc 进程和 display 号,密码存储、权限、加密通道全是内建的。更关键的是它默认启用 256 位 AES 加密,客户端和服务端握手时协商,抓包也看不到明文画面——这在多人共用的内网环境里是个硬需求,毕竟谁都不想自己的桌面内容在交换机上裸奔。
代价是许可证。RealVNC 的个人免费版对设备数和用户数有上限,商业环境要买 license,这一点必须提前和团队确认,否则装到一半发现只能连三台就尴尬了。我的判断标准是:两人以内、纯个人用途,TigerVNC 够用且省事;三人以上、需要长期稳定、对加密和会话隔离有要求,RealVNC 的许可证成本换来的是运维时间的节省。
1.2 多人并发的本质是 display 号加端口的一一映射
很多人第一次配 VNC 会卡在一个认知上:以为"多人使用"是某种特殊模式。其实不是。VNC 的多用户就是多个独立的 X 服务器实例,每个实例有自己的 display 编号,每个 display 编号对应一个固定的 TCP 端口,端口号等于 5900 加上 display 号。display :1 就是 5901,display :2 就是 5902,依此类推。
这个映射关系是 RFC 里定死的,客户端连服务器IP:1的时候,底层连的就是 5901 端口。所以"支持五人同时在线"翻译成工程语言就是:在 5901 到 5905 这五个端口上各挂一个 Xvnc 进程,每个进程以不同用户身份运行,各自读取各自的~/.vnc/配置和密码文件。
理解这一点之后,所有配置都顺了:
- 每个用户必须有一个系统账号,
useradd建好,否则 Xvnc 没有归属。 - 每个用户必须自己设 VNC 密码,存在自己的家目录下,服务端不会帮你共享。
- display 号必须全局唯一,两个人抢 :1 会直接启动失败,报 "A VNC server is already running as :1"。
- 端口必须在防火墙放行,CentOS 7 默认 firewalld 是开的,不放行就是连不上,而且客户端只会给你一个超时,没有任何提示。
我一般会在文档里先拉一张表,把用户、display、端口、用途固定下来,贴在团队 wiki 上。这张表看着土,但能省掉后面 80% 的"我这个连不上"的排查。
| 系统账号 | display 号 | 监听端口 | 会话类型 | 备注 |
|---|---|---|---|---|
| alice | :1 | 5901 | 虚拟桌面 | 仿真结果查看 |
| bob | :2 | 5902 | 虚拟桌面 | 数据处理 |
| carol | :3 | 5903 | 虚拟桌面 | 图形工具 |
| dave | :4 | 5904 | 虚拟桌面 | 备用/临时 |
| 控制台 | :0 | 5900 | 物理共享 | 仅管理员 |
1.3 虚拟桌面和物理控制台共享的区别
RealVNC 安装完会有两个可用的服务,很多人在这两者之间选错,导致后面怎么配都不对。
vncserver-x11-serviced对应的是x11 模式,它把机器上真实的那块屏幕(也就是你接显示器能看到的那个 :0)共享出去。适合的场景是"人就在机房旁边,远程看一眼机器状态",或者"这台机器只有一块屏,我要远程接管它"。它的特点是所有人看到的是同一个画面,你在远端动鼠标,机房那台显示器上的鼠标也跟着动。
vncserver-virtual对应的是virtual 模式,它不碰物理显示,直接启动一个全新的 Xvnc,在内存里画一块虚拟屏幕。每个 virtual 会话就是一个独立的 X server,有自己的窗口管理器、自己的桌面、自己的进程树。多人并发必须用这个模式,因为它的隔离是进程级的,alice 在 :1 里崩溃了,bob 的 :2 一点感觉都没有。
这里有个容易混淆的点:virtual 模式下,用户看到的桌面和物理机接显示器看到的桌面是两套东西。物理机上可能跑着 GNOME 的登录界面,virtual 会话里是另一个 GNOME 实例。文件系统是共享的,/home/alice就是同一个目录,但 X 会话完全隔离。这正好是多人使用想要的效果——共享算力和存储,隔离显示和输入。
选型结论很干脆:多人并发只走 virtual 模式,x11 模式留给管理员应急。两者的许可证是同一份,装一个 Server 两个服务都能跑。
2. 环境准备与 RealVNC 服务端落地
2.1 系统底座和桌面环境的前置检查
CentOS 7 最小化安装是不带图形栈的,直接装 VNC Server 会缺一堆 X 相关的库。我习惯先把底座补齐再装 VNC,顺序反了会出现 rpm 依赖报错,虽然能强行--nodeps装上,但后面启动会话时会以各种诡异的方式失败,排查成本更高。
先确认系统版本和基础包:
cat /etc/centos-release # 预期输出 CentOS Linux release 7.x yum groupinstall -y "X Window System" yum install -y epel-release yum install -y perl dbus-x11 xorg-x11-fonts-misc xterm wgetX Window System这个组包提供了 Xvnc 依赖的基础 X 库和字体路径,dbus-x11是 GNOME 会话必需的,少了它桌面能起来但没有通知、没有设置守护,表现是面板一片空白。xterm看着多余,但它是排查时的救命稻草——当你的桌面环境起不来、屏幕全黑的时候,配置里把会话临时改成 xterm,能连上就说明 VNC 链路没问题,问题出在桌面环境上,这一步能把排查范围直接砍一半。
桌面环境的选择要看人数和内存。GNOME 是 CentOS 7 的默认,功能全,但一个空会话就要吃掉 600MB 到 1GB 内存,五个人并发就是 3 到 5G,加上应用本身,64G 内存的机器也就够用。XFCE 或者 MATE 轻得多,空会话 200MB 出头,跑图形工具完全够。我现在的默认做法是:给每个人装 XFCE,只有明确需要 GNOME 特有功能的才单独装。
yum groupinstall -y "Xfce" # 或者 yum groupinstall -y "MATE Desktop"装完不需要systemctl set-default graphical.target,因为 virtual 模式不依赖系统默认运行级别,Xvnc 是自己拉 X server 的。这一点和 TigerVNC 一样,但和 x11 模式不同,别搞混。
2.2 RealVNC Server 的安装与许可证处理
RealVNC 官网下载的是 rpm 包,文件名类似VNC-Server-6.7.2-Linux-x64.rpm。传到服务器上,用yum localinstall而不是rpm -ivh,让 yum 自动处理依赖:
yum localinstall -y VNC-Server-6.7.2-Linux-x64.rpm装完会看到两个 systemd 单元:
systemctl list-unit-files | grep vnc # vncserver-x11-serviced.service # vncserver-virtuald.service许可证这一步是新手最容易卡住的地方。RealVNC 的机制是:个人免费版不需要输入任何 key,装上就能用,但有设备数和用户数限制;商业版需要用vnclicense命令导入。查看当前状态:
vnclicense -check如果显示的是评估模式或者未授权,商业环境需要导入对应的 key:
vnclicense -add XXXX-XXXX-XXXX-XXXX-XXXX这里有个实操心得:许可证是按设备绑定的,不是按用户。也就是说一台服务器上开五个 virtual 会话,消耗的是一台设备的额度,不是五个。这一点和很多人以为的"一个用户一份 license"不一样,规划预算的时候按机器数算,别按人头算,能省不少。另外换机器或者重装系统前记得先vnclicense -remove释放,否则额度会一直被占着。
提醒:安装完成后先别急着配多用户,用当前账号跑一次
vncserver-virtual :1,确认能起来、能连上、能看到桌面,再往下走。基础链路没通就配并发,出了问题根本分不清是链路问题还是配置问题。
2.3 首次启动与密码设置的细节
RealVNC 的密码分两套,这是它和开源方案的一个明显差异,也是最容易踩的坑。
x11 模式的密码用vncpasswd设置,存在~/.vnc/passwd;virtual 模式的密码用vncpasswd -virtual设置,存在另一个位置。两个密码互相独立,你给 x11 设了密码不代表 virtual 能用。很多人装完直接vncpasswd,然后连 virtual 会话死活认证失败,原因就在这里。
正确顺序是,以普通用户身份执行:
# 切到目标用户 su - alice # 设置 virtual 模式密码 vncpasswd -virtual # 会提示输入并确认密码 # 启动 display :1 vncserver-virtual :1启动成功的输出里会明确写出会话号和端口,类似New desktop is hostname:1 (192.168.x.x:5901)。这时候在客户端用IP:1连接,输刚才设的密码,应该能看到一个最朴素的桌面或者一个空 X 画面。
如果看到的是灰底加一个 X 光标,说明 Xvnc 起来了但桌面环境没加载,去检查~/.vnc/config.d/vncserver-virtual.custom里的 Session 配置。如果连都连不上,先在本机用vncviewer localhost:1试,本机能连说明是防火墙或者网络问题,本机不能连说明是服务本身的问题。
密码长度有个历史遗留问题:老版本 RealVNC 的 VNC 认证协议只取前 8 位,设了 12 位密码实际上只校验前 8 位。新版本支持更长密码,但如果客户端是老版本,会出现"密码明明对但认证失败"。稳妥做法是密码控制在 8 位以内,或者统一升级客户端。这个细节文档里不写,但实际排查中遇到过不止一次。
3. 多用户会话的完整落地配置
3.1 每个用户的独立会话初始化
多用户配置的核心动作是"以每个用户身份各跑一次初始化"。这里不能用 root 代劳,因为vncserver-virtual会在当前用户的家目录下创建~/.vnc/目录结构和密码文件,root 跑出来的东西归属是 root,普通用户读不了也改不了。
给每个用户建号、设密码、初始化,一套流程走下来:
# root 执行:建用户 useradd -m -s /bin/bash alice useradd -m -s /bin/bash bob useradd -m -s /bin/bash carol # 设置系统密码(用于 SSH 登录和 sudo) passwd alice # 切到用户身份设置 VNC 密码并首次启动 su - alice -c "vncpasswd -virtual <<< $'Pass1234\nPass1234\n'" su - alice -c "vncserver-virtual :1"这里的<<<是 bash here-string,把密码喂给交互式命令,适合批量脚本。手工操作的话直接su - alice然后敲命令更直观。第一次启动会生成~/.vnc/config.d/和日志,日志路径是~/.vnc/*.log,起不来的时候第一件事就是看这个文件。
每个用户的会话配置文件在~/.vnc/config.d/vncserver-virtual.custom,这是一个纯文本的键值对文件。我通常统一写这么几行:
Session=xfce Geometry=1920x1080 Depth=24 AlwaysShared=0Session指定启动哪个桌面,值要和系统里装的对应,写gnome就是 GNOME,写xfce就是 XFCE,写错了会回退到一个空 X 会话。Geometry是虚拟屏幕分辨率,这个值决定了远端看到的最大画布,设太小窗口会挤,设太大客户端缩放会糊,1920x1080 是个平衡点。Depth=24是色深,24 位真彩色,别设 16,否则渐变和图片会出现色带。AlwaysShared=0表示不允许同一会话多客户端同时连,多人场景下这个必须关,否则两个人连同一个 display 会互相抢鼠标。
注意:
Geometry改完必须重启会话才生效,vncserver-virtual -kill :1再重新启动。直接改配置文件然后重连是没用的,X server 的分辨率在启动时就定死了。
3.2 用 systemd 用户单元实现开机自启
手动vncserver-virtual :1的问题是重启就没了,而且进程挂了没人拉。生产环境要用 systemd 托管,但这里有个限制:virtual 会话必须由对应用户启动,所以不能用系统级 unit 里的User=简单了事,因为每个用户的 display 号不同,模板没法共用。
正确做法是用systemd 用户单元,每个用户在自己的~/.config/systemd/user/下放一个服务文件:
mkdir -p ~/.config/systemd/user cat > ~/.config/systemd/user/vncserver.service <<'EOF' [Unit] Description=VNC Virtual Desktop After=network.target [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/bin/vncserver-virtual :1 ExecStop=/usr/bin/vncserver-virtual -kill :1 Restart=on-failure [Install] WantedBy=default.target EOF注意 display 号要按用户改,alice 用 :1,bob 用 :2,carol 用 :3。Type=oneshot加RemainAfterExit=yes是因为vncserver-virtual启动后会 fork 到后台然后父进程退出,用Type=forking反而不带 PIDFile 会报错,oneshot 是最稳的写法。
然后是关键一步,让用户服务在开机时就能启动,而不需要用户先登录一次:
loginctl enable-linger alice loginctl enable-linger bob loginctl enable-linger carolenable-linger的作用是让 systemd 为该用户保留一个 user manager 实例,即使他没登录,systemctl --user的服务也能跑。没有这一步,服务器重启后服务不会自启,必须等用户 SSH 登录一次才触发,那就失去自启的意义了。
启用并启动:
su - alice -c "systemctl --user daemon-reload" su - alice -c "systemctl --user enable --now vncserver.service" su - alice -c "systemctl --user status vncserver.service"状态里看到active (exited)就是正常的,oneshot 类型显示 exited 不代表失败,看ExecStart那行有没有报错输出。这一步配好之后,重启服务器,五个人不用做任何操作,各自的桌面就在对应端口上等着了。
3.3 防火墙、SELinux 与端口放行
CentOS 7 默认 firewalld 是开启的,5901 这些端口不在默认放行列表里。最直接的做法是按端口段放行:
firewall-cmd --permanent --add-port=5901-5910/tcp firewall-cmd --reload firewall-cmd --list-ports如果团队有安全规范要求收紧,可以只放行实际用到的几个端口,或者限制来源 IP:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="5901" protocol="tcp" accept'SELinux 是另一个隐形杀手。CentOS 7 默认是 enforcing,RealVNC 的 rpm 包自带策略模块,标准端口 5900 到 5903 一般没问题,但如果你把 display 号开到 :5 以上,对应 5905 端口,SELinux 会拦。查日志能看到denied { name_bind }之类的记录:
ausearch -m avc -ts recent | grep vnc解决办法是给自定义端口打上 SELinux 标签:
semanage port -a -t vnc_port_t -p tcp 5905 semanage port -l | grep vncsemanage命令来自policycoreutils-python包,没装的话先yum install -y policycoreutils-python。我不建议直接setenforce 0关掉 SELinux,一来不安全,二来重启就失效,三来掩盖了真正的问题,后面换个端口又会踩一遍。
3.4 客户端连接与画面调优
服务端配好之后,客户端这边也有几个参数值得调。
连接地址的写法是IP:display号,比如192.168.1.100:2对应 5902 端口。RealVNC Viewer 也支持直接写端口192.168.1.100:5902,两种写法等价。如果团队里有人总连错端口,统一用端口写法更不容易混。
画质设置上,RealVNC 客户端有Picture quality和Color level两个选项。内网千兆环境下直接选High加Full color,流畅度没问题的。跨网段或者带宽紧张的时候调到Medium,它会把画面做 JPEG 压缩,文字会稍微糊一点,但延迟明显下降。我在实际使用中的体会是:跑代码编辑和终端,Medium完全够;看图或者做 UI 设计,必须High。
分辨率不匹配是最常见的体验问题。服务端设了 1920x1080,客户端屏幕只有 1366x768,默认会出滚动条或者强行缩放。RealVNC Viewer 有个Scale to fit选项,开了之后画面等比缩放,缺点是鼠标坐标会有轻微偏移,做精细操作时不舒服。更彻底的做法是按客户端的最小屏幕来设Geometry,或者给不同用户设不同分辨率——反正每个会话的配置是独立的,alice 用 1920x1080,bob 用 1600x900,互不影响。
剪贴板是另一个高频问题。RealVNC 默认支持文本剪贴板双向同步,但图片和文件不行。文本能复制过去但粘贴出来是乱码,通常是编码问题,服务端LANG没设对。在~/.vnc/config.d/vncserver-virtual.custom里加一行Env=LANG=zh_CN.UTF-8能解决大部分情况。文件传输在免费版里不支持,要么用scp,要么在服务器上开个临时的文件服务。
4. 桌面体验优化与常见故障排查
4.1 中文输入法和桌面细节的补齐
XFCE 或者 GNOME 起来之后,第一件事是确认中文能不能输入。Xvnc 会话不继承 SSH 的环境变量,输入法框架需要显式在会话启动时拉起。
以 fcitx 为例,先装包:
yum install -y fcitx fcitx-configtool fcitx-table-wubi fcitx-pinyin然后在会话启动脚本里注入环境变量。RealVNC 的 virtual 模式会读~/.vnc/xstartup,但更推荐用配置文件里的Env=方式,避免改脚本被升级覆盖:
Env=GTK_IM_MODULE=fcitx Env=QT_IM_MODULE=fcitx Env=XMODIFIERS=@im=fcitx改完重启会话,进桌面后右上角或者托盘区应该有输入法图标,Ctrl+Space切换。如果没有,手动在终端跑fcitx看报什么错,最常见的是缺fcitx-frontend-gtk2或gtk3包,按提示补装即可。
字体也是个小坑。服务器最小化安装的字体集很有限,中文可能显示成方块。装一套常用字体:
yum install -y wqy-microhei-fonts wqy-zenhei-fonts fc-cache -fvfc-cache刷新字体缓存这步别省,装完不刷新,新开的会话可能还是找不到字体。
还有一个小细节值得提:virtual 会话里的桌面没有声音。VNC 协议本身不传音频,RealVNC 免费版也不做音频重定向。如果应用必须出声,得另想办法,比如在服务器上跑一个音频服务做流转,但这超出了桌面共享的范畴,多数图形工具也不需要声音,可以先不管。提前知道这一点,能避免装完之后花时间找"为什么没声音"。
4.2 五类高频故障的排查路径
下面这张表是我这些年遇到频率最高的问题,按"现象—原因—处理"整理,照着查基本能覆盖八成情况。
| 现象 | 最可能的原因 | 处理方式 |
|---|---|---|
| 客户端连接超时,无任何提示 | 防火墙未放行对应端口 | firewall-cmd --add-port=590N/tcp后 reload |
| 提示 "connection refused" | 该 display 的会话没启动 | vncserver-virtual :N启动,或查 systemd 用户服务状态 |
| 密码正确但认证失败 | 用了 x11 的密码连 virtual 会话 | 重新执行vncpasswd -virtual |
| 连上后灰屏,只有鼠标 | 桌面环境未加载或 Session 配错 | 检查Session=值和对应桌面包是否安装 |
| 会话启动报 "already running" | display 号被占用 | vncserver-virtual -list查占用,换号或先 kill |
除了这些,还有两个不太好归类的经验。
一个是会话僵死。Xvnc 进程还在,端口也监听,但客户端连上去黑屏或者卡在握手。这种情况多半是之前的会话没正常退出,留下了锁文件。~/.vnc/目录下会有*.pid和 X 的锁文件/tmp/.X1-lock,手工清掉再重启往往就好了:
vncserver-virtual -kill :1 rm -f /tmp/.X1-lock /tmp/.X11-unix/X1 vncserver-virtual :1锁文件残留是 X server 的通病,不分 VNC 实现,知道这个套路能省很多重启服务器的时间。
另一个是多人并发下的资源争抢。五个人同时开着浏览器、IDE 和图形工具,内存还好说,CPU 和 IO 容易打架。可以在每个用户的会话配置里限制一下,或者用 cgroup 做资源隔离。最简单有效的做法是给每个人约定好不要在服务器桌面上跑重负载编译,编译走 SSH 加nice,桌面只用来做交互式操作。这个约定比任何技术手段都管用。
5. 安全加固与长期运维的几个关键点
5.1 账号、密码与访问面收敛
多人共用的服务器,VNC 端口暴露面必须收敛。最基础的一条:不要把 5901 这类端口直接映射到公网。RealVNC 的加密是传输层加密,认证强度依赖密码,密码弱一点就是突破口。内网使用是常态,确实需要跨网络访问的,走组织已有的安全接入通道,或者用 SSH 隧道把端口转到本地再连——这是标准做法,配置也简单:
ssh -L 5901:localhost:5901 alice@server-ip -N本地客户端连localhost:1,流量全程在 SSH 通道里,VNC 端口不对外暴露。这个方式对带宽有一点损耗,但安全性和便利性的平衡最好。
账号层面,每个用户一个独立系统账号是底线,不要图省事让所有人共用一个账号再开多个 display。共用账号意味着家目录、权限、进程全是混的,出了问题查不到人,而且~/.vnc/passwd只有一份,改密码会互相覆盖。
密码策略上,VNC 密码和系统密码分开设,VNC 密码定期换。RealVNC 的密码文件是加密存储的,但加密强度有限,别用生日或者 123456 这种。如果团队人多,可以写个小脚本批量改,但改完要通知到人,否则第二天全是"我连不上了"的工单。
5.2 日志、监控与升级策略
RealVNC 的日志分散在两个地方:服务级日志在/var/log/vnc/或者 journald 里,会话级日志在用户家目录的~/.vnc/*.log。排查问题时先看会话日志,里面会记录 Xvnc 启动参数、桌面加载过程、认证失败原因,信息比服务日志细。
监控方面,最朴素也最有效的方法是定时检查端口和进程:
for i in 1 2 3 4 5; do ss -lntp | grep -q ":590$i" && echo "display :$i OK" || echo "display :$i DOWN" done把这个写成 cron 任务,每五分钟跑一次,挂了就发告警邮件。VNC 会话挂掉不会影响系统其他服务,很容易被忽略,等用户发现的时候可能已经挂了一整天。
升级要谨慎。RealVNC 大版本升级会改配置文件格式和密码存储方式,直接从 6.x 跳到 7.x 可能导致原有会话全部失效。稳妥的节奏是:先在测试机上装新版本,把现有用户的配置文件拷过去验证一遍,确认Session、Geometry、Env这些键还兼容,再动生产机。升级前备份整个~/.vnc/目录,出问题能快速回滚。
还有一个容易被忽略的点:系统内核和 glibc 升级后,Xvnc 可能需要重启才能加载新的库。CentOS 7 的yum update如果更新了mesa-libGL之类的图形库,正在跑的会话里图形应用可能出奇怪的问题,比如窗口渲染错乱。这种情况不用排查,直接systemctl --user restart vncserver重启会话,九成能解决。
我个人在实际操作中的习惯是,给每个用户的会话配置单独做一份 Git 管理,~/.vnc/config.d/下的文件纳入版本控制,谁改了什么一清二楚。服务器多了之后,这套东西还能用配置管理工具批量推,比手工一台台配靠谱得多。另外,新用户接入的时候,我会让他们先用 xterm 会话连一次,确认链路和密码没问题,再切到正式桌面环境——这个两分钟的小步骤,能挡掉后面一半的初级问题。