网站搜索

Ubuntu 如何自动为您的机器安装正确的硬件驱动程序


快速摘要

  • Ubuntu 会从你机器上的每个设备读取硬件“条形码”(一个 modalias 字符串),并将其与可用软件包中预置的模式匹配。如果匹配到,它会安装一个微小的占位软件包,在安装过程中为你的硬件解锁合适的内核和驱动程序,而无需你做任何操作。
  • OEM 元包 本身几乎什么都不做。它的全部工作是放置一个 APT 源文件并引入一个签名密钥。实际的驱动程序和内核来自该文件启用的仓库。它是一个密钥,而不是一个负载。
  • Ubuntu 实际上有三个独立的内核路线:GA(稳定版,随 LTS 发布,提供 5 年支持)、HWE(从中间版本回移植的新内核,大约每 6 个月滚动一次)和 OEM(为特定认证硬件构建)。使用其中一个不意味着你在使用另一个,你可以使用 ubuntu-drivers list-oem 和 hwe-support-status 进行检查。
  • OEM 内核并不属于或锁定在像戴尔、联想或惠普这样的硬件厂商手中。它发布在常规的 Ubuntu 软件库中,由 Canonical 的 HWE 团队构建,厂商提供补丁和需求,而不是控制内核本身。任何人都可以安装和运行它,即使是在未经认证的硬件上(尽管这样做几乎没有好处)。

介绍

你刚刚在一台认证的笔记本电脑上安装了 Ubuntu。第一次启动的几秒钟内,你的风扇控制正常工作,功能键可以响应,而且正确的内核已经在运行。你没有手动安装任何驱动程序。那么刚刚发生了什么?

Ubuntu 安装程序已经识别了您的硬件并悄无声息地处理了一切。本文将详细解释从第一次硬件扫描到最终重启的整个过程。无论您是只是出于好奇的桌面用户,还是需要在自动化部署中控制此行为的系统管理员,这里都有您需要的一切信息。

1. Ubuntu 为你解决的问题

并不是每台机器在通用的 Ubuntu 安装上都能完美运行。像戴尔、联想和惠普这样的硬件制造商经常出厂的笔记本电脑和服务器都配备了需要额外注意的组件:自定义内核调整、固件文件或者不在标准 Ubuntu 软件包集合中的驱动程序。

如果没有合适的软件,你可能会遇到挂起和恢复功能损坏、风扇从不启动,或者 GPU 只能以半速运行的问题。Canonical 的解决方案是在 Ubuntu 安装程序中内置的检测系统,称为 Subiquity,它在设置过程中识别你的硬件,并自动为你的机器安装最佳的内核和驱动程序包。

1.1. 什么是 Subiquity?

Subiquity,也称为“服务器版Ubiquity”,是Ubuntu Server背后的安装框架,自Ubuntu 20.04起就是如此。它还为Ubuntu Core提供首次启动配置。从Ubuntu 23.04开始,Subiquity也成为Ubuntu Desktop安装程序的后台,取代了旧的Ubiquity(GTK/Qt)安装程序。

你可以通过它在服务器安装期间的干净文本界面以及在桌面上的图形界面来识别它。两者在 OEM 和 HWE 检测方面共享相同的后端逻辑。

如果你想知道,这就是 Subiquity(Ubuntu 安装程序)的样子:

Subiquity(面向服务器的通用性)安装框架

2. GA、HWE 和 OEM:三个内核,三个任务

在深入了解检测是如何工作的之前,你需要了解 Ubuntu 提供的三种内核版本。许多指南跳过了这个解释,这会让后面的内容变得令人困惑。

2.1. GA 内核(一般可用性)

这是Ubuntu LTS版本在发布当天随附的内核。它稳定、经过充分测试,并在标准的5年LTS支持期内接收安全更新。Ubuntu服务器默认使用GA内核。对于大多数使用较旧或常见硬件的生产服务器来说,GA内核就是你所需要的。

当然,您可以通过启用 Ubuntu Pro 将支持期限延长至 15 年。更多详情请参见下面的链接:

  • 如何免费启用 Ubuntu Pro 以获取 10 年的安全更新

