Deepin 23.1 × xrdp 远程桌面折腾记
从 DDE 黑屏到 Xfce 可用一路踩坑实录背景Deepin 23.1DDE 桌面环境上安装了 xrdp 0.9.21.1 和 xorgxrdp 0.9.19准备从 Windows 远程桌面mstsc连接工作。xrdp 监听 48000 端口提供三个会话选项Xorg、Xvnc、vnc-any。vnc-any走 5900 端口连接本机 x11vnc 共享已有:0会话——能用但远程卡顿严重RFB 协议通病Xorg走 RDP 协议本应又快又顺——但第一次连接就是黑屏第一阶段DDE 的 D-Bus 单例冲突症状选择 Xorg 登录后黑屏.xsession-errors显示name org.deepin.dde.XSettings1 already taken name org.deepin.dde.Display1 already taken根因Deepin Desktop EnvironmentDDE使用 D-Bussession bus注册服务名。本地:0显示器上已经跑了一个完整的 DDE 会话这些服务名已被占用。xrdp 的 Xorg 模块启动第二个 X 服务器再通过startwm.sh→~/.xsession→exec startdde尝试启动第二个 DDE 实例时D-Bus 服务名注册失败显示部分启动不了。尝试一dbus-run-session 隔离dbus-run-session startdde启动一个新 D-Bus 会话总线隔离服务名冲突。D-Bus 层面通过了但 DDE 的新版startdde是 Go 二进制它通过systemd user services启动组件dde-desktop.service、dde-shellDDE.service等。Systemd user services 是per-user 单例无法跑第二份。所以尽管 D-Bus 隔离了DDE 仍然启动不了。关键洞察DDE 的 systemd 化导致它无法多实例运行。这不是简单的配置问题而是架构限制。第二阶段换桌面环境到 Openbox尝试安装openbox轻量窗口管理器修改~/.xsessionxrdp 会话走openbox-session本地:0保持exec startdde。结果Openbox 确实启动了但右击菜单不工作显示debian-menu.xml不存在。更严重的是——DISPLAY 环境变量被覆盖了。发现DISPLAY 之战xrdp-sesman 启动 Xorg 时分配了正确的 display 号如:10但startwm.sh在执行过程中会 source/etc/profile和~/.profile而 profile 链中某处可能是dbus-update-activation-environment或 DDE 的Xsession.d脚本把 DISPLAY 恢复成了:0。DEBUG|DISPLAY:10.0|XRDP1 ... profile 链 ... STARTWM|POST_PROFILE DISPLAY:0 ← 被覆盖了Debug 日志显示xrdp-sesman 设的DISPLAY:10.0是正确的但 profile 链执行后变成了:0。所有尝试在startwm.sh里修复 DISPLAY 的方案都被绕过了。最终应对绕过整个 Xsession 链直接 exec xfce4-sessionif [ -n $XRDP_SESSION ]; then export XDG_CURRENT_DESKTOPXfce export GDMSESSIONxfce exec xfce4-session fi这样 DDE 的Xsession.d脚本00deepin-dde-env、01deepin-profile等根本不会运行DISPLAY 不会被污染。第三阶段Xfce4 登场安装已安装xfce4和lxterminalxfce4-terminal在 Deepin 仓库不存在。最终配置三个核心文件/etc/xrdp/startwm.sh— 远程用 Xfce本地用 DDE#!/bin/sh if test -r /etc/profile; then . /etc/profile; fi if test -r ~/.profile; then . ~/.profile; fi if [ -n $XRDP_SESSION ]; then export XDG_CURRENT_DESKTOPXfce export GDMSESSIONxfce export DESKTOP_SESSIONxfce exec xfce4-session else export XDG_CURRENT_DESKTOPDeepin export GDMSESSIONdeepin-x11 test -x /etc/X11/Xsession exec /etc/X11/Xsession fi~/.xsession— 最简不设 DDE 变量if [ -n $XRDP_SESSION ]; then exec xfce4-session else export XDG_SESSION_TYPEx11 export GDMSESSIONdeepin-x11 export DESKTOP_SESSIONdeepin-x11 exec startdde fi/etc/xrdp/xrdp.ini— 注释掉无用的 Xvnc 和 neutrinordp 段;[Xvnc] ;[neutrinordp-any]遗留问题音频重定向编译了pulseaudio-module-xrdp从 GitHub 源码需要脉冲音频源码的config.h但pulseaudio --start --exit-idle-time-1 --disallow-exit在 xrdp 会话中会阻塞启动。目前声音仍走本地声卡。关键教训DDE 不支持多实例。Systemd user services 的 per-user 单例特性使得第二份 DDE 无法启动。这不是 xrdp 的问题是 DDE 的架构限制。DISPLAY 环境变量是一切的基础。xrdp-sesman 会设正确的 DISPLAY但 profile 链/etc/profile→~/.profile→~/.bashrc→ conda activate和 DDE 的Xsession.d脚本会把它覆盖成:0。绕过 Xsession 链是最干净的解决方案。直接 exec 目标桌面不经过/etc/X11/Xsession和Xsession.d避免被 DDE 的 D-Bus 和 dbus-activation 污染。xorgxrdp 需要 glamor 模块。即使glamor init failed加载glamoregl仍然是必须的——libxorgxrdp.so有符号依赖。去掉它会导致no screens found的致命错误X 服务器直接崩溃。xorg.conf 的 DRI3 选项可去掉。xrdpdev驱动不需要 DRI3去掉可以减少日志噪音。最终效果场景协议体验本地:0DDE不变正常远程 mstsc → XorgRDPXfce 桌面流畅远程 mstsc → vnc-any:5900VNC (RFB)保留作为备用声音仍在本地播放这是下一步需要解决的问题。