Ubuntu 24.04 使用 xRDP 远程桌面闪退:从 6010 端口冲突到 XFCE 与 D-Bus 的完整排查
Ubuntu 24.04 使用 xRDP 远程桌面闪退:从 6010 端口冲突到 XFCE 与 D-Bus 的完整排查
最近在一台 Ubuntu 24.04.5 LTS 服务器上配置 xRDP,希望通过 Windows 自带的 mstsc 远程桌面连接 Ubuntu。
安装完成后,Windows 可以正常连接到 xRDP 登录界面,也能够输入正确的用户名和密码,但认证成功后,远程桌面窗口立即关闭。
一开始看起来像是 XFCE、Xorg 或 DBus 配置问题,但经过日志逐层排查,最终发现实际上存在 三个连续的问题:
- SSH 的 X11 Forwarding 占用了 xRDP 默认使用的 6010 端口。
- 解决端口冲突后,xRDP 启动的是 GNOME,而实际希望使用 XFCE。
- XFCE 启动后又发现系统缺少
dbus-launch,进一步定位发现 Ubuntu 软件源缺少noble-updates。
最终通过调整 xRDP Display、统一使用 XFCE,并恢复 Ubuntu 24.04 的 noble-updates 软件源解决问题。
一、环境
本次环境:
Ubuntu 24.04.5 LTS
Kernel 7.0.0-31-generic
x86_64Windows 客户端使用系统自带的:
mstsc.exeUbuntu 桌面环境使用:
XFCExRDP 使用 Xorg 模式。
二、最初的问题:mstsc 登录后立即闪退
Windows 端表现非常典型:
mstsc
↓
输入服务器 IP
↓
输入用户名/密码
↓
认证成功
↓
黑屏/桌面短暂出现
↓
mstsc 窗口立即关闭这种情况下,不应该一开始就反复修改 startwm.sh。
第一步应该看 xRDP 日志。
sudo journalctl -u xrdp -u xrdp-sesman --no-pager也可以查看:
sudo tail -n 100 /var/log/xrdp.log
sudo tail -n 100 /var/log/xrdp-sesman.log三、第一次关键发现:6010 端口被占用
日志中出现了:
g_tcp_bind(13, 6010) failed同时窗口管理器很快退出:
Window manager exited with non-zero exit code这里的 6010 非常关键。
1. xRDP Display 与端口的关系
X11 Display 通常与 TCP 端口存在这样的对应关系:
Display :10 → TCP 6010
Display :11 → TCP 6011
Display :12 → TCP 6012
...
Display :20 → TCP 6020而 xRDP 默认配置:
X11DisplayOffset=10意味着第一个会话通常从:
Display :10开始。
因此它需要使用:
TCP 60102. 谁占用了 6010?
执行:
sudo lsof -i :6010发现当前 SSH 连接启用了 X11 Forwarding。
也就是说:
SSH X11 Forwarding
↓
占用 6010
↓
xRDP
↓
也需要 6010
↓
端口冲突
↓
xRDP 窗口管理器启动失败这就是最初 mstsc 登录后闪退的第一个根本原因。
四、解决 6010 冲突
有两个解决方案。
方案一:修改 xRDP Display Offset
编辑:
sudo nano /etc/xrdp/sesman.ini找到:
X11DisplayOffset=10修改为:
X11DisplayOffset=20然后:
sudo systemctl restart xrdp这样 xRDP 就不会从 Display 10 开始,而是使用:
Display :20
TCP 6020这也是本次最终采用的方法。
方案二:关闭 SSH X11 Forwarding
如果服务器根本不需要 SSH X11 Forwarding,也可以关闭。
临时使用:
ssh -x user@server或者修改:
sudo nano /etc/ssh/sshd_config设置:
X11Forwarding no然后重启 SSH 服务。
不过对于需要保留 SSH X11 Forwarding 的服务器来说,修改 xRDP Display 更合适。
五、修改后,xRDP 已经能够启动 Xorg
修改:
X11DisplayOffset=20之后重新连接,日志出现:
Starting session:
display :20.0随后:
Found X server running at /tmp/.X11-unix/X20以及:
Session started successfully for user winuser on display 20这说明:
xRDP
↓
xrdp-sesman
↓
用户认证
↓
Xorg :20这一整条链路已经正常。
但是 mstsc 仍然闪退。
日志进一步显示:
Window manager (pid ..., display 20) exited with non-zero exit code 255
Window manager ... exited quickly这说明问题已经从:
Xorg 启动失败
变成:
Xorg 已经成功,但桌面环境启动失败。
六、第二个问题:startwm.sh 实际启动的是 GNOME
检查:
sudo cat /etc/xrdp/startwm.sh发现之前的配置是:
#!/bin/sh
if test -r /etc/profile; then
. /etc/profile
fi
if test -r "$HOME/.profile"; then
. "$HOME/.profile"
fi
unset DBUS_SESSION_BUS_ADDRESS
unset XDG_RUNTIME_DIR
export XDG_CURRENT_DESKTOP=ubuntu:GNOME
export XDG_SESSION_DESKTOP=ubuntu
export GNOME_SHELL_SESSION_MODE=ubuntu
exec /usr/bin/gnome-session --session=ubuntu问题就很明显了。
系统实际准备使用:
XFCE用户的:
/home/winuser/.xsession内容也是:
xfce4-session但是 /etc/xrdp/startwm.sh 却在启动:
gnome-session也就是说:
.xsession
↓
XFCE
startwm.sh
↓
GNOME两套桌面会话配置发生了冲突。
七、让 xRDP 明确使用 XFCE
备份原配置:
sudo cp /etc/xrdp/startwm.sh /etc/xrdp/startwm.sh.bak然后:
sudo nano /etc/xrdp/startwm.sh修改为:
#!/bin/sh
if test -r /etc/profile; then
. /etc/profile
fi
if test -r "$HOME/.profile"; then
. "$HOME/.profile"
fi
unset DBUS_SESSION_BUS_ADDRESS
unset XDG_RUNTIME_DIR
exec startxfce4然后确保有执行权限:
sudo chmod +x /etc/xrdp/startwm.sh同时:
cat /home/winuser/.xsession保持:
xfce4-session检查 XFCE:
which startxfce4应该得到:
/usr/bin/startxfce4检查:
which xfce4-session应该得到:
/usr/bin/xfce4-session八、不要在已经运行的 xRDP Display 上重复启动 XFCE
排查过程中曾经手工执行:
DISPLAY=:20 dbus-run-session startxfce4结果出现:
X server already running on display :20以及:
xrdb: Connection refused
Can't open display ':20'这里容易产生误判。
因为 :20 已经是 xRDP 创建的 Xorg 会话。
正确的结构应该是:
xrdp-sesman
↓
创建 Xorg :20
↓
startwm.sh
↓
startxfce4
↓
XFCE而不是在 SSH 终端中再次手动:
startxfce4因此,xRDP 会话正在运行时,不应该简单地在另一个 SSH shell 中重复启动同一个 Display 的桌面环境。
九、第三个问题:XFCE 已经启动,但提示 dbus-launch 不存在
修改 startwm.sh 后,再次使用 Windows mstsc 连接。
这一次已经可以进入 XFCE 桌面。
但是出现错误窗口:
未能与设置服务器联系
执行子进程 dbus-launch 失败(没有那个文件或目录)这说明:
xRDP、Xorg、XFCE 都已经启动成功,现在剩下的是 D-Bus 会话组件问题。
检查:
which dbus-launch没有结果。
在 Ubuntu 中,dbus-launch 由:
dbus-x11软件包提供。
因此尝试:
sudo apt install dbus-x11但又出现新的错误:
dbus-x11 :
依赖: dbus-bin (= 1.14.10-4ubuntu4)
但是 1.14.10-4ubuntu4.1 正要被安装
依赖: dbus-daemon (= 1.14.10-4ubuntu4)
但是 1.14.10-4ubuntu4.1 正要被安装
依赖: libdbus-1-3 (= 1.14.10-4ubuntu4)
但是 1.14.10-4ubuntu4.1 正要被安装十、继续追查:不是 D-Bus 损坏,而是 Ubuntu 软件源缺少 noble-updates
使用:
apt-cache policy dbus-x11 dbus-bin dbus-daemon libdbus-1-3发现:
dbus-x11:
候选:1.14.10-4ubuntu4但是:
dbus-bin:
已安装:1.14.10-4ubuntu4.1
dbus-daemon:
已安装:1.14.10-4ubuntu4.1
libdbus-1-3:
已安装:1.14.10-4ubuntu4.1问题变得非常清楚:
dbus-x11
↓
只有 Ubuntu noble 基础版本
其他 D-Bus 组件
↓
已经升级到 noble-updates 版本于是产生了版本依赖冲突。
十一、检查 Ubuntu 软件源
查看:
cat /etc/apt/sources.list.d/ubuntu.sources发现原来的配置:
Types: deb
URIs: http://cn.archive.ubuntu.com/ubuntu/
Suites: noble
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
Types: deb
URIs: http://security.ubuntu.com/ubuntu/
Suites: noble-security
Components: restricted main multiverse universe
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg这里少了一个非常重要的仓库:
noble-updates而 Ubuntu 24.04 正常的更新体系应该至少包含:
noble
noble-updates
noble-security十二、修复 Ubuntu 24.04 软件源
首先备份:
sudo cp /etc/apt/sources.list.d/ubuntu.sources \
/etc/apt/sources.list.d/ubuntu.sources.bak编辑:
sudo nano /etc/apt/sources.list.d/ubuntu.sources修改为:
Types: deb
URIs: http://cn.archive.ubuntu.com/ubuntu/
Suites: noble noble-updates
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
Types: deb
URIs: http://security.ubuntu.com/ubuntu/
Suites: noble-security
Components: restricted main multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg这里真正关键的是:
Suites: noble noble-updates十三、重新更新软件包索引
执行:
sudo apt update然后:
apt-cache policy dbus-x11此时应该可以看到类似:
dbus-x11:
Candidate: 1.14.10-4ubuntu4.1
Version table:
1.14.10-4ubuntu4.1
500 http://cn.archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages
1.14.10-4ubuntu4
500 http://cn.archive.ubuntu.com/ubuntu noble/main amd64 Packages这说明 dbus-x11 已经能够从 noble-updates 获取与系统其他 D-Bus 组件一致的版本。
然后安装:
sudo apt install dbus-x11确认:
which dbus-launch得到:
/usr/bin/dbus-launch再执行:
dbus-launch --version确认安装成功。
十四、最终重启 xRDP
安装完成后:
sudo systemctl restart xrdp然后在 Windows 上:
- 完全关闭当前
mstsc - 重新打开远程桌面
- 连接 Ubuntu
- 输入
winuser - 登录 XFCE
最终可以正常进入 Ubuntu XFCE 桌面。
十五、完整故障链路
这次问题比较典型,因为表面上看起来只是:
Windows mstsc 登录 Ubuntu 后闪退
实际上连续经历了三个不同层次的问题:
Windows mstsc
│
▼
xRDP
│
▼
SSH X11 Forwarding 占用 6010
│
▼
xRDP Display :10 无法使用
│
│ 修改 X11DisplayOffset=20
▼
Xorg :20
│
▼
Xorg 正常启动
│
▼
startwm.sh
│
▼
错误启动 GNOME
而用户实际使用 XFCE
│
│ 修改为 startxfce4
▼
XFCE
│
▼
缺少 dbus-launch
│
▼
尝试安装 dbus-x11
│
▼
APT 依赖冲突
│
▼
发现 Ubuntu 缺少 noble-updates
│
│ 恢复 noble-updates
▼
安装 dbus-x11
│
▼
/usr/bin/dbus-launch
│
▼
XFCE
│
▼
正常远程桌面十六、这次排查最值得记住的几个命令
以后遇到 Ubuntu xRDP 登录后闪退,可以优先使用下面这些命令。
1. 看 xRDP 服务
sudo systemctl status xrdp2. 看 xRDP 日志
sudo journalctl -u xrdp -u xrdp-sesman --no-pager3. 查看 6010 是否被占用
sudo lsof -i :6010或者:
sudo ss -ltnp | grep 60104. 查看 xRDP Display
grep X11DisplayOffset /etc/xrdp/sesman.ini5. 查看 xRDP 启动脚本
cat /etc/xrdp/startwm.sh6. 检查 XFCE
which startxfce4
which xfce4-session7. 检查 D-Bus
which dbus-launch8. 检查 Ubuntu 软件源
cat /etc/apt/sources.list.d/ubuntu.sources9. 检查某个软件包的版本来源
apt-cache policy dbus-x11十七、经验总结
这次问题最容易误判的地方,是看到 mstsc “登录后闪退”,就认为一定是 XFCE 或 xRDP 配置错误。
实际上,xRDP 登录流程是分层的:
网络连接
↓
TLS/RDP
↓
xrdp
↓
xrdp-sesman
↓
用户认证
↓
Xorg
↓
Window Manager
↓
桌面环境
↓
D-Bus / 系统服务排查时应该根据日志判断到底死在哪一层,而不是一次修改很多配置。
本次日志实际上给出了非常清晰的线索:
g_tcp_bind(..., 6010) failed说明是端口层问题。
解决后出现:
Session started successfully
Found X server running at /tmp/.X11-unix/X20说明 Xorg 已经正常。
随后:
Window manager exited quickly说明问题已经进入桌面环境启动阶段。
最终:
dbus-launch: No such file or directory则进一步定位到了 D-Bus。
而 apt-cache policy 又证明:
noble和:
noble-updates的软件包版本没有保持完整同步。
因此,日志是这次排查成功的关键,而不是不断尝试不同的桌面配置。
十八、最终配置
最终使用的 xRDP Display:
# /etc/xrdp/sesman.ini
X11DisplayOffset=20最终使用的 XFCE 启动脚本:
#!/bin/sh
if test -r /etc/profile; then
. /etc/profile
fi
if test -r "$HOME/.profile"; then
. "$HOME/.profile"
fi
unset DBUS_SESSION_BUS_ADDRESS
unset XDG_RUNTIME_DIR
exec startxfce4用户:
/home/winuser/.xsession内容:
xfce4-sessionUbuntu 软件源:
Suites: noble noble-updates以及:
Suites: noble-security最终:
Windows mstsc
↓
xRDP
↓
Display :20
↓
Xorg
↓
XFCE
↓
D-Bus
↓
正常远程桌面至此,Ubuntu 24.04.5 LTS 的 xRDP + XFCE 远程桌面登录闪退问题彻底解决。