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_ADDRESSXDG_RUNTIME_DIRXAUTHORITYDISPLAY
这些变量与第一个 session 紧密关联,导致桌面组件(如 xfwm4、xfce4-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

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 配置中:
- 将 “Run command using” 设置为
su - Launch Command 直接设置为:
1
xfce4-session
注:“Run command using” 默认被设置为
execve,这里将它选择su
原理说明
使用 su 时,ETX 会通过以下方式启动会话:
1
su - username -c "xfce4-session"
su - (或 su --login) 会:
- 创建全新的登录环境:模拟用户从头登录,重新初始化所有环境变量
- 清除继承的环境变量:不会从父进程继承导致冲突的
DBUS_SESSION_BUS_ADDRESS、XDG_RUNTIME_DIR等变量 - 重新读取用户配置:自动执行
~/.bash_profile、~/.profile等登录脚本
这种方法配置最简单,适合希望获得完整用户登录环境的场景。
方法对比:execve vs. su
在 ETX Profile 中,”Run command using” 支持多种执行模式,其中 execve 和 su 都能解决多会话灰屏问题,但性能和适用场景有所不同:
性能对比
| 对比维度 | 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。
验证方式
-
启动第一个 ETX session,观察日志是否正常:
1
tail -f ~/.xsession-errors
- 启动第二个 session,确认灰屏是否消失。
-
可对比前后
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)的处理方式类似。
引用
- XFCE Forum: https://forum.xfce.org/viewtopic.php?id=11046
- XFCE Bugzilla: https://bugzilla.xfce.org/show_bug.cgi?id=7502