2.2. HWE 内核(硬件支持)

Ubuntu 每六个月发布一个新的临时版本(例如,26.10、27.04)。每个版本都附带更新的内核。

HWE 堆栈将这些更新的内核回移植到 LTS 版本上。因此,如果你使用的是 Ubuntu 26.04 LTS,但需要来自 Ubuntu 26.10 的内核以支持全新的 Wi-Fi 芯片,HWE 堆栈就可以提供它。

Ubuntu 桌面默认跟踪 HWE 堆栈。每个非最终 HWE 内核通常会在系统更新到下一个内核之前获得大约 6 个月的安全更新。

例外是每个 LTS 周期中的最终 HWE 内核:该内核将成为下一个 LTS 版本的 GA 内核,并从那时起获得完整的 5 年 LTS 支持周期。

2.3. OEM 内核

这是三者中最具体的。Canonical 的硬件支持团队与戴尔和联想等硬件供应商密切合作,构建和维护 OEM 内核。

OEM 内核通常包括尚未被上游 Linux 内核或通用 Ubuntu 内核接受的设备驱动程序和补丁,例如新的 Intel 显卡驱动程序或 Realtek 读卡器修复。

可以把它看作一个暂存区:今天进入OEM内核的补丁往往会在未来的版本中升级到通用的Ubuntu内核。

内核谁得到它支持窗口默认开启
GA每个人5年Ubuntu 服务器
硬件增强桌面用户,在服务器上选择加入每个内核约 6 个月滚动更新;最终 HWE=完整 LTS 生命周期Ubuntu 桌面
原始设备制造商仅限认证硬件由 Canonical 的 HWE 团队维护(通常比 GA 短)认证笔记本电脑和服务器

要点: 如果你的机器上执行 ubuntu-drivers list-oem 有结果,那么你处于 OEM 路径,而不是 HWE 路径。两者是分开的。运行一个并不意味着你在运行另一个。

3. 硬件指纹:什么是 Modalias

为了将您的硬件与正确的驱动程序包匹配,系统需要一种方式来识别您机器中的每一个设备。Linux 通过一种称为 modalias 的方法来解决这个问题。

可以将其看作每个硬件设备广播的条形码。Linux 内核从硬件读取这些条形码,并将它们存储在一个名为 /sys 的特殊文件夹中。你可以自己读取它们:

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

那长串字符遵循一个清晰的结构。它编码了供应商ID、设备ID、子系统供应商、子系统设备ID以及设备类别。用通俗的话来说,它向系统传达的信息类似于:“这是一个安装在联想笔记本电脑中的英特尔音频芯片。”

现在,不属于默认 Ubuntu 安装的驱动程序包在它们的 debian/control 文件中包含一个名为 XB-Modaliases 的字段,该字段由 dh_modaliases 工具生成。一旦软件包构建完成,这将成为软件包元数据中的一个 Modaliases 头,包含一个通配符模式列表(可以将它们视为通配符),这些模式匹配一个或多个 modalias 字符串。

所以检测过程是快速的模式匹配:你的硬件指纹与可用软件包中内置的指纹进行对比。

原始设备制造商套餐如何以不同方式处理匹配

模态匹配对于像 Nvidia GPU 驱动包这样的通用驱动效果很好。但 OEM 元包需要更加精确。你想要匹配整个笔记本型号,而不仅仅是其中的一个芯片。因此存在两种方法:

制造商检测方法运作方式
戴尔 & 惠普PCI/SMBus通过系统管理总线按 PCI 供应商和子系统 ID 匹配。这可以避免由于附加卡恰好与平台硬件共享子系统 ID 而产生的错误匹配。
联想DMI 字符串与嵌入系统固件中的DMI字符串匹配,具体包括BIOS供应商名称、BIOS版本ID以及主板报告的产品名称。

两种方法最终都会生成一个 modalias 字符串。戴尔和惠普的软件包使用类似 pci:...bc0Csc05... 的模式(针对 SMBus 类),而联想的软件包使用类似 dmi:*bvnLENOVO:bvr...:pvr...* 的模式。无论哪种方式,底层的匹配引擎的工作原理都是相同的。

