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 的软链,而该私钥文件(及目录)只有 root 和 ssl-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>.log | xrdp 会话自己的 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"