Ubuntu 24.04 使用 xRDP 远程桌面闪退:从 6010 端口冲突到 XFCE 与 D-Bus 的完整排查

最近在一台 Ubuntu 24.04.5 LTS 服务器上配置 xRDP,希望通过 Windows 自带的 mstsc 远程桌面连接 Ubuntu。

安装完成后,Windows 可以正常连接到 xRDP 登录界面,也能够输入正确的用户名和密码,但认证成功后,远程桌面窗口立即关闭。

一开始看起来像是 XFCE、Xorg 或 DBus 配置问题,但经过日志逐层排查,最终发现实际上存在 三个连续的问题:

  1. SSH 的 X11 Forwarding 占用了 xRDP 默认使用的 6010 端口。
  2. 解决端口冲突后,xRDP 启动的是 GNOME,而实际希望使用 XFCE。
  3. 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_64

Windows 客户端使用系统自带的:

mstsc.exe

Ubuntu 桌面环境使用:

XFCE

xRDP 使用 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 6010

2. 谁占用了 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 上:

  1. 完全关闭当前 mstsc
  2. 重新打开远程桌面
  3. 连接 Ubuntu
  4. 输入 winuser
  5. 登录 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 xrdp

2. 看 xRDP 日志

sudo journalctl -u xrdp -u xrdp-sesman --no-pager

3. 查看 6010 是否被占用

sudo lsof -i :6010

或者:

sudo ss -ltnp | grep 6010

4. 查看 xRDP Display

grep X11DisplayOffset /etc/xrdp/sesman.ini

5. 查看 xRDP 启动脚本

cat /etc/xrdp/startwm.sh

6. 检查 XFCE

which startxfce4
which xfce4-session

7. 检查 D-Bus

which dbus-launch

8. 检查 Ubuntu 软件源

cat /etc/apt/sources.list.d/ubuntu.sources

9. 检查某个软件包的版本来源

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-session

Ubuntu 软件源:

Suites: noble noble-updates

以及:

Suites: noble-security

最终:

Windows mstsc
    ↓
xRDP
    ↓
Display :20
    ↓
Xorg
    ↓
XFCE
    ↓
D-Bus
    ↓
正常远程桌面

至此,Ubuntu 24.04.5 LTS 的 xRDP + XFCE 远程桌面登录闪退问题彻底解决。

标签: none

添加新评论