4. 魔法背后的工具:ubuntu-drivers

Subiquity 本身并不构建此检测逻辑。相反,它会调用一个名为 ubuntu-drivers 的独立工具,该工具来自 ubuntu-drivers-common 软件包。这个工具有一个主要任务:查看你的硬件并找到适合它的包。

核心检测功能位于 UbuntuDrivers.detect Python 模块中。重要的是,它仅需要 python-apt 库即可运行。它不需要 root 权限或 D-Bus 调用,这使得在安装过程中运行既快速又安全。

# Example: how ubuntu-drivers queries packages for a given modalias
import apt
from UbuntuDrivers import detect
apt_cache = apt.Cache()
packages = detect.packages_for_modalias(
    apt_cache,
    "pci:v000010DEd00002684sv000019DAsd00004675bc03sc00i00"
)
# Returns matching driver packages, e.g. nvidia-driver-550

不使用 Modaliases 的硬件怎么办?

有些驱动程序根本无法使用 modalias 匹配。例如,调制解调器驱动程序可能需要检查 /proc/asound/cards 以确定它是否适用于您的系统。

对于这些特殊情况,ubuntu-drivers 支持 检测插件:小型的 Python 脚本,存放在 /usr/share/ubuntu-drivers-common/detect/。每个插件导出一个单独的 detect(apt_cache) 函数,该函数可以运行任何自定义逻辑,然后返回匹配软件包的列表。

注意: 检测插件也不能依赖于 root 权限。Canonical 设计了整个检测堆栈,使其能够安全地在受限环境中运行,例如在安装过程中 Subiquity snap 内部。

5. OEM 元包实际的功能是什么

“元包”这个词听起来可能令人害怕,但这个概念很简单。OEM 元包本身几乎是空的。它不包含内核文件、固件模块或文档。相反,当你安装它时,它会做三件特定的事情:

第1步:投放新的APT源文件

它会在 /etc/apt/sources.list.d/ 中安装一个 .list 文件,该文件指向 Canonical 的 OEM 存档。这可解锁访问不属于标准 Ubuntu 仓库的包。

第2步:安装OEM签名密钥

它还依赖于 ubuntu-oem-keyring 软件包,因此您的系统会信任来自该 OEM 存档的软件包。如果没有该密钥,APT 会将这些软件包视为不受信任并拒绝安装。

第3步:引入真实硬件支持

从新启用的 OEM 档案中,它会提取硬件所需的实际内核、固件和驱动程序包。例如,一个以 oem-somerville-<codename>-meta 命名的包(Canonical 和戴尔内部用于其 OEM 项目的命名方案,其中 <codename> 是内部设备代号,而不是零售型号)会提取特定认证 Dell 平台所需的所有内容。

OEM 包拉取的内核是哪一个

OEM 元软件包也可以影响您的系统启动的内核。在实际操作中,OEM 元软件包的依赖项可以指向 OEM 特定的内核包,也可以指向标准的通用/HWE 内核,这取决于特定平台的支持是如何构建的。大多数认证硬件最终会使用 OEM 特定的内核,因为平台特定的补丁位于那里。

注意:OEM 元包不是驱动程序,它是一个可以解锁整个硬件支持档案的密钥,然后将安装交给该档案中的软件包处理。

OEM 内核是否锁定给特定供应商?

不。尽管名字如此,OEM 内核并不是仅供厂商使用的私人资源。Canonical 会将它发布在 Ubuntu 存档中,任何人都可以在他们的设备上安装和使用它。

它的名字仅仅来源于这样的事实:Canonical 与硬件合作伙伴紧密合作构建它。里面的补丁针对特定硬件,但没有什么阻止你在任何兼容的机器上运行它。

6. Ubuntu 26.04 有哪些变化

在 Ubuntu 26.04 之前,OEM 和 HWE 元包的自动检测默认是一个面向桌面的功能。

如果你在认证硬件上安装了 Ubuntu Server,安装程序的默认行为不会自动安装匹配的 OEM 或 HWE 元软件包。你必须在事后自己添加,这一步在仓促的部署中很容易被忽略。

