跳转至

第 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[("显卡硬件")]

关键包:

  • libgl1 libglx libegl1: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);黑屏、循环登录、驱动升级后失效各有最短路径,先定位再动包。

参考文献与延伸阅读

  • NVIDIA. 数据中心驱动文档. 文档
  • Linux Kernel. GPU 驱动文档. 文档
  • Ubuntu. Server 文档. 文档