第 5 章 桌面、显示与显卡驱动¶
机器人上位机的图形栈同时承担两件事:本地或远程显示 RViz / Gazebo 这类工具,以及为 GPU 计算(CUDA、推理框架)提供驱动地基。装 NVIDIA 闭源驱动之后画面黑屏 / 循环登录、Wayland 会话下 RViz 起不来、xrdp 一登录就把本地 GNOME 会话踢下线——这些坑的根源都在同一层:显示服务器、显示管理器、内核模块驱动的三方协议。
本章把这条链拆开:会话类型怎么查、GDM 与 LightDM 的适用面、ubuntu-drivers 装驱动的三途径与互斥、Secure Boot 与 DKMS 签名、混合显卡 prime、无头运行与 xrdp 服务端的安装配置。方案横向选型与 X11Forwarding 机制在第 10 章,本章视角始终是"服务端如何装出来与让它跑起来"。
1. X11 与 Wayland¶
1.1 各自是什么¶
- X11 / Xorg(X Window System,1984 起):C/S 架构,客户端通过 X 协议向 X 服务器请求画窗口;网络透明(历史上可跨主机),窗口管理器可换;扩展机制成熟(GLX / XRandR / XInput)。
- Wayland(2008 起,替代设计):合成器(compositor)直接是显示服务器;客户端用 Wayland 协议向合成器提交缓冲区;安全模型更严(客户端不能截屏其他窗口);性能更可控,但网络透明被移除。
Ubuntu 桌面长期是 Xorg,21.04 起 GNOME 会话默认切 Wayland;22.04 LTS 桌面默认 Wayland、服务器安装无 GUI 无影响;24.04 保持默认 Wayland。GNOME 与 KDE 各自跑在 X11 与 Wayland 都可;MATE / XFCE 主要走 X11。
1.2 会话查询与切换¶
三处信号联合判当前跑的是什么:
echo "$XDG_SESSION_TYPE" # wayland 或 x11;来自 PAM/systemd
loginctl show-session $(loginctl | awk '/^(root|user)/ {print $1}' | head -1) -p Type
ps -ef | grep -E "Xorg|wayland" # 看进程
ls -l /tmp/.X11-unix # Xorg 会有 X0 X1 sockets;Wayland 有 wayland-0
GDM 登录界面右下角齿轮可选 "GNOME"(Wayland)或 "GNOME on Xorg"。想永久默认某一侧,改 /etc/gdm3/custom.conf 的 WaylandEnable=false 关掉 Wayland。
判据:远程 / 无头 / 老工具链场景优先 X11,兼容性最好;本地桌面 + 高刷屏 + HDR 优先 Wayland。Ubuntu 22.04 桌面版在装 NVIDIA 闭源驱动(580.178.04)的机器上,GNOME 会话仍落在 Xorg(上述三处查询都返回 x11),这是发行版对 GDM 会话类型的既定选择,不是用户配置失误;24.04 侧的默认会话与 RViz2 / Gazebo 客户端在 Wayland 下的兼容性仍属外部证据,在双基线对照前不作“某显示服务器可用”的通用结论。
2. 显示管理器与自动登录¶
2.1 GDM3 / LightDM / SDDM¶
| 显示管理器 | 默认使用方 | 特点 |
|---|---|---|
| GDM3(GNOME Display Manager) | Ubuntu 桌面版 | GNOME 集成深;配置在 /etc/gdm3/custom.conf;对 Wayland 支持最好 |
| LightDM | Xubuntu / MATE、无头机器人上位机常用 | 轻量、跨桌面通用;配置 lightdm.conf;自动登录直接改一行 |
| SDDM | KDE Plasma | KDE 原生;对 Wayland 会话支持好 |
同一台机器只能有一个显示管理器处于 active,装第二个会 systemctl 冲突:
sudo apt install lightdm
sudo systemctl set-default multi-user.target # 或先 systemctl disable gdm3
sudo dpkg-reconfigure lightdm # 选默认 DM
sudo systemctl daemon-reload
sudo systemctl restart lightdm # 桌面环境下会踢掉当前会话,慎用
判据:机器人上位机若只跑无头服务,直接 systemctl set-default multi-user.target 让启动停在 tty,不装任何 DM 更干净;需要本地桌面看 RViz 再装一个。
2.2 自动登录与免密 autologin¶
无人值守机器人上电即进桌面(或至少进某个会话)是常见需求。GDM3:
## /etc/gdm3/custom.conf
[daemon]
AutomaticLoginEnable=true
AutomaticLogin=robot
LightDM:
## /etc/lightdm/lightdm.conf
[Seat:*]
autologin-user=robot
autologin-user-timeout=0
安全边界:自动登录意味着开机就无鉴权进入该用户会话,物理接触即等于取凭据。生产部署配合:屏幕锁 + 磁盘加密(LUKS)+ 只留一个物理 HDMI 用于调试。
选 server 还是 desktop 不影响自动登录本身,但决定图形栈要不要装:带 RViz2、Gazebo 的上位机需要桌面侧依赖,纯节点机装 ubuntu-server + 按需补 xvfb 更干净。机器上位机上装哪个镜像是部署形态的选择(图形依赖、自动响应、镜像体积),与"给不给桌面用户用"无关。
3. 图形栈基座与显卡驱动¶
3.1 图形栈分层¶
一次"画一个三角形"的路径:
flowchart TD
app["应用(Qt / GLFW / RViz)"] --> api["OpenGL / Vulkan / EGL API"]
api --> drv["用户态驱动库<br/>Mesa 开源;libcuda / libnvidia-gl 闭源"]
drv --> drm["内核 DRM/KMS<br/>Direct Rendering Manager"]
drm --> gpu[("显卡硬件")]
关键包:
libgl1libglxlibegl1:GL(用户态图形库libGL.so)与 EGL 运行时。mesa-utils:glxinfo/glxgears;vulkan-tools:vulkaninfo;两者是查"我到底在用哪个驱动"的最短路径。- 内核侧:
i915(Intel)、amdgpu(AMD)、nouveau(NVIDIA 开源)、nvidia(NVIDIA 闭源)。
glxinfo | grep -E "OpenGL vendor|renderer|version" | head
vulkaninfo --summary # 22.04 起需要 Vulkan ICD 装好
3.2 NVIDIA 驱动三条途径¶
Ubuntu 上装 NVIDIA 闭源驱动有三条:
| 途径 | 命令 | 特点 |
|---|---|---|
ubuntu-drivers |
sudo ubuntu-drivers autoinstall |
Ubuntu 推荐途径;从 Ubuntu 仓库拉、按 linux-modules-nvidia-* 元包与 DKMS 配合,随内核升级重建 |
| Software & Updates → Additional Drivers | GUI 勾选 | 与 ubuntu-drivers 同一后端 |
.run 闭源包 |
官网下载 NVIDIA-Linux-x86_64-*.run |
绕过 apt 与 DKMS;升级维护成本高,与 apt 混装会互相破坏 |
ubuntu-drivers 是首选:
ubuntu-drivers devices # 查当前机器的 GPU 与建议驱动
sudo ubuntu-drivers autoinstall # 装建议版本
sudo apt install nvidia-driver-550 # 或指定版本
sudo reboot # 内核模块加载必须重启
nvidia-smi # 重启后确认出卡(GPU 观测见第 8 章)
nomodeset 残留是常见坑:安装过程中若被引导参数加了 nomodeset=1,reboot 后仍会走基础 VESA 模式。查 /proc/cmdline 或 GRUB_CMDLINE_LINUX_DEFAULT 去掉。
判据:.run 与 apt 混装会互相覆盖 /usr/lib/x86_64-linux-gnu/libcuda.so 与内核模块,nvidia-smi 报 Driver/library version mismatch 或 Failed to initialize NVML 是典型形态。三条途径(.run、apt、ubuntu-drivers)互斥:切换前先用 .run --uninstall 或 sudo apt purge '^nvidia-.*' 清干净,再装目标途径的版本。
3.3 Secure Boot 与 DKMS¶
DKMS(Dynamic Kernel Module Support):驱动源码随 apt 安装、在每次内核升级时为新内核重编译内核模块。NVIDIA 闭源驱动在 Ubuntu 上通常通过 nvidia-dkms-<ver> 提供。
Secure Boot 开启时,内核拒绝加载未签名模块。装 NVIDIA 驱动会触发 mokutil --import 流程,让 MOK(Machine Owner Key)注册公钥;重启进 shim 引导,输入安装时设的一次性密码完成注册。流程卡在"重启进 mokmanager"是常见踩点。
mokutil --sb-state # SecureBoot enabled/disabled
mokutil --list-enrolled # 已注册的 MOK 列表
sudo mokutil --reset # 清空注册,重装驱动时用
modinfo nvidia | grep license # Dual MIT/GPL=开源档,NVIDIA=专有档
DKMS 与内核升级的联动可直接查看:dkms status 列出每个模块构建到了哪些内核——apt / ubuntu-drivers 途径在 22.04(HWE 滚动)上的典型形态是同一驱动版本对两条内核线各有一条 installed 记录(如 nvidia/580.178.04 同时存在于 5.15.0-198-generic 与 6.8.0-138-generic),即内核升级时模块已随 DKMS 重建。
开源/专有两种内核模块变体与架构代的对应关系已由 NVIDIA 文档落锤(580.178.04 Release README「Open Linux Kernel Modules」,取用 2026-11):**开源变体支持 Turing 及之后的 GPU(依赖 Turing 引入的 GSP,更早架构不支持);
Blackwell 及之后只由开源变体支持**;两种变体互斥,安装器按检测到的 GPU 自动选档。区分手段文档同时给出:modinfo nvidia | grep license 报 Dual MIT/GPL 即开源档(专有档报 NVIDIA),/proc/driver/nvidia/version 报 UNIX Open Kernel Module 亦为开源档(Blackwell 新架构卡 + 580 系驱动即此形态)。Secure Boot 关闭(mokutil --sb-state 报 disabled)时签名注册环节整体不参与,MOK 流程须在开启后另行确认。
判据:现场排障先看 dmesg | grep -E 'nvidia|Lockdown|module verification failed';出现 "module verification failed" 基本就是 Secure Boot 没配 MOK。生产环境要么在 BIOS 里关掉 Secure Boot、要么走企业级签名流程,不做"每次都点 shim"的运维。
3.4 混合显卡(prime)¶
笔记本或某些上位机会同时有集显(Intel / AMD)与独显(NVIDIA)。Linux 侧的调度机制叫 prime:
xrandr --listproviders # 列出两个 provider
__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia glxinfo | grep vendor
Ubuntu 桌面提供 "NVIDIA ON-DEMAND" 模式(nvidia-prime 包),登录界面右下角选"使用集成图形"或"NVIDIA(On-Demand)"。机器人上位机若必须用独显做 CUDA,给具体进程加环境变量比整机切换更稳。
4. 外接显示、分辨率与 HDMI 欺骗¶
XRandR 是 X11 下的运行时显示配置工具(Wayland 侧对应 wlr-randr / KDE 的 kscreen-doctor):
xrandr --query # 列出所有 output 与模式
xrandr --output HDMI-1 --mode 1920x1080 --right-of eDP-1
xrandr --output HDMI-1 --off
xrandr --newmodeline "2560x1440_60" $(cvt 2560 1440 60 | grep Modeline | cut -d' ' -f3-)
机器人上位机常见场景:没有物理接显示器的机器,Xorg 拒绝启动或渲染到 1024×768。解法两种:
- HDMI 欺骗器(EDU 负载电阻):几块钱一个 dongle,插上让内核认为接了 1080p。判据最直观。
- 虚拟输出 /
xorg.conf:/etc/X11/xorg.conf.d/10-headless.conf手动指定Monitor与Screen的ModeLine,让 Xorg 起一个假 output;配合 xrdp 也能省掉物理接口。
Wayland 侧无头运行更保守——GNOME Wayland session 在没显示器时不一定起得来,走 Xorg 更稳。
判据:无头渲染不需要 X
只出图或只跑仿真时走 EGL 一类无显示通路即可,不必装桌面;需要交互界面才谈 X11/Wayland 会话与显示管理器。
5. 无头运行与远程 GUI¶
机器人上位机经常是"SSH 上去、跑 RViz、把画面带回本地看"。三条可选路径:
5.1 SSH X11Forwarding¶
服务端 /etc/ssh/sshd_config:
X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost yes
/etc/ssh/ssh_config 客户端 ForwardX11 yes;ssh -X 或 -Y(后者的 trust 更宽)连上后 echo $DISPLAY 会得到 localhost:10.0,glxgears 直接画到本地 X。机制、跳板与性能权衡在第 10 章「SSH 全栈」。
判据:X11 转发跑轻 UI 可以,RViz 三维渲染 + 大量交互不推荐——每次 draw call 都过网络;要么本地接显示器、要么走 VNC/RDP。
5.2 无头 GPU 渲染¶
Gazebo / Isaac Sim 之类需要 GPU 但没显示器的场景:
## 用 EGL 无头模式(不需要 X)
__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia \
xvfb-run -a gazebo --verbose my_world.world
xvfb(X Virtual Framebuffer)起一个纯内存 X server,让只支持 GLX 的老工具能跑;现代应用优先 EGL headless。ROS2-note 第 9 章 Gazebo 无头方案与此衔接。
5.3 xrdp:RDP 协议的服务端¶
xrdp 让 Ubuntu 主机变成 RDP 服务器,Windows 自带 mstsc 直接连。装法:
sudo apt install xrdp
sudo systemctl enable --now xrdp
sudo adduser xrdp ssl-cert # 用系统 ssl-cert 组的默认证书
ss -tlnp | grep 3389 # 确认在听
~/.xsession 或 /etc/xrdp/startwm.sh 决定 xrdp 会话起来时跑哪个 WM/DE。GNOME 与 Wayland 会话下 xrdp 表现不佳(GNOME 上游不支持 xrdp 会话复用登录钥匙环、Wayland 无 X 兼容层)——机器人上位机若走 xrdp,建议桌面切 MATE / XFCE 或强制 GNOME on Xorg。
判据与限制:xrdp 与本地 DM 会话互斥,同一 user 不能同时在本地和 xrdp 上有 GUI;不同 user 分别登录各起一 session 是可以的。xrdp 项目 README(取用 2026-11):图形会话经 xorgxrdp 模块实现——服务端侧是 Xorg 栈,支持重连既有会话;README 未给 GNOME / Wayland 会话的兼容承诺。落到部署上:会话要固定为 X11(MATE / XFCE,或 GNOME on Xorg),Wayland 会话没有对应的 xorgxrdp 实现。方案横向选型(RustDesk / NoMachine / Tailscale)在第 10 章。
坑:Wayland 会话下 xrdp 会踢掉本地会话
同一账号既有本地图形会话又用 xrdp 登录时,两者会争用会话;远程桌面方案的选择要与当前显示服务器配套。
6. 桌面环境更换与常见坑¶
6.1 换桌面:装新的、卸旧的¶
以 GNOME 换到 MATE 为例:
sudo apt install mate-desktop-environment
sudo systemctl restart lightdm # 或 gdm3;登录界面选 MATE Windows Session
## 稳定运行一周后再卸 GNOME:
sudo apt remove --purge ubuntu-desktop gnome-shell gdm3
sudo apt autoremove
残留清理:Ubuntu 的 ubuntu-desktop 是一组元包(含 snap firefox、gnome-user-share 等),只 remove gnome-shell 会留下一堆依赖;--purge ubuntu-desktop + autoremove --purge 才干净。DM 与 DE 是两件事——GNOME 与 MATE 都可以跑在 LightDM 上,MATE 与 XFCE 是原生 X11。
6.2 黑屏、循环登录、驱动升级后 X 起不来¶
三个具体现象与最短排查线:
- 黑屏但 tty 可切:
Ctrl+Alt+F3进 tty 登录后看dmesg -T | tail -50与/var/log/Xorg.0.log(grep(EE)),多半是 DRM 初始化失败或nouveau与nvidia抢;sudo apt purge 'nvidia-*' 'libnvidia-*'再重装或切回 nouveau。 - 循环登录:登录 → 一秒钟 → 回登录界面。九成是
~/.Xauthority或~/.config权限错,ls -l ~/.Xauthority若 owner 是 root 就chown $USER:$USER;另一成是磁盘满(df -h ~)导致 session 无法初始化。 - 驱动升级后 X 起不来:
nvidia-dkms没随新内核重建。dkms status看状态;sudo dkms autoinstall触发一次;重启。
判据:先分清是内核态没起(dmesg)还是用户态起不来(Xorg.0.log),再动包管理器。
7. 要点¶
- X11 与 Wayland 是两条协议,会话类型看
$XDG_SESSION_TYPE与loginctl -p Type;Ubuntu 桌面的会话默认不是单一值——GNOME 上游倾向 Wayland,NVIDIA 驱动在装的机器上可落回 Xorg(装驱动的 22.04 + 580.178.04 下会话类型即为x11,桌面版并非永远默认 Wayland);机器人上位机远程与无头场景建议强制 Xorg。 - DM 与 DE 分家:GDM3 / LightDM / SDDM 三选一,装第二个前先
disable;自动登录一行配置,配合物理与磁盘安全措施。 - 驱动安装首选
ubuntu-drivers:.run与 apt 混装互相覆盖;Secure Boot + DKMS 需 MOK 注册,未注册时内核拒载模块;混合显卡用__NV_PRIME_RENDER_OFFLOAD精确到进程。 - 无头 GUI 三条路:X11Forwarding(轻 UI)、xvfb-run(老工具兜底)、xrdp(重 UI);RViz 类三维渲染不吃 X11 转发带宽的例外极少,重 UI 优先本地接屏。
- xrdp 与 GNOME / Wayland 会话兼容性依发行版而定:机器人上位机走 xrdp 建议切 MATE / XFCE 或强制 Xorg;同一 user 本地与 xrdp 会话互斥。
- 排障分内核态与用户态双线:
dmesg看 DRM / Secure Boot 拒载;Xorg.0.log看 X 起不来的具体(EE);黑屏、循环登录、驱动升级后失效各有最短路径,先定位再动包。