Subiquity 26.04 发布说明 描述了这里的一个变化:从 Ubuntu 26.04 服务器 ISO 开始,如果安装程序找到与您的硬件匹配的 OEM 或 HWE 元软件包,它也会在服务器安装过程中自动安装,从而使服务器更接近长期以来的桌面行为。

如果你编写自动安装配置,有一个值得了解的细微差别。截至本文撰写时,Subiquity 自动安装参考文档仍然描述 oem.install 键的 auto 默认值为在“Ubuntu 桌面版启用 OEM 元包安装,但在 Ubuntu 服务器版不启用。”

换句话说,26.04 版本说明中描述的更改似乎存在于服务器安装镜像默认执行的层面,而不是作为对 oem.install: auto 模式默认值本身的文档化更改。

如果您正在构建自动化服务器部署,并希望在有可用 OEM 元包时确保其被安装,最安全的方法仍然是在您的自动安装配置中明确设置 oem: install: true。此外,在依赖默认行为之前,请检查您特定版本的当前文档。

这对于服务器硬件尤其重要。Canonical 认证了许多来自主要供应商的机架服务器、工作站和高密度计算节点。如果没有 OEM 元包,你可能会错过固件更新、电源管理调优,或对硬件管理接口(如 IPMI 或 Redfish)的支持。

引擎盖下:

oem: install 自动安装选项接受三个值:true、false 和 auto。文档中记录的默认值是 auto。

无论在你安装的版本中默认行为最终如何,键名和三个可接受的值(true/false/auto)都是稳定且有文档说明的,因此显式设置 oem: install: true 或 oem: install: false 是获得可预测结果的可靠方法。

7. 全流程,逐步说明

现在让我们把所有内容放在一起。这就是在支持的机器上安装 Ubuntu 时,从安装程序启动的那一刻到你重启的那一刻,究竟会发生什么。

第1步 - Subiquity 调用 ubuntu-drivers

在安装初期,Subiquity 内部的 OEM 控制器会调用 ubuntu-drivers list-oem。该命令扫描系统上的每个设备,并从 /sys 收集其 modalias 字符串。

第2步 - ubuntu-drivers 搜索 APT 缓存

接下来,它将您的硬件的 modalias 字符串与安装程序能看到的每个包中的 Modaliases 头进行比较。对于 OEM 包,它还会检查联想硬件的 DMI 字符串以及戴尔和惠普的 PCI 子系统 ID。

第3步 - 匹配返回一个包名

如果存在匹配的 OEM 软件包,例如针对认证的戴尔笔记本电脑的 oem-somerville-<codename>-meta 软件包,那么 ubuntu-drivers 会返回它。Subiquity 会将该软件包排队以便与基础系统一起安装。

第4步 - 元包已安装

在软件包安装阶段,Subiquity 安装 OEM 元软件包。这会放置 APT 源文件,拉取密钥环依赖项,并触发从 OEM 存档中拉取内容。

步骤 5 - 你重启进入正确的内核 最后,系统重新启动。因为在安装过程中已安装了适当的内核包,你将直接启动到适合你硬件的内核。无需手动操作,也无需后续命令。

注意,内核冲突:如果你在自动安装配置中使用 kernel: 键手动指定内核,可能会遇到冲突。OEM 元包可能需要其自己的内核包,这可能与你明确选择的内核发生冲突。如果在安装后启用 FIPS 或实时内核,也可能出现类似冲突,因为 OEM 内核的 GRUB 配置条目可能在启动顺序中优先。为避免此问题,可以删除 kernel: 键,或者在自动安装配置中设置 oem: install: false。

8. 如何检查你的 Ubuntu Linux 机器是否有 OEM 软件包

安装完成后,您可以验证您的机器是运行 OEM 内核还是跟踪 HWE 堆栈。这里有一个实用的两步检查方法:

# Step 1: List any OEM metapackages on your system
$ ubuntu-drivers list-oem
# If this returns output, you are on the OEM track.
# If it returns nothing, your machine is on the GA or HWE track instead.
# Step 2: Confirm which kernel flavour you are running
$ uname -r
# OEM kernel example:  7.0.0-22-oem    <- note the -oem suffix
# GA / HWE example:    7.0.0-22-generic  <- both show -generic
# Step 3: Distinguish GA from HWE (both report -generic in uname -r)
$ hwe-support-status --verbose
# Output tells you whether the running kernel is a GA or HWE kernel
# and whether it is still within its support window.
# Alternative: check which HWE metapackage is installed
$ dpkg -l 'linux-generic-hwe-*' | grep ^ii
# A result here confirms you are on the HWE stack.
# No result means you are on the GA kernel.

OEM 内核在其版本字符串中显示 -oem,这使得它很容易被识别。

HWE 和 GA 内核在 uname -r 中都显示 -generic,这意味着你仅凭版本字符串无法区分它们。

因此,区分它们的可靠方法是运行 hwe-support-status --verbose,该命令会报告正在运行的内核属于哪个分支以及是否仍受支持。

如果 ubuntu-drivers list-oem 返回非空结果,则该机器使用的是 OEM 节奏,而不是 HWE 路线。

提示:Canonical 建议不要在认证硬件上手动切换内核版本。从 OEM 内核切换到 GA 内核可能会导致性能、硬件支持和认证功能的回退。

9. 如何控制这种行为

大多数情况下,你希望安装程序自动处理所有事务。但有时,例如在受合规性限制的企业环境中,你需要固定特定的内核,就需要关闭此功能。你可以在自动安装配置中通过一个键来实现这一点。

禁用 OEM 安装

# autoinstall.yaml
autoinstall:
  version: 1
  oem:
    install: false   # skip OEM metapackage installation entirely

强制 OEM 安装

如果你想确保当有一个OEM元包与您的硬件匹配时它被安装,不管平台当前的默认行为如何,请明确设置install: true。

# autoinstall.yaml
autoinstall:
  version: 1
  oem:
    install: true   # explicitly request OEM metapackage installation if one is found

保持自动(默认)

如果您根本不包含 oem: 键,安装程序将使用 auto。如文档所述,当在 Ubuntu 桌面上找到 OEM 元软件包时,auto 的目的是安装该 OEM 元软件包。

在 Ubuntu 26.04 发布期间,不同的 Canonical 来源对 auto 下的服务器行为有不同的描述,因此如果你关心可预测的服务器行为,请明确设置 install: true 或 install: false,而不是依赖 auto。

# This is what "auto" looks like explicitly:
autoinstall:
  version: 1
  oem:
    install: auto   # default, documented as Desktop-focused

安装后删除 OEM 设置

安装后改变主意了吗?您可以随时删除 OEM 元包并禁用其 APT 仓库。software-properties 图形界面和 ubuntu-drivers 命令行都支持此操作。

移除元软件包不会破坏正在运行的系统,它只是停止从 OEM 存档获取更新。

# List installed OEM packages
$ ubuntu-drivers list-oem
# Remove a specific OEM metapackage
$ sudo apt remove oem-somerville-tentacool-meta
# Disable the OEM repository via the GUI
$ software-properties-gtk

10. 需要记住的关键事项

  • Ubuntu 提供三种内核版本:GA(稳定,5 年)、HWE(较新,每个内核大约每 6 个月更新一次,最后一个继承完整的 LTS 支持)、以及 OEM(认证硬件,由 Canonical 的 HWE 团队维护)。它们是独立的;使用一种并不意味着你使用了另一种。
  • 你机器上的每个设备都会将一个 modalias 字符串导出到 /sys。这个字符串是使检测成为可能的指纹。
  • ubuntu-drivers 执行实际的匹配。它将你的硬件指纹与可用软件包中的 Modaliases 头进行比较。
  • OEM 元软件包是一个最小的存根。它真正的作用是启用 APT 仓库,并让其中的包来承担主要工作。
  • 根据 Subiquity 的发布说明,Ubuntu 26.04 在某种程度上为服务器安装引入了 OEM 和 HWE 自动检测,尽管自动安装参考中记录的 oem.install: auto 默认值仍然描述了以桌面为中心的行为。如果你需要在服务器上保证行为,应明确设置 oem: install: true 或 false。
  • 随时运行 ubuntu-drivers list-oem 来检查你的机器是否在 OEM 轨道上。
  • 在你的自动安装配置中使用 oem: install: true | false | auto 来控制一切。

11. 常见问题 (FAQ)

问:HWE 内核和 OEM 内核有什么区别?

A:HWE 内核将来自最新 Ubuntu 临时版本的较新上游 Linux 内核回移植到您的 LTS 基础版上。它面向广泛的现代硬件,每个非最终的 HWE 内核通常会获得大约 6 个月的支持,然后系统会升级到下一个内核。每个 LTS 周期中的最终 HWE 内核是特殊的:它会成为下一个 LTS 版本的 GA 内核,并获得完整的 5 年 LTS 支持期。

而 OEM 内核则针对特定的一组认证硬件平台。Canonical 与 Dell 和 Lenovo 等厂商合作构建它,通常包含尚未进入主线内核的补丁。如果 ubuntu-drivers list-oem 在您的机器上有返回结果,那么您处于 OEM 路线,而不是 HWE 路线。它们是独立的。

问:Ubuntu会在每台机器上自动安装驱动程序吗?

A: 不会。自动检测只有在安装程序在 APT 缓存中找到匹配的 OEM 或驱动程序元包时才会触发。

未出现在 Canonical 硬件认证列表上的机器将不会匹配任何此类软件包,安装程序将直接继续而不安装任何软件包。

对于这些机器,标准的 Ubuntu 驱动程序通过正常的软件包系统处理一切。

问:我可以在不重新安装 Ubuntu 的情况下手动安装 OEM 内核吗?

A: 是的,总体来说是这样的。OEM 内核包会发布在 Ubuntu 软件仓库中,不会被厂商限制或者需要特别安装。

具体的包名和版本后缀取决于发布版本和平台(linux-oem-<release> 系列包是一般模式),所以请在你的系统上使用 apt search linux-oem 来查找适合你 Ubuntu 版本的正确包名。

也就是说,OEM 内核在 Canonical 认证的硬件上最有用。在未认证硬件上运行它并不会带来额外好处,还可能引发意外行为。

问:OEM 内核会永久取代 HWE 内核吗?

A:不。OEM 内核是一个暂存区。Canonical 会在未来的版本中将其补丁合并回通用的 Ubuntu 内核。因此,你的 OEM 内核今天具备的功能最终会出现在主线通用内核或 HWE 内核中。到那时,你的机器就不再需要 OEM 版本也能获得完整的硬件支持。

问:如果我同时使用 FIPS 或实时内核,这会出问题吗?

A: 可能。OEM 内核的 GRUB 配置项可能在启动顺序中优先。如果你之后启用了 FIPS 或实时内核,系统可能会继续启动到 OEM 内核。

如果你运行的是合规性敏感的环境,请在安装前在自动安装配置中设置 oem: install: false,而不是事后尝试解决冲突。

问:我可以在购买前检查我的硬件是否经过认证吗?

A: 是的。Canonical 在 ubuntu.com/certified 上维护一个公共硬件认证数据库。

您可以按供应商、型号和 Ubuntu 版本进行搜索,以查看某台机器是否配有 OEM 元包,以及它获得认证的是哪个 Ubuntu 版本。

12. 总结

Subiquity 驱动的 OEM 和 HWE 检测系统是 Linux “开箱即用”的一个很好的例子。

在底层,这个过程很简单:快速的 APT 缓存扫描、modalias 模式匹配,以及一个解锁整个硬件支持档案的存根包。这没有什么魔法,只是设计良好的工具一起协同工作。

下次当 Ubuntu 在你的认证硬件上安装后完美启动时,你将确切地知道幕后发生了什么:条形码扫描、软件包查找,以及一个启动一切的小型存根软件包。

资源:

  • Subiquity,26.04 发行说明
  • Ubuntu-drivers-common 自述文件
  • Canonical/ubuntu-mir,OEM MIR 异常
  • Subiquity 自动安装配置参考,OEM 和驱动程序键
  • Ubuntu 内核生命周期,ubuntu.com
  • HWE 内核,官方内核文档
  • OEM 内核,Canonical 内核文档