跳到主要内容

Ubuntu 远程桌面 (xrdp) 黑屏排查与修复

环境:Ubuntu 22.04 LTS + xrdp + GNOME + NVIDIA 闭源驱动。 2026-09-05 在实验室机器上实修记录。症状是"RDP 连上后黑屏",并且分两种阶段,根因完全不同,需要分开定位。

现象分类

先把黑屏分成两类,直接决定排查方向:

现象阶段大概率根因
连登录框都不出现,黑屏几秒后断开xrdp 握手 / TLS 协商xrdp 读不到 TLS 私钥(用户组问题)
能输用户名密码,登录后黑屏(或灰屏+鼠标)登录后启动桌面会话会话跑的是 GNOME,mutter 无法在 xrdp 的软件渲染 X 上出画面

下面两种都遇到过,逐一说明。

一、登录前黑屏:TLS 私钥权限

现象与日志

Windows 远程桌面连接后全黑、不给登录框,几秒后断开。xrdp 连接日志特征:

# /var/log/xrdp.log
[ERROR] Cannot read private key file /etc/xrdp/key.pem: Permission denied
[INFO ] Non-TLS connection established from ...: encrypted with standard RDP security
[ERROR] xrdp_sec_recv: xrdp_mcs_recv failed

关键在于 Cannot read private key file ... Permission denied:TLS 握手失败后降级成非 TLS,部分客户端不认,登录界面就画不出来。

根因

/etc/xrdp/key.pem 是指向 /etc/ssl/private/ssl-cert-snakeoil.key 的软链,而该私钥文件(及目录)只有 rootssl-cert 组可读。系统用户 xrdp 默认不在 ssl-cert 组里,自然读不到。

lrwxrwxrwx ... /etc/xrdp/cert.pem -> /etc/ssl/certs/ssl-cert-snakeoil.pem
lrwxrwxrwx ... /etc/xrdp/key.pem -> /etc/ssl/private/ssl-cert-snakeoil.key
# ssl-cert 组成员里没有 xrdp → 读不到私钥

这其实是 Ubuntu xrdp 的官方文档写明要做的配置/etc/xrdp/xrdp.ini 注释里就有),只是很多装机/部署时漏了。

修复

# 1) 把 xrdp 加入 ssl-cert 组
sudo adduser xrdp ssl-cert

# 2) 确保 snakeoil 私钥属组/权限正确
sudo chgrp ssl-cert /etc/ssl/private/ssl-cert-snakeoil.key
sudo chmod 640 /etc/ssl/private/ssl-cert-snakeoil.key

# 3) 重启 xrdp(进程的补充组在启动那一刻定死,必须重启才生效)
sudo systemctl restart xrdp-sesman
sudo systemctl restart xrdp

# 验证 xrdp 用户能读私钥
sudo -u xrdp test -r /etc/xrdp/key.pem && echo OK

重启后再连接,日志应变成 TLS connection established,登录框正常出现。

二、登录后黑屏:GNOME 与 xrdp 不兼容

现象与日志

TLS 修好后能出登录框,但选完会话、登录进去仍是黑屏。此时 X 服务器本身是起来的:

# ~/.xorgxrdp.<display>.log —— 看 X server 其实正常启动
(II) Initializing extension GLX
(II) AIGLX: Screen 0 is not DRI2 capable # 无 GPU,走软件渲染
(II) GLX: Initialized DRISWRAST GL provider for screen 0
rdpScreenInit: virtualX 1920 virtualY 1080 # 屏幕都初始化好了

X 正常、画面黑 → 问题在桌面环境:Ubuntu 22.04 默认的 GNOME Shell / mutter 无法在 xrdp 提供的这套软件 GL + 虚拟屏的 X 上完成合成渲染,于是黑屏。这是 xrdp + Ubuntu 22.04 GNOME 的知名兼容性坑,和选 Xorg 还是 Xvnc 会话无关——只要桌面还是 GNOME 就可能黑。

修复:给 xrdp 会话换一个轻量桌面(XFCE)

本地控制台可以继续用 GNOME,只让远程会话跑 XFCE:

# 1) 安装 XFCE
sudo apt install -y xfce4 dbus-x11

# 2) 让 xrdp 启动 XFCE 而非 GNOME
sudo cp /etc/xrdp/startwm.sh /etc/xrdp/startwm.sh.bak
sudo sed -i '/gnome-session/d' /etc/xrdp/startwm.sh
sudo tee -a /etc/xrdp/startwm.sh > /dev/null <<'EOF'

# XFCE for xrdp (GNOME 22.04 + xrdp renders black)
unset DBUS_SESSION_BUS_ADDRESS
exec startxfce4
EOF
sudo chmod +x /etc/xrdp/startwm.sh

# 3) 重启 xrdp
sudo systemctl restart xrdp-sesman
sudo systemctl restart xrdp

几个要点:

  • unset DBUS_SESSION_BUS_ADDRESS:避免继承本地控制台 GNOME 的会话总线导致冲突(同一用户本地已在 GNOME 桌面时尤其需要)。
  • 登录框的会话类型选 Xorg。部分机器 [Xvnc] 会话仍会出现在列表里,但如果没装 tigervnc-standalone-server,选它会立刻失败——可在 /etc/xrdp/xrdp.ini 里把 [Xvnc] 段落整体注释掉,只留 Xorg,从源头避免选错。
  • 若希望保留"GNOME 也能远程"的可能:先注销本地 GNOME 会话再连,成功率更高,但仍不保证;XFCE 是 xrdp 场景下的稳妥选择。

排查用日志速查

日志内容用途
/var/log/xrdp.log连接握手、TLS、客户端信息定位"登录前黑屏"(TLS 等)
/var/log/xrdp-sesman.log会话创建/销毁、X server 启动定位"会话起没起来、X server 是否启动成功"
~/.xorgxrdp.<display>.logxrdp 会话自己的 Xorg 日志确认 X server 与 GL 状态
systemctl status xrdp xrdp-sesman服务状态快速看是否运行

排错过程中的其它坑

  • apt-get update 报 404 / 非零退出:机上有失效的第三方 PPA(如 webupd8team/java,早已 404)会让 apt-get update 返回非零。若脚本里有 set -e,会在此直接中断。解决:禁用失效源再更新:

    sudo mv /etc/apt/sources.list.d/webupd8team-ubuntu-java-jammy.list{,.disabled}

    同类还有 Chrome 源重复配置(archive_uri-...jammy.list + google-chrome.list)产生的 W: 重复目标警告——无害,想清爽可删掉多余那个。

  • 怀疑是 VPN/网络问题? 先看日志确认连接是否到达服务器。本文案例里 TCP、能力交换都成功,失败点在服务器端 TLS——和客户端 VPN 无关。VPN 只会在"连上之后"造成卡顿/掉线,不会导致握手阶段黑屏。

参考

  • xrdp 官方文档关于 ssl-cert 组的说明就在 /etc/xrdp/xrdp.ini 注释里
  • xorgxrdp / xrdp 黑屏相关议题:Docusaurus 渲染不出可自行搜索 "xrdp Ubuntu 22.04 black screen GNOME"