跳转至

RUNBOOK — hpc-submit TigerVNC 多用户远程桌面

项目 内容
服务名 TigerVNC(每用户一个 vncserver@:<display>.service 实例)
目标主机 hpc-submit / 192.168.31.28
重要性等级 中。影响:所有 EDA 图形作业(Virtuoso / ICC2 / Calibre 等)的远程操作入口;不影响 SSH 命令行作业与集群调度提交
服务负责人 集群运维(SRE)

目录

  1. 服务概览 2. 接入与凭据 3. 日常速查表 4. 日常操作 5. 配置管理 6. 备份与恢复 7. 监控与告警 8. 故障处置 9. 安全与权限 10. 容量与性能 11. 附录

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

需要重点盯的项

  1. vnc-ldap-sync.service 连续失败 —— 通常是 LDAP 或 sssd 异常,会导致新用户无法自动接入;
  2. Xvnc 单进程 RSS 持续增长超过 1 GB —— 用户会话内程序泄漏,考虑协商后重启该会话;
  3. 可用内存低于 2 GB —— 9 个会话叠加用户重型作业,可能导致 OOM,按 10.2 处理;
  4. ⚠️ 会话数量突然少于映射条目数 —— 这是最容易被漏掉的故障。会话崩溃时服务状态是 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 连接被拒绝。

诊断

  1. 看会话日志中的启动错误 bash tail -30 /home/cy01/.vnc/hpc-submit:5.log 预期:正常时含 Xfce 组件启动信息。异常时常见 Session startup failed、Cannot open display。

  2. 确认 session= 配置与已安装的桌面会话匹配 bash grep ^session= /etc/tigervnc/vncserver-config-defaults # 预期 session=xfce ls /usr/share/xsessions/ # 预期含 xfce.desktop

  3. 确认 Xvnc 进程是否真的存在 bash pgrep -a Xvnc | grep ':5' 预期:/usr/bin/Xvnc :5 ... -rfbport 5905。无输出说明会话未真正起来。

  4. 确认密码文件存在且可读 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 或反复弹出密码框。

诊断

  1. 确认该用户的 display 与规则密码 bash grep ':5=' /etc/tigervnc/vncserver.users # 预期 :5=cy01 → 端口 5905

  2. 确认密码文件与当前 display 一致(标记文件记录了生成时的 display 号) bash cat /home/cy01/.vnc/.sync-display # 预期 5

  3. 确认客户端输入的是前 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 无其条目。

诊断

  1. 手动触发同步并观察输出 bash systemctl start vnc-ldap-sync.service journalctl -u vnc-ldap-sync.service -n 30 --no-pager 预期:出现 分配 display :N -> <user> 等行。

  2. 确认新用户确实存在于 LDAP 且带 uidNumber bash 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 两个属性。

  3. 确认用户被 exclude_users 排除 bash grep ^exclude_users /etc/vnc-ldap-sync.conf # 预期为空或不含该用户

  4. 确认 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。

诊断

  1. 查看失败原因 bash journalctl -u vnc-ldap-sync.service -n 50 --no-pager

  2. 按错误类型定位 ```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。

诊断

  1. 确认服务与进程状态 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 都看不到它。

  2. 查崩溃原因 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.conf 0600(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 同步,请勿在站点侧修改)