系统极客一直在努力
专注操作系统及软件使用技能

Ubuntu 认证设备为什么能开箱即用?从 Modalias 到 OEM 内核

Ubuntu

在 Ubuntu 认证设备上安装好系统之后,你通常会发现:第一次开机,风扇控制就是正常的,键盘功能键也能直接使用,合适的内核也都提前装好了。在这整个过程中,你并没有手动装过驱动,那这些支持是怎么到位的?

这一切看上去似乎是「安装程序」自动做完了一切,但它更多只是负责调度。真正做硬件识别和软件包匹配的,是 Ubuntu 的驱动检测工具、软件包元数据,以及 Canonical 为认证硬件提前准备好的 OEM 支持包。

接下来,我们就顺着这条链路往下拆——从最开始的硬件扫描,到重启后进入正确内核,中间每一步都是谁在做、怎么匹配、为什么能做到自动完成。

对于认证设备,Canonical 通常会提前和硬件厂商一起完成测试、修复兼容性问题,并准备对应的 OEM 支持包。安装程序要做的,就是识别当前设备,然后启用已经准备好的支持方案。

Ubuntu 认证设备为什么能开箱即用

并不是所有机器都能在通用 Ubuntu 安装环境下,直接跑到最好状态。

戴尔、联想、惠普这些大厂的笔记本和服务器,经常会带有一些「需要特殊对待」的组件:可能是特定的内核补丁、专门的固件文件,亦或是 Ubuntu 标准驱动包里没有包含的内容。少了这些支持,就可能会遇到「睡眠-唤醒」异常、风扇转速失控、GPU 性能打折等大大小小的问题。

Ubuntu 的做法是把一套自动检测机制接进安装流程里,由 Subiquity 负责把流程串起来,但真正做硬件识别和软件包匹配的是ubuntu-drivers。

什么是 Subiquity?

  • Subiquity 是 Ubuntu Server 背后的安装程序框架,从 Ubuntu 20.04 LTS 开始投入使用。
  • 从 Ubuntu 23.04 开始,它也成了 Ubuntu Desktop 安装程序的后端,取代了老旧的 Ubiquity(GTK/Qt)界面。

在装服务器时,你看到的是简洁的纯文本界面;到了桌面端,外面多包了一层图形界面马甲。这两种形态在 OEM 和 HWE 硬件检测上,共用了同一套后端逻辑。

Subiquity 安装程序框架
Subiquity 安装程序框架

GA、HWE 与 OEM:3 种内核,3 种分工

在看硬件检测之前,我们必需先理清楚 Ubuntu 的 3 条内核分支。

GA 内核

这是随 Ubuntu LTS 首发时一起发布的默认内核。它稳定、经过充分测试,在 5 年的 LTS 标准支持周期里,会持续收到安全更新。Ubuntu Server 默认使用的就是 GA 内核。对大多数硬件、服务器来说,它已经够用。

HWE 内核

Ubuntu 每 6 个月会发一个过渡版本,比如 25.10、26.10,它们都会带更新的内核。HWE 栈的作用,就是把这些较新的内核回带到当前 LTS 版本上。

比如,你装的是 Ubuntu 26.04 LTS,但某块新出的 Wi-Fi 芯片只有更新内核才支持,这时候就可以通过 HWE 栈拿到后续 Ubuntu 版本里的内核支持。

Ubuntu Desktop 默认会跟着 HWE 栈走。单个 HWE 内核版本通常会维护到下一次 HWE 切换,之后系统会自动滚动到更新的 HWE 内核,所以整条 HWE 轨道在 LTS 生命周期里会持续获得支持。

OEM 内核

最特殊的是 OEM 内核,它由 Canonical 的 HWE Team 和戴尔、联想这些硬件厂商一起维护。

  • 这类内核通常会提前集成一些还没进入当前 Ubuntu GA/HWE 内核的硬件支持补丁,可能来自上游 Linux 的回移植,也可能是 Canonical 和硬件厂商一起维护的修复。
  • 比如新出的英特尔显卡驱动、Realtek 读卡器修复补丁,都可能先出现在 OEM 内核里。你可以把它看成一个过渡区:一些今天先在 OEM 内核落地的补丁,后面往往会逐步进入到 Ubuntu 的通用内核。
内核分支适用对象支持周期默认启用环境
GA所有用户5 年Ubuntu Server
HWE桌面用户,服务器可选开启每个内核约 6 个月滚动更新;最终版 HWE 享受完整 LTS 支持Ubuntu Desktop
OEM主要面向 Ubuntu 认证硬件由 HWE Team 和硬件厂商共同维护,通常短于 GA认证笔记本、服务器

硬件指纹:什么是 Modalias?

要给硬件配上正确的驱动,系统得先知道这块硬件是谁。Linux 内核最早就是用 modalias 来做模块自动加载,Ubuntu 的驱动检测机制也基本沿用了这套技能。

你可以把 modalias 理解成硬件对外广播的一串识别码。Linux 内核会从硬件读取这些信息,放到/sys这个特殊目录里:

$ cat /sys/devices/pci0000:00/0000:00:1b.0/modalias
pci:v00008086d00003B56sv000017AAsd0000215Ebc04sc03i00

这一长串字符本身是有结构的,里面编码了供应商 ID、设备 ID、子系统供应商、子系统设备 ID 和设备类。简单来说,这就是在告诉系统:「我是一块装在 XXX 机器里的 XXX 芯片」。

那些不在 Ubuntu 默认安装集里的驱动包,通常也会在debian/control里上带一个由dh_modaliases生成的XB-Modaliases字段。软件包构建完成后,它会变成元数据里的Modaliases标头,里面是一组支持通配符匹配的字符串,对应一个或多个 modalias。

驱动检测的本质,其实就是一场模式匹配:用你硬件的专属指纹,和软件仓库里预埋的指纹做比对。

OEM 软件包怎么做到精确匹配

Modalias 对 NVIDIA GPU 这种通用驱动效果很好,但 OEM 元软件包要匹配的是整台机器,而不只是某一块芯片,所以还得再往上收一层。

现在常见的做法主要有 2 种:

常见方案工作原理
PCI/SMBus 信息利用 PCI 设备及相关总线信息识别目标平台
DMI 信息利用 BIOS 和主板里记录的设备型号信息识别目标平台

不同厂商的 OEM 软件包,会按具体平台选择 PCI、SMBus 或 DMI 信息来生成专用的 modalias 规则,尽量把匹配范围收窄到目标机型。

幕后功臣:ubuntu-drivers

Subiquity 并没有把检测逻辑写死在自己内部,它调用的是ubuntu-drivers,核心任务也只有一个:扫描硬件,然后从软件仓库里找出能精确匹配的软件包。

核心检测函数在 Python 模块UbuntuDrivers.detect里,它只依赖python-apt库就能运行,不需要 root 权限,也不用走 D-Bus,很适合在安装过程中调用,开销和安全风险都比较低。

# 示例:ubuntu-drivers 如何查询给定 modalias 的软件包
import apt
from UbuntuDrivers import detect

apt_cache = apt.Cache()
packages = detect.packages_for_modalias(
    apt_cache,
    "pci:v000010DEd00002684sv000019DAsd00004675bc03sc00i00"
)

不支持 Modalias 的硬件怎么办?

有些驱动没办法靠 modalias 进行匹配,可能就得去看/proc/asound/cards这类额外信息,才能判断系统是否适配。

在这种情况下,ubuntu-drivers提供了检测插件机制,把精简的 Python 脚本放在/usr/share/ubuntu-drivers-common/detect/目录下,每个插件都会导出一个detect(apt_cache)函数来执行额外检测逻辑,然后再返回匹配到的软件包列表。

检测插件同样不需要 root 权限,整套检测栈从一开始就是按受限环境来设计的。

OEM 元软件包到底做了什么

元软件包(metapackage)本身通常是空的,不直接携带内核文件、二进制固件或者文档。在 OEM 元软件包安装时,主要在做这 3 件事:

  1. 写入新的 APT 源文件:在/etc/apt/sources.list.d/下增加额外的软件源配置,指向 Canonical 的 OEM 软件库,让系统能拿到 Ubuntu 标准仓库之外的特定软件包。
  2. 安装 OEM 签名密钥:它会依赖ubuntu-oem-keyring,让系统信任这个 OEM 软件库。
  3. 拉取真正的硬件支持包:仓库启用后,会继续把硬件需要的内核、固件和驱动装进来。

由 OEM 软件包决定系统装哪个内核

OEM 元软件包还会影响系统最终启动到哪条内核栈上。它的依赖既可能指向专门的 OEM 内核包,也可能指向 GA、HWE 内核,具体取决于这个平台的支持是怎么组织的。

大部分认证硬件最终会跑 OEM 内核。

OEM 元软件包本身不是驱动,更像是一把钥匙。它负责把对应仓库和依赖关系接进系统,真正的内核、固件和驱动来自后面的软件包。

OEM 内核是不是厂商专用的?

不是。虽然名字背上了「OEM 内核」,但它并不是厂商私有的闭源资源。Canonical 会把它公开发布到 Ubuntu 软件仓库里,任何人都可以安装和使用。

这个名字主要说明它的来源和维护方式——由 Canonical 和硬件合作伙伴一起维护,里面的补丁偏向特定硬件,但并不限制使用。

完整流程拆解

Ubuntu 认证设备驱动匹配完整流程
Ubuntu 认证设备驱动匹配完整流程

我们把前面的信息串起来,在一台认证设备上安装 Ubuntu 时,大致流程是这样的:

  1. 安装早期,Subiquity 里的 OEM 控制器会调用ubuntu-drivers扫描系统设备,并从/sys收集各自的 modalias 字符串。
  2. ubuntu-drivers拿着这些 modalias 去和当前 APT 缓存里各个软件包的Modaliases标头做匹配。遇到 OEM 软件包时,还会按它声明的规则检查对应的 PCI、SMBus 或 DMI 信息。
  3. 如果匹配成功,比如命中了某台认证戴尔笔记本对应的 oem-somerville-<codename>-meta,ubuntu-drivers就把这个包名返回给 Subiquity,后者再把它加入安装队列。
  4. 到了软件包安装阶段,由 Subiquity 安装这个 OEM 元软件包。这个包会加上对应的 APT 源、装好密钥依赖,并继续把 OEM 软件库里的相关包拉进来。
  5. 最后系统重启。因为目标内核已经在安装阶段准备好了,机器会直接进入适合当前硬件的那条内核栈,不需要再手动补装驱动。

Ubuntu 安装程序不会在安装时联网检查「这台机器该装什么驱动」。绝大多数匹配规则,早就写进了软件包元数据和 OEM 元软件包里,安装过程只是做本地匹配和自动安装。

检查是否安装了 OEM 包

验证 Ubuntu 是否使用 OEM 驱动和内核
验证 Ubuntu 是否使用 OEM 驱动和内核

系统装好后,你可以自己确认当前跑的是 OEM、HWE 还是 GA 内核:

# 步骤 1: 列出系统上的所有 OEM 元软件包
# 如果命令返回输出,说明属于 OEM 流程。
# 如果命令未返回任何输出,则说明属于 GA 或 HWE 流程。
$ ubuntu-drivers list-oem

# 步骤 2:确认你正在使用的内核版本
# OEM 内核示例:7.0.0-22-oem <- 注意 -oem 后缀
# GA/HWE 示例:7.0.0-22-generic <- 两者都带有 -generic 后缀
$ uname -r

# 步骤 3:区分 GA 和 HWE
# 输出结果会返回是 GA 还是 HWE 内核,以及支持周期。
$ hwe-support-status --verbose
赞(1)
分享到

评论 抢沙发