WSL Debian xrdp 无法启动 —— 排查与修复记录

WSL Debian xrdp 无法启动 — 排查与修复记录

日期:2026-08-08
环境:Windows 11 Pro(WSL2)+ Debian trixie(13.6)+ systemd 257.13 + xrdp 0.10.1 + xorgxrdp 0.10.2


一、现象

  • WSL Debian 中 xrdp 无法启动,远程桌面连不上
  • xrdp.service / xrdp-sesman.service 状态为 inactive
  • /var/log/xrdp.log/var/log/xrdp-sesman.log 均为 0 字节(服务从未真正运行)
  • 3389 / 3390 端口均无监听

二、根因

systemd-firstboot.service(First Boot Wizard)无限挂起,阻塞整个启动链。

完整因果链:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
WSL2 每次启动重置 /etc/machine-id

systemd 启动时判定为"首次启动"(first boot)

启动 systemd-firstboot.service(First Boot Wizard)

该服务带 --prompt-locale / --prompt-keymap / --prompt-timezone / --prompt-root-password,
且 StandardInput=tty → 等待键盘交互输入

WSL2 无交互式 tty → 服务无限挂起(无超时)

sysinit.target 永远无法完成

45 个启动任务全部排队等待(xrdp / xrdp-sesman / NetworkManager 等)

xrdp 从未真正启动 → 日志 0 字节、端口无监听

这是 WSL2 + systemd 的已知坑。wsl --shutdown 重启无效,因为 machine-id 每次启动都被重置,firstboot 每次都触发、每次都挂起。

关键证据

证据 说明
systemctl list-jobs systemd-firstboot.service 一直是 start running,其余 44 个任务 waiting
/etc/machine-id 时间戳 16:09、16:14 两次,均等于当次 systemd 启动时刻 —— 每次启动都被重写
/etc/hosts/etc/localtime/etc/timezone/etc/hostname 时间戳 同为 16:14 —— WSL 每次启动自动重写的文件,machine-id 也被一并重置
/etc/hosts 内容 明确标注 “This file was automatically generated by WSL”
firstboot 服务定义 ExecStart=systemd-firstboot --prompt-locale ... 带 4 个交互参数
journal 16:09 那次 firstboot 挂到 16:13:44 被关机 SIGTERM 杀掉;16:14 重启后又挂起
passwd -S root root 密码为锁定状态(L),认证会失败

附带发现

  • systemd-binfmt.service 启动失败 —— WSL2 下 binfmt_misc 无法挂载,属已知无害现象,不影响 xrdp
  • 系统最终状态为 degraded,仅因 binfmt 失败,可忽略

三、解决方案

3.1 禁用 firstboot 服务(治本)

1
2
# 在 WSL Debian 中执行
sudo systemctl mask systemd-firstboot.service

然后在 Windows 端重启 WSL:

1
wsl --shutdown

重新进入 Debian 后,启动链即可走完,xrdp(已 enable)自动启动。

3.2 验证

1
2
3
systemctl is-system-running      # degraded(binfmt 无害失败,可忽略)
systemctl is-active xrdp xrdp-sesman # active active
ss -tlnp | grep 3390 # LISTEN *:3390 users:(("xrdp",...))

3.3 端口说明(3390 是有意为之)

  • 全局 port=3390 是为了避开 Windows 主机的 RDP 端口 3389
  • 实际上 WSL2 是独立网络命名空间,内部监听 3389 不会与 Windows RDP 冲突
  • 但从局域网外部直连时,3390 可避免与 Windows 自身 RDP 的端口转发规则冲突 —— 此选择合理,保留
  • 连接地址:localhost:3390

四、会话配置说明

  • xrdp.ini[Xorg] 段可用(lib=libxup.so),且已安装 xorgxrdp
  • 登录界面会话类型选 Xorg 即可,无需补 [xrdp1](标准 [xrdp1] 需依赖 VNC 后端,未安装 tigervnc)
  • [Xvnc] 段虽存在,但因未装 VNC 后端,选择 Xvnc 会话会失败

五、开启 root 连接

检查结论:

  • PAM 配置无需修改(/etc/pam.d/xrdp-sesman 走标准 common-auth,无拒绝 root 规则)
  • root 密码为锁定状态,需设置密码解锁

操作:

1
2
3
4
5
6
# 1. 设置 root 密码(同时解锁)
sudo passwd root

# 2. 重启 xrdp 使配置生效
sudo systemctl restart xrdp
ss -tlnp | grep 3390

连接(Windows):

  • 远程桌面(mstsc)→ localhost:3390
  • 用户名:root,密码:刚设置的密码
  • 会话类型:Xorg

若 root 登录后会话起不来,查看日志:

1
sudo tail -50 /var/log/xrdp-sesman.log

兜底方案:安装 tigervnc-scraping-server,登录界面改选 Xvnc 会话。

六、常用命令速查

命令 用途
systemctl status xrdp xrdp-sesman 查看 xrdp 服务状态
systemctl list-jobs 查看是否有排队/挂起的启动任务
systemctl --failed 查看失败的服务
ss -tlnp | grep 3390 查看监听端口
tail -50 /var/log/xrdp.log 查看 xrdp 日志
tail -50 /var/log/xrdp-sesman.log 查看会话管理器日志
journalctl -u systemd-firstboot 查看 firstboot 日志
passwd -S root 查看 root 密码状态(L=锁定)

七、涉及的关键文件

文件 说明
/etc/wsl.conf [boot] systemd=true —— 启用 systemd
/usr/lib/systemd/system/systemd-firstboot.service 已 mask,不再阻塞启动
/etc/xrdp/xrdp.ini 全局 port=3390;[Xorg] 会话段
/etc/xrdp/sesman.ini 会话管理配置
/etc/pam.d/xrdp-sesman PAM 认证配置(无需改动)

WSL Debian xrdp 无法启动 —— 排查与修复记录
https://bote798.top/2026/08/08/xrdp-排障记录/
作者
bote798
发布于
2026年8月8日
更新于
2026年8月8日
许可协议