RHEL 8/9(及其衍生发行版) 下 Xfce/Mate 桌面 在 RocketSoftware ETX 多会话中出现灰屏问题的解决方案

参考资料:

背景

在使用 RocketSoftware Exceed TurboX(ETX)部署远程 Linux 桌面时,用户往往会配置轻量级桌面如 xfce4-session 以适配 RHEL 8/9 图形栈。但当同一用户尝试启动第二个会话时,桌面无法正确加载,常见表现为:

  • 仅显示灰屏(无任务栏/窗口管理器)
  • 不响应鼠标/键盘
  • 关闭 Session 时无法正常退出

根因分析

根据社区讨论与官方 bug 跟踪,出现该问题的主要原因包括:

1. xfce4-session 不支持并发运行多实例(同用户)

XFCE 的 session 管理器(xfce4-session)会尝试通过 DBus 注册 session,如果同一用户已有运行中的 session,则第二个 session 会因为注册失败或资源锁冲突而退出或挂起。

2. 环境变量继承导致资源冲突

当启动第二个 ETX 会话时,若复用了以下关键环境变量,会话初始化将失败:

  • DBUS_SESSION_BUS_ADDRESS
  • XDG_RUNTIME_DIR
  • XAUTHORITY
  • DISPLAY

这些变量与第一个 session 紧密关联,导致桌面组件(如 xfwm4xfce4-panel)无法初始化或连接错误的 socket 文件。

3. ~/.cache/sessions/ 下的 session 文件未隔离

XFCE 会在该目录记录 session 状态,多 session 并发写入/读取会触发 race condition。


解决方案

1、 使用干净环境变量启动 xfce4-session

创建如下脚本(如 /nfs/etx/scripts/startxfce4-clean.sh):

1
2
3
4
5
6
7
8
9
#!/bin/bash

env -i /bin/sh -c "export PATH=$PATH;
                   export XAUTHORITY=$XAUTHORITY;
                   export DISPLAY=$DISPLAY;
                   export HOME=$HOME;
                   export LOGNAME=$LOGNAME;
                   export USER=$USER;
                   /usr/bin/xfce4-session"

确保设置权限:

1
chmod +x /nfs/etx/scripts/startxfce4-clean.sh

在 ETX 中,将该脚本设置为会话的启动命令(launch Command)。

2、 直接在 ETX Profile 的 Xstart 设置上述命令为 Launch Command

image-20260112093346811

1
2
3
4
5
6
7
8
9
#!/bin/bash

env -i /bin/sh -c "export PATH=$PATH;
                   export XAUTHORITY=$XAUTHORITY;
                   export DISPLAY=$DISPLAY;
                   export HOME=$HOME;
                   export LOGNAME=$LOGNAME;
                   export USER=$USER;
                   /usr/bin/xfce4-session"

3、在 ETX Profile 中设置 “Run command using” 为 “su”

这是一个更简洁的替代方案。在 ETX Profile 配置中:

  1. “Run command using” 设置为 su
  2. Launch Command 直接设置为:
1
xfce4-session

注:“Run command using” 默认被设置为 execve,这里将它选择su image-20260112212310587

原理说明

使用 su 时,ETX 会通过以下方式启动会话:

1
su - username -c "xfce4-session"

su - (或 su --login) 会:

  • 创建全新的登录环境:模拟用户从头登录,重新初始化所有环境变量
  • 清除继承的环境变量:不会从父进程继承导致冲突的 DBUS_SESSION_BUS_ADDRESSXDG_RUNTIME_DIR 等变量
  • 重新读取用户配置:自动执行 ~/.bash_profile~/.profile 等登录脚本

这种方法配置最简单,适合希望获得完整用户登录环境的场景。


方法对比:execve vs. su

在 ETX Profile 中,”Run command using” 支持多种执行模式,其中 execvesu 都能解决多会话灰屏问题,但性能和适用场景有所不同:

性能对比

对比维度 execve su
启动速度 ⚡ 极快(5-20ms) 🐢 较慢(50-200ms)
进程创建 直接替换当前进程 需要 fork + exec 创建新进程
系统开销 最小(单次系统调用) 较大(多次系统调用 + PAM)
适合场景 大量并发会话、追求性能 小规模部署、需要完整环境

功能对比

特性 execve + env -i su
环境变量隔离 ✅ 手动控制,精确指定 ✅ 自动隔离
配置复杂度 ⚠️ 需要手动列出所有必需变量 ✅ 极简(直接运行命令)
用户配置加载 ❌ 不加载 .bashrc ✅ 自动加载所有登录配置
PAM 会话设置 ❌ 不触发 ✅ 完整的 PAM 流程
适合新手 ⚠️ 需要理解环境变量 ✅ 开箱即用

选择建议

场景 推荐方法 理由
追求极致性能 execve 启动快 4-10 倍
生产环境大量并发 execve 减少系统负载
需要用户环境模块 su 自动加载 module、alias 等
简单快速配置 su 配置最简单
精确控制环境 execve 明确知道所有变量

示例配置

方法 A:使用 execve(高性能)

1
2
Run command using: execve
Launch Command: env -i /bin/sh -c "export PATH=$PATH; export XAUTHORITY=$XAUTHORITY; export DISPLAY=$DISPLAY; export HOME=$HOME; export LOGNAME=$LOGNAME; export USER=$USER; /usr/bin/xfce4-session"

方法 B:使用 su(简洁)

1
2
Run command using: su
Launch Command: xfce4-session

💡 建议:对于 XFCE 多会话灰屏问题,两种方法都足够。如果追求性能且熟悉环境变量配置,选择 execve;如果希望配置简单且需要完整用户环境,选择 su


验证方式

  1. 启动第一个 ETX session,观察日志是否正常:

    1
    
    tail -f ~/.xsession-errors
    
  2. 启动第二个 session,确认灰屏是否消失。
  3. 可对比前后 env 差异:

    1
    2
    3
    
    env > /tmp/env1   # 第一个正常
    env > /tmp/env2   # 第二个失败
    diff -u /tmp/env1 /tmp/env2
    

扩展与总结

在 RHEL 8/9 + ETX 环境中,使用 XFCE 桌面时遇到灰屏,绝大多数是由于环境变量未隔离引起的。通过 env -i 启动一个最小化的会话环境,可以彻底绕过 xfce4-session 多实例带来的冲突。

经测试,该方法同样适用于 RHEL 8/9 + Mate 环境,相应地将上面的 xfce4-session 替换为 mate-session 即可。


附录

说明

这里以 RHEL 8/9 为例,其它 RHEL derived 发行版(如 Rocky Linux)的处理方式类似。

引用