RUNBOOK — hpc-submit TigerVNC 多用户远程桌面¶
| 项目 | 内容 |
|---|---|
| 服务名 | TigerVNC(每用户一个 vncserver@:<display>.service 实例) |
| 目标主机 | hpc-submit / 192.168.31.28 |
| 重要性等级 | 中。影响:所有 EDA 图形作业(Virtuoso / ICC2 / Calibre 等)的远程操作入口;不影响 SSH 命令行作业与集群调度提交 |
| 服务负责人 | 集群运维(SRE) |
目录¶
1. 服务概览¶
做什么用:为 EDA 集群提交节点提供多用户图形远程桌面,用户用 VNC Viewer 连接后获得一个独立的 Xfce 桌面。
组件构成:
| 组件 | 路径 | 作用 |
|---|---|---|
| TigerVNC 服务端 | /usr/bin/Xvnc、/usr/sbin/vncsession |
每个 display 一个 Xvnc 进程 |
| systemd 模板单元 | /usr/lib/systemd/system/vncserver@.service |
由 systemctl 按 display 实例化 |
| display→用户映射 | /etc/tigervnc/vncserver.users |
决定 :N 属于哪个用户 |
| 全局配置 | /etc/tigervnc/vncserver-config-defaults、-mandatory |
会话类型、认证方式、分辨率 |
| 用户密码 | ~/.vnc/passwd(各用户家目录) |
VNC 认证凭据,权限 0600 |
| 用户同步器 | /usr/local/sbin/vnc-ldap-sync |
将 LDAP 用户增量映射为 VNC 会话;所有用户级变更都走它 |
| 同步器配置 | /etc/vnc-ldap-sync.conf |
端口基数、密码模板、家目录策略 |
| 同步定时器 | vnc-ldap-sync.timer(每 10 分钟) |
自动发现 LDAP 新用户 |
依赖:sssd.service(LDAP 用户解析)、NFS 挂载 /home(192.168.31.249:/data/nfs/home,密码与会话日志存于此)、EPEL 仓库(Xfce 包来源)。
异常时的业务影响:用户无法打开图形界面的 EDA 工具;SSH 命令行与作业提交不受影响。
2. 接入与凭据¶
连接地址:192.168.31.28:<端口>(内网直连,无需 SSH 隧道)
| display | 端口 | 用户 | 规则密码 | 实际生效(前 8 字符) |
|---|---|---|---|---|
:1 |
5901 | rain01 | rain01@5901 |
rain01@5 |
:2 |
5902 | rain02 | rain02@5902 |
rain02@5 |
:3 |
5903 | rain03 | rain03@5903 |
rain03@5 |
:4 |
5904 | cloud01 | cloud01@5904 |
cloud01@ |
:5 |
5905 | cy01 | cy01@5905 |
cy01@590 |
:6 |
5906 | david01 | david01@5906 |
david01@ |
:7 |
5907 | lws01 | lws01@5907 |
lws01@59 |
:8 |
5908 | cq01 | cq01@5908 |
cq01@590 |
:9 |
5909 | ldapadmin | ldapadmin@5909 |
ldapadmi |
重要:RFB 的 VncAuth 只使用密码前 8 个字符(DES 8 字节密钥限制)。用户输入完整规则密码即可登录,客户端会自动做同样的截断。实际生效值上表已列出,用于排障时比对。
密码规则:<用户名>@<端口号>,由同步器按 /etc/vnc-ldap-sync.conf 的 password_template 生成。
密码可从哪里取:密码文件是 vncpasswd 的一次性加密结果,无法反解。如需确认某用户密码,只能按规则重新设置(见 8.2 场景:密码不匹配)。
客户端接入示例(命令行 vncviewer):
vncviewer 192.168.31.28:5 # 连接 cy01 的会话(:5 即 5905)
注意:display :5 与端口 5905 是同一件事的两种写法,vncviewer 接受 主机:显示号。
3. 日常速查表¶
| 目的 | 命令(在目标机上以 root 执行) |
|---|---|
| 全量状态总览 | /usr/local/sbin/vnc-ldap-sync status |
| 用户↔display 映射 | cat /etc/tigervnc/vncserver.users |
| 单个会话状态 | systemctl status vncserver@:5.service --no-pager |
| 所有会话一行列出 | systemctl list-units 'vncserver@*' --no-pager |
| 重启单个会话 | systemctl restart vncserver@:5.service |
| 查看会话日志 | tail -50 /home/cy01/.vnc/hpc-submit:5.log |
| 立即同步 LDAP 新用户 | systemctl start vnc-ldap-sync.service |
| 同步器执行历史 | journalctl -u vnc-ldap-sync.service -n 50 --no-pager |
| 端口监听检查 | ss -tlnp \| grep -E ':59[0-9][0-9]' |
| 内存水位 | free -m \| head -2 |
从客户端(无需登录服务器):
| 目的 | 命令 |
|---|---|
| 连通性握手测试 | timeout 5 bash -c "exec 3<>/dev/tcp/192.168.31.28/5905 && head -c 12 <&3" → 期望 RFB 003.008 |
4. 日常操作¶
4.1 状态检查¶
/usr/local/sbin/vnc-ldap-sync status
预期输出(表头 + 每个用户一行):
USER DISPLAY PORT SERVICE ACTIVE ENABLED PORT_LISTEN ISSUE
rain01 :1 5901 vncserver@:1.service done done yes
...
ACTIVE/ENABLED 列为 done 表示达标,ISSUE 列非空表示异常。命令退出码:全达标 0,有异常 1。
4.2 启动 / 停止 / 重启单个会话¶
systemctl stop vncserver@:5.service # 停止(用户桌面进程会被终止)
systemctl start vncserver@:5.service # 启动
systemctl restart vncserver@:5.service # 重启(用户当前桌面工作会丢失)
警告:
stop/restart会终止该用户桌面上的所有程序,未保存的 EDA 设计工作会丢失。操作前请确认用户知情。
预期:systemctl is-active vncserver@:5.service 返回 active,且 10 秒内 ss -tlnp | grep 5905 出现监听。
不符时:见 8.1 场景。
4.3 新增 LDAP 用户的会话(正常情况下无需人工干预)¶
定时器每 10 分钟自动同步。需要立即生效时手动触发:
systemctl start vnc-ldap-sync.service && journalctl -u vnc-ldap-sync.service -n 20 --no-pager
预期日志包含:
分配 display :10(端口 5910)-> newuser
newuser: 已创建家目录 /home/newuser(套用 /etc/skel)
newuser: 已生成 ~/.vnc/passwd(规则 newuser@5910)
变更 3 项:...
不符时:见 8.3 场景。
4.4 下线某个用户的会话(不停服务,仅移除 VNC)¶
systemctl disable --now vncserver@:5.service
只停服务与自启,不删除映射与密码文件。恢复时 systemctl enable --now vncserver@:5.service 即可。
切勿手工从
/etc/tigervnc/vncserver.users删除该行——映射被删后同步器会为其重新分配一个新端口(因为uidNumber仍在 LDAP 中),导致该用户密码规则变化。要彻底排除某用户,应在/etc/vnc-ldap-sync.conf的exclude_users中加入该用户名(逗号分隔)。
4.5 回收 display 号(谨慎)¶
display 号设计为不回收。仅在某用户已从 LDAP 删除且需要整理端口时执行:
# 1) 确认该 uid 已不在 LDAP 中(无输出即为已删除)
ldapsearch -x -LLL -H ldap://192.168.31.10:389 -D "cn=admin,dc=rainchen,dc=com" -W \
-b "dc=rainchen,dc=com" "(uid=olduser)" uid
# 2) 停用会话并删除映射行(高危:手工编辑,先备份)
cp -a /etc/tigervnc/vncserver.users /root/vncserver.users.bak.$(date +%Y%m%d-%H%M%S)
systemctl disable --now vncserver@:5.service
sed -i '/^:5=/d' /etc/tigervnc/vncserver.users
# 3) 重排后的映射若与其它用户冲突,需同步调整 /etc/tigervnc/vncserver.users 与
# 对应用户的 ~/.vnc/passwd(密码内嵌端口,必须一并更新,否则登录失败)
systemctl start vnc-ldap-sync.service
该操作会引发密码变更,必须提前通知受影响的用户。若无明确需求,建议不做。
4.6 日志查看¶
# 会话日志(每个用户一份,文件名含主机名与 display)
tail -50 /home/<user>/.vnc/$(hostname):<display>.log
# 服务与同步器的 systemd 日志
journalctl -u vncserver@:5.service -n 50 --no-pager
journalctl -u vnc-ldap-sync.service --since "1 hour ago" --no-pager
5. 配置管理¶
5.1 配置文件位置与作用¶
| 文件 | 作用 | 生效方式 |
|---|---|---|
/etc/tigervnc/vncserver.users |
display→user 映射 | 由 vnc-ldap-sync 维护,勿手工编辑 |
/etc/tigervnc/vncserver-config-defaults |
全局默认(session=xfce、geometry=1920x1080、depth=24、alwaysshared、desktop=EDA-HPC) |
重启会话生效 |
/etc/tigervnc/vncserver-config-mandatory |
强制项(securitytypes=vncauth),优先级最高 |
重启会话生效 |
/etc/vnc-ldap-sync.conf |
同步器策略(base_port、password_template、create_home、exclude_users) |
下次同步生效 |
~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-screensaver.xml |
用户级桌面锁屏与屏保偏好(非 VNC 服务配置) | 经会话 DBus 用 xfconf-query 设值,立即生效;直接改文件无效(xfconfd 回写覆盖) |
/etc/xdg/xfce4/xfconf/xfce-perchannel-xml/xfce4-screensaver.xml |
系统级桌面锁屏策略(由部署工程交付,禁用屏保与空闲锁屏) | 新会话启动时读取;用户级已显式设置该键时以用户级为准;由 deployer.py 维护,勿手工编辑 |
5.2 配置优先级¶
vncserver-config-mandatory > 用户 ~/.vnc/config > vncserver-config-defaults
5.3 修改全局分辨率的流程¶
# 1) 备份
cp -a /etc/tigervnc/vncserver-config-defaults \
/root/vncserver-config-defaults.bak.$(date +%Y%m%d-%H%M%S)
# 2) 修改(示例:改为 2560x1440)
sed -i 's/^geometry=.*/geometry=2560x1440/' /etc/tigervnc/vncserver-config-defaults
# 3) 逐会话重启生效(警告:会终止用户桌面程序,需提前通知)
systemctl restart vncserver@:1.service vncserver@:2.service vncserver@:3.service \
vncserver@:4.service vncserver@:5.service vncserver@:6.service \
vncserver@:7.service vncserver@:8.service vncserver@:9.service
# 4) 验证:连接后查看桌面分辨率,或检查 Xvnc 启动参数
pgrep -a Xvnc | grep geometry
易错点:
- 改 session= 的值必须与 /usr/share/xsessions/<值>.desktop 匹配,否则服务 active 但端口不监听;
- 单用户如需个性化,写 ~/.vnc/config(会被 mandatory 覆盖的项除外);
- 修改 base_port 会改变所有新用户的端口,对已分配 display 的用户无效(已分配的端口固定在映射文件里)。
6. 备份与恢复¶
备份策略:变更产生的备份统一存放于工程交付目录 vnc-server-deploy/backup/(本地权威台账,逐条登记见 backup/README.md),并在目标机 /root/vnc-server-deploy-backup/<时间戳>/ 暂存一份便于现场回滚。
手工备份命令(修改任一配置前执行):
TS=$(date +%Y%m%d-%H%M%S)
mkdir -p /root/vnc-server-deploy-backup/$TS
cp -a /etc/tigervnc/vncserver.users /root/vnc-server-deploy-backup/$TS/vncserver.users.bak.$TS
cp -a /etc/tigervnc/vncserver-config-defaults /root/vnc-server-deploy-backup/$TS/vncserver-config-defaults.bak.$TS
cp -a /etc/vnc-ldap-sync.conf /root/vnc-server-deploy-backup/$TS/vnc-ldap-sync.conf.bak.$TS
ls -l /root/vnc-server-deploy-backup/$TS/
恢复步骤:
B=/root/vnc-server-deploy-backup/<时间戳>
# 高危:覆盖操作,先确认备份文件存在且内容正确
cat "$B/vncserver.users.bak.<时间戳>" | head
cp -a "$B/vncserver.users.bak.<时间戳>" /etc/tigervnc/vncserver.users
systemctl start vnc-ldap-sync.service # 让状态与恢复后的映射对齐
/usr/local/sbin/vnc-ldap-sync status # 验证
恢复后验证:status 输出全部 done;ss -tlnp | grep 590 端口数与映射数一致。
演练记录:2026-09-27 首次部署时,完整回滚路径通过 deployer.py rollback --force 设计验证(未实际执行回滚)。建议在业务低峰期实际演练一次并在此登记。
7. 监控与告警¶
关键指标与查看入口¶
| 指标 | 查看命令 | 健康阈值 |
|---|---|---|
| 会话服务状态 | /usr/local/sbin/vnc-ldap-sync status |
退出码 0,ISSUE 列全空 |
| 端口监听数 | ss -tlnp \| grep -cE ':59[0-9][0-9]' |
等于映射条目数 |
| 会话存活数 | pgrep -c Xvnc |
等于映射条目数 |
| 同步器最近执行 | systemctl list-timers vnc-ldap-sync.timer --no-pager |
上次执行在 15 分钟内 |
| 同步器失败计数 | systemctl is-failed vnc-ldap-sync.service |
返回 inactive(oneshot 正常结束即 inactive) |
| 内存水位 | free -m \| head -2 |
available > 8 GB |
| 单会话内存 | ps -o pid,rss,cmd -C Xvnc |
单会话 < 500 MB |
日志位置¶
| 日志 | 位置 |
|---|---|
| 会话启动日志 | /home/<user>/.vnc/<主机名>:<display>.log |
| 服务运行日志 | journalctl -u vncserver@:<display>.service |
| 同步器日志 | journalctl -u vnc-ldap-sync.service |
| 部署编排日志 | vnc-server-deploy/logs/*.log |
需要重点盯的项¶
vnc-ldap-sync.service连续失败 —— 通常是 LDAP 或 sssd 异常,会导致新用户无法自动接入;Xvnc单进程 RSS 持续增长超过 1 GB —— 用户会话内程序泄漏,考虑协商后重启该会话;- 可用内存低于 2 GB —— 9 个会话叠加用户重型作业,可能导致 OOM,按 10.2 处理;
- ⚠️ 会话数量突然少于映射条目数 —— 这是最容易被漏掉的故障。会话崩溃时服务状态是
inactive而不是failed(实测确认:vncsession以退出码 0 正常退出),因此systemctl is-failed与systemctl --failed都发现不了。告警必须建在pgrep -c Xvnc或vnc-ldap-sync status的PORT_LISTEN列上,不能只看服务状态。
8. 故障处置¶
8.1 场景:服务 active 但端口不监听¶
症状:systemctl is-active vncserver@:5.service 返回 active,但 ss -tlnp | grep 5905 无输出,VNC Viewer 连接被拒绝。
诊断
-
看会话日志中的启动错误
bash tail -30 /home/cy01/.vnc/hpc-submit:5.log预期:正常时含 Xfce 组件启动信息。异常时常见Session startup failed、Cannot open display。 -
确认
session=配置与已安装的桌面会话匹配bash grep ^session= /etc/tigervnc/vncserver-config-defaults # 预期 session=xfce ls /usr/share/xsessions/ # 预期含 xfce.desktop -
确认
Xvnc进程是否真的存在bash pgrep -a Xvnc | grep ':5'预期:/usr/bin/Xvnc :5 ... -rfbport 5905。无输出说明会话未真正起来。 -
确认密码文件存在且可读
bash stat -c '%a %U %n' /home/cy01/.vnc/passwd # 预期 600 cy01 ls -ld /home/cy01 /home/cy01/.vnc # 预期属主均非 root
处置:按诊断结果分支——
- session= 值错误 → 改正后 systemctl restart vncserver@:5.service;
- /usr/share/xsessions/xfce.desktop 缺失 → 重装桌面组:dnf -y groupinstall "Xfce" --setopt=group_package_types=mandatory,default;
- 密码文件缺失或属主为 root → 删除整个 ~/.vnc 后重新生成:systemctl start vnc-ldap-sync.service(同步器会重建)。
验证:ss -tlnp | grep 5905 有输出;客户端握手测试返回 RFB 003.008。
8.2 场景:VNC Viewer 报密码错误¶
症状:客户端提示 Authentication failure 或反复弹出密码框。
诊断
-
确认该用户的 display 与规则密码
bash grep ':5=' /etc/tigervnc/vncserver.users # 预期 :5=cy01 → 端口 5905 -
确认密码文件与当前 display 一致(标记文件记录了生成时的 display 号)
bash cat /home/cy01/.vnc/.sync-display # 预期 5 -
确认客户端输入的是前 8 字符
bash printf 'cy01@5905\n' | cut -c1-8 # 预期 cy01@590
处置:让用户尝试「完整规则密码」与「前 8 字符」两种写法(不同客户端截断行为略有差异)。若仍失败,按规则重置密码(见 8.5)。
验证:客户端成功进入 Xfce 桌面。
8.3 场景:LDAP 新增用户后没有自动出现 VNC 会话¶
症状:LDAP 中已创建新用户,但 cat /etc/tigervnc/vncserver.users 中无该用户,/usr/local/sbin/vnc-ldap-sync status 无其条目。
诊断
-
手动触发同步并观察输出
bash systemctl start vnc-ldap-sync.service journalctl -u vnc-ldap-sync.service -n 30 --no-pager预期:出现分配 display :N -> <user>等行。 -
确认新用户确实存在于 LDAP 且带
uidNumberbash ldapsearch -x -LLL -H ldap://192.168.31.10:389 -D "cn=admin,dc=rainchen,dc=com" -W \ -b "dc=rainchen,dc=com" "(uid=<newuser>)" uid uidNumber预期:返回uid与uidNumber两个属性。 -
确认用户被
exclude_users排除bash grep ^exclude_users /etc/vnc-ldap-sync.conf # 预期为空或不含该用户 -
确认 SSSD 能解析该用户(建家目录与写密码依赖 NSS 解析)
bash id <newuser>预期:返回 uid/gid。若报no such user,是 SSSD 缓存或 LDAP 侧问题。
处置:按诊断结果分支——
- 单元 2 无 uidNumber → 在 LDAP 侧补充该属性(uidNumber 是分配 display 的唯一依据);
- 单元 4 解析失败 → systemctl restart sssd 后重试;
- 单元 3 命中排除 → 编辑 /etc/vnc-ldap-sync.conf 移除该用户名。
验证:/usr/local/sbin/vnc-ldap-sync status 出现新用户且 ISSUE 列为空。
8.4 场景:同步定时器失败¶
症状:systemctl list-timers vnc-ldap-sync.timer 显示上次执行失败,或 systemctl is-failed vnc-ldap-sync.service 返回 failed。
诊断
-
查看失败原因
bash journalctl -u vnc-ldap-sync.service -n 50 --no-pager -
按错误类型定位 ```bash # LDAP 侧 systemctl is-active sssd timeout 5 bash -c 'cat < /dev/null > /dev/tcp/192.168.31.10/389' && echo "LDAP 可达"
# 配置文件 cat /etc/vnc-ldap-sync.conf ```
处置:常见原因是 LDAP 服务不可达或 sssd 异常。恢复 sssd 后手动触发一次:
systemctl restart sssd
systemctl start vnc-ldap-sync.service
systemctl is-failed vnc-ldap-sync.service # 预期 inactive
定时器为
Persistent=true,节点重启后会补跑错过的执行,无需人工干预历史缺口。
验证:/usr/local/sbin/vnc-ldap-sync status 全部 done。
8.5 场景:用户自行修改密码后需要重置¶
症状:用户用 vncpasswd 改过密码,现在需要恢复为标准规则密码。
诊断:确认当前密码文件与标记文件
ls -l /home/cy01/.vnc/passwd /home/cy01/.vnc/.sync-display
处置:同步器通过 .sync-display 标记判断是否需要重写密码,标记一致时不会覆盖用户自定义密码(这是有意设计)。要强制重置,先移除标记文件再触发同步:
rm -f /home/cy01/.vnc/.sync-display
systemctl start vnc-ldap-sync.service
验证:/home/cy01/.vnc/.sync-display 重新出现且内容为 5;客户端用 cy01@5905 登录成功。
8.6 场景:SELinux 切换为 Enforcing 后会话无法启动¶
症状:getenforce 返回 Enforcing,会话服务 active 但端口不监听,日志含 Permission denied。
诊断
getenforce
ls -Zd /home/cy01/.vnc/ # 检查上下文
ausearch -m avc -ts recent | tail -20 # 查看拒绝记录
处置
restorecon -RFv /home/cy01/.vnc
# 全部用户批量处理:
for u in $(awk -F= '/^:/{print $2}' /etc/tigervnc/vncserver.users); do
restorecon -RFv "/home/$u/.vnc" 2>/dev/null
done
systemctl restart vncserver@:1.service vncserver@:2.service vncserver@:3.service \
vncserver@:4.service vncserver@:5.service vncserver@:6.service \
vncserver@:7.service vncserver@:8.service vncserver@:9.service
验证:端口重新监听;ausearch -m avc -ts recent 无新增拒绝。
8.7 场景:某个 VNC 会话崩溃(Xvnc 进程消失)¶
症状:用户反馈 VNC 断开且连不上;vnc-ldap-sync status 中该用户 PORT_LISTEN=no。
诊断
-
确认服务与进程状态
bash systemctl is-active vncserver@:9.service # 预期 inactive —— 注意不是 failed systemctl is-failed vncserver@:9.service # 预期 inactive pgrep -a Xvnc | grep ':9' || echo "Xvnc 已消失"Xvnc被杀后,父进程vncsession会检测到子进程退出并以退出码 0 正常退出,服务随即变为inactive。因此is-failed和systemctl --failed都看不到它。 -
查崩溃原因
bash journalctl -u vncserver@:9.service --since "30 min ago" --no-pager | tail -20 tail -30 /home/ldapadmin/.vnc/hpc-submit:9.log dmesg -T | grep -iE "oom|killed process" | tail -5 # 排查是否被 OOM 杀掉
处置(按紧迫程度三选一)
# 方式一:立即人工恢复(秒级,推荐)
systemctl restart vncserver@:9.service
# 方式二:交给同步器,无需等待 timer 到期
systemctl start vnc-ldap-sync.service
# 方式三:不干预 —— 最迟 10 分钟后 timer 自动拉起
自愈机制:同步器把
inactive判为pending,会执行systemctl start。该链路已实测确认(见 SOP 附录 C),代价是恢复延迟最长一个 timer 周期(10 分钟)。
残留锁文件不需要手工清理:实测确认,/tmp/.X9-lock 与 /tmp/.X11-unix/X9 即使残留(锁内 PID 已死),systemctl restart 依然成功——Xvnc 检测到该 PID 已死会直接接管锁文件。不要手工 rm 这两个文件,那是老式 vncserver 手工运维时代的做法;本环境 /tmp 非独立挂载、重启不会清空,但残留同样无害。
验证
/usr/local/sbin/vnc-ldap-sync status # 该用户 PORT_LISTEN=yes
ss -tlnp | grep 5909 # 有监听
cat /tmp/.X9-lock # 内容应为新的 Xvnc PID
未覆盖的边界:若 Xvnc 进程仍存在但已 hang(而非退出),服务显示 active、端口也在监听,但客户端连不上或画面冻结。此时上述所有自动判据都会失效,需用户报障后人工 systemctl restart。
8.8 场景:用户被桌面锁屏卡住(忘记 LDAP 密码)¶
症状:VNC 连上后看到 Xfce 锁屏对话框(显示用户名 + Unlock 按钮),用户不记得该账户密码,进不去桌面。
根因:Xfce 默认开启空闲屏保与锁屏,解锁要求输入 LDAP 账户口令,与 VNC 连接口令(<user>@<port>)是两回事。该口令由 LDAP 目录持有,本机 root 无法代为重置——SSSD 经 LDAP 改密须提供旧口令,只能由 LDAP 管理员在目录侧执行。
诊断
# 1) 确认锁屏进程在跑(注意:进程名被截断为 15 字符,匹配必须用 -f)
pgrep -u <user> -af xfce4-screensaver # 预期输出 <pid> xfce4-screensaver
# 2) 查看该用户当前锁屏偏好(<uid> 与 <display> 的取值见第 2 章账号清单)
uf=<user>; uid=$(id -u "$uf"); d=<display>
su -s /bin/bash "$uf" -c "HOME=/home/$uf XDG_RUNTIME_DIR=/run/user/$uid DISPLAY=:$d \
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus \
xfconf-query -c xfce4-screensaver -lv"
处置:不需要密码也能恢复桌面——关掉该用户的锁屏偏好再终止锁屏进程即可,桌面会话与未保存工作全部保留。
uf=<user>; uid=$(id -u "$uf"); d=<display> # 例:uf=rain01 → uid=2001、d=1
ENVX="HOME=/home/$uf XDG_RUNTIME_DIR=/run/user/$uid DISPLAY=:$d DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus"
# 1) 关闭屏保与空闲锁屏(幂等:重复执行设同值,无副作用)
su -s /bin/bash "$uf" -c "$ENVX xfconf-query -c xfce4-screensaver -p /saver/enabled -s false --create -t bool"
su -s /bin/bash "$uf" -c "$ENVX xfconf-query -c xfce4-screensaver -p /lock/enabled -s false --create -t bool"
# 2) 解除当前锁屏(顺序不可颠倒:先落配置,再 kill,否则守护进程可能被重新拉起并再次锁屏)
pkill -u "$uf" -f xfce4-screensaver
不要为此重启会话(systemctl restart vncserver@:N):那会终止用户桌面进程、丢失未保存的 EDA 工作,而本场景根本不需要。
验证
pgrep -u "$uf" -af xfce4-screensaver || echo "无锁屏进程(符合预期)"
systemctl is-active vncserver@:$d.service # 预期 active
若要真正重置该用户的 LDAP 密码:须由 LDAP 管理员在目录侧执行(ldappasswd / ipa passwd <user>),本机 root 单独做不到。VNC 连接口令与本次故障无关,其重设方式见 8.2。完整变更档案见 SOP 第 9 章。
批量处理多个用户:xfce4-screensaver-command -d 比 pkill 温和(只停屏保、不杀守护进程),批量处理时优先用 -d。
命令里必须显式带
HOME=/home/<user>:su -s /bin/bash不会重置HOME。若该用户的xfconfd已空闲退出,xfconf-query会经 D-Bus 拉起新实例并按HOME定位配置目录——HOME仍是/root时会读错目录,表现为Channel "xfce4-screensaver" contains no properties,且写入会落到错误位置而命令仍返回 0(本轮已实测复现)。
# uid 用 id -u 实取,display 取自 /etc/tigervnc/vncserver.users(见第 2 章账号清单)
for spec in rain01:2001:1 rain02:2002:2; do # 按实际用户补全
u=${spec%%:*}; r=${spec#*:}; uid=${r%%:*}; d=${r##*:}
ENVX="HOME=/home/$u XDG_RUNTIME_DIR=/run/user/$uid DISPLAY=:$d DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus"
su -s /bin/bash "$u" -c "$ENVX xfconf-query -c xfce4-screensaver -p /saver/enabled -s false --create -t bool"
su -s /bin/bash "$u" -c "$ENVX xfconf-query -c xfce4-screensaver -p /lock/enabled -s false --create -t bool"
su -s /bin/bash "$u" -c "$ENVX xfce4-screensaver-command -d"
done
9 个用户的完整命令与回滚见 SOP 第 10 章。
新用户默认不锁屏:部署工程已交付系统级默认(见 5.1 表格),后续新建的 LDAP 用户与新会话默认关闭屏保与锁屏,无需逐个处理;deployer.py drift 可检出该策略文件缺失或被改动。若某用户仍希望锁屏,在桌面 GUI 中自行开启即可(用户级优先于系统级)。
9. 安全与权限¶
账号与权限模型:
- 每个 VNC 会话以对应用户身份运行(
vncsession <user> :<display>),会话内进程权限等同该用户,不存在跨用户越权; /etc/tigervnc/vncserver-config-mandatory锁定securitytypes=vncauth,用户无法通过~/.vnc/config关闭认证;- 密码文件
~/.vnc/passwd权限0600,属主为该用户; - 同步器与单元文件权限:同步器
0755,/etc/vnc-ldap-sync.conf0600(root only)。
凭据管理:
| 凭据 | 存放位置 | 取用方式 |
|---|---|---|
| LDAP 绑定口令 | /etc/sssd/sssd.conf(ldap_default_authtok,权限 0600) |
同步器运行时自动读取;不要复制到其它文件 |
| VNC 用户口令 | 各用户 ~/.vnc/passwd(加密后不可反解) |
按规则 <user>@<port> 重新生成 |
轮换 LDAP 绑定口令:在 /etc/sssd/sssd.conf 更新 ldap_default_authtok → systemctl restart sssd → systemctl start vnc-ldap-sync.service 验证同步仍成功。同步器无需改动(它每次运行都重新读取该文件)。
切换为 SSH 隧道模式(如需加固):
# 1) 备份
cp -a /etc/tigervnc/vncserver-config-defaults \
/root/vncserver-config-defaults.bak.$(date +%Y%m%d-%H%M%S)
# 2) 追加 localhost 限制,使 Xvnc 只监听回环
echo "localhost" >> /etc/tigervnc/vncserver-config-defaults
# 3) 重启全部会话
systemctl restart vncserver@:1.service vncserver@:2.service vncserver@:3.service \
vncserver@:4.service vncserver@:5.service vncserver@:6.service \
vncserver@:7.service vncserver@:8.service vncserver@:9.service
# 4) 验证:应只在 127.0.0.1 监听
ss -tlnp | grep 5905
客户端侧改为:
ssh -N -L 5905:localhost:5905 root@192.168.31.28 &
vncviewer localhost:5
回退:删除
localhost行并重启会话即可恢复内网直连。
已知安全短板:当前为内网直连 + VncAuth,密码在网络上以 DES 挑战-应答传输(非明文,但强度弱且密码规则可预测)。在不可信网络中必须切换为上述隧道模式。
10. 容量与性能¶
当前水位基线(2026-09-27 实测):
| 指标 | 数值 |
|---|---|
| 会话数 | 9 |
Xvnc 合计 RSS |
820 MB |
xfce4-session 合计 RSS |
515 MB |
| 会话基础合计 | 约 1.3 GB |
| 节点内存总量 / 可用 | 15.7 GB / 12.6 GB |
| 单会话基础分辨率 | 1920x1080 @ 24bpp |
| 每会话帧缓冲理论占用 | 1920×1080×4 ≈ 8.3 MB |
| 端口池 | 5901–5908 已用,5909 已用,5910+ 空闲 |
扩容触发条件:
- 新增 LDAP 用户 → 自动扩容,无需人工操作(同步器分配下一个 display);
- 可用内存低于 2 GB → 按 10.2 处理。
10.1 扩容¶
# 1) 在 LDAP 中创建用户(须含 uidNumber),或确认已存在
# 2) 立即触发同步
systemctl start vnc-ldap-sync.service
journalctl -u vnc-ldap-sync.service -n 20 --no-pager
# 3) 验证新会话
/usr/local/sbin/vnc-ldap-sync status
预期:新用户分配到 :10(端口 5910),服务 active 且端口监听。
10.2 扩容与缩容¶
缩容(内存紧张时下线低优先级会话,保留配置):
systemctl disable --now vncserver@:9.service # 例如下线 ldapadmin
free -m | head -2 # 观察回收效果
恢复:systemctl enable --now vncserver@:9.service。
已知瓶颈:单节点 8 vCPU,若多用户同时跑重型 EDA 图形作业,CPU 与内存竞争会明显;VNC 会话本身开销小(约 145 MB/会话),主要消耗来自用户桌面内运行的业务程序。
11. 附录¶
11.1 术语¶
| 术语 | 说明 |
|---|---|
display / :N |
VNC 显示编号,端口 = 5900 + N |
| VncAuth | RFB 标准密码认证,DES 8 字节密钥 → 密码仅前 8 字符有效 |
| vncsession | TigerVNC 1.13+ 的会话启动器,以目标用户身份拉起 Xvnc 与桌面 |
| 幂等 | 重复执行结果一致;本服务的验收标准是「第二次执行零变更、全跳过」 |
11.2 相关文档与交付物¶
| 文档 | 路径 |
|---|---|
| 变更实施 SOP(含完整步骤与回滚) | vnc-server-deploy/docs/SOP.md |
| 交接快照(项目根,由 Hook 自动注入) | docs/HANDOFF.md |
| 备份台账 | vnc-server-deploy/backup/README.md |
| 部署编排器 | vnc-server-deploy/deployer.py |
| 用户同步器源码 | vnc-server-deploy/assets/vnc-ldap-sync |
11.3 修订记录¶
| 日期 | 修改人 | 变更内容 |
|---|---|---|
| 2026-09-27 | SRE | 初版:TigerVNC 多用户部署完成,9 个 LDAP 用户上线 |
| 2026-09-27 | SRE | 新增 8.8「用户被桌面锁屏卡住」故障场景;5.1 补充用户级锁屏偏好位置(rain01 锁屏治理变更,见 SOP 第 9 章) |
| 2026-09-27 | SRE | 8.8 补充批量处理与「新用户默认不锁屏」说明;5.1 补系统级锁屏策略位置(锁屏策略工程化,见 SOP 第 10 章) |
来源:
/home/rain/Documents/services/vncserver/vnc-server-deploy/docs/RUNBOOK.md| 最后更新:2026-09-27 17:44(由build/sync.py同步,请勿在站点侧修改)