苏菲的工房

Linux 图形栈:从内核到像素

[方法]

前几天想在云服务器上跑一个需要界面的程序,去查方案,看到两拨说法:一说装个 Xvfb 就行,一说得装桌面环境、像 Arch 那样"系统级"地配。当时就被绕晕了——这两个到底是啥关系?查了一圈,把想明白的东西记在这里。

先把四层摆出来

Linux 的图形系统是分层的,从下往上:

  1. 硬件和内核。显卡驱动、显存、显示器。内核这边管显示的是 DRM/KMS(Direct Rendering Manager + Kernel Mode Setting)。云服务器的情况是:有 GPU(哪怕核显),但没接显示器,这种状态叫 headless。
  2. 显示服务器。这一层是重点。应用不直接碰屏幕,它把绘图指令发给显示服务器,由服务器合成再输出。X11 是 1987 年用到现在的老协议,Wayland 是新替代。而 Xvfb 是 X server 的一个特殊实现:不连显示器,画面画到内存里一块虚拟屏幕上。应用以为有屏幕,其实没有——这就是 headless 跑 GUI 的全部秘密。
  3. 窗口管理器 / 桌面环境。窗口管理器管标题栏、布局、焦点(KWin、Mutter、i3 这些);桌面环境就是窗口管理器加任务栏、文件管理器、设置中心一套(GNOMEKDE PlasmaXFCE)。
  4. 应用。浏览器、LibreOffice,走 X11/Wayland 协议把界面画出来。

让我绕晕的那个点

绕晕我的地方在于:Xvfb 听起来像是个"轻量的小工具",Arch 装桌面听起来像"系统级的大工程",于是我以为它们不是一个层面的东西。

其实不是。Xvfb 就是 X server 本身——和 Arch 上跑的那个 X 是同一个组件的两种形态,一个连物理显示器,一个连内存。两者都是系统级组件(/usr/bin 里躺着)。真正的区别是后面两层装不装:

Arch 完整桌面 服务器 Xvfb 方案
显示服务器 真 X / Wayland Xvfb(虚拟屏)
登录管理器 SDDM/GDM,开机图形登录 没有,SSH 进去自己启动
窗口管理器 可省略(跑单应用不需要)
桌面环境 完整一套 可只跑程序,也可加 XFCE
显示器 需要 不需要,画面走 VNC/RDP 传走

所以说到底这是一个"组件装到哪一档"的连续谱系:最全的是 Arch+KDE 那种完整桌面会话;往下是 Xvfb + XFCE + VNC 的轻量桌面(组件一样,只是把屏幕换成虚拟屏加网络传输);再往下是 Xvfb 跑单个应用(服务器上最常见);最省的就是什么都不装,纯 CLI。区别只在组装方式,不在"系统边界"。

画面怎么传到本地

Xvfb 解决了"没屏幕也能跑",那"跑起来了怎么看"是另一件事,常用的有三种:

我的结论

折腾完发现,这套知识对我的服务器暂时用不上——我的工具链全是 CLI 和 Web(Web 界面直接浏览器访问,零 GUI 依赖)。但它值得记下来,因为 headless 这个词以后还会碰到:不是"没显卡",只是"没屏幕",而屏幕是可以虚拟出来的。

配套的可视化演示(四层图解 + 翻页)是 AI 做的。文中所有概念都能在对应链接里核实。