CONFIG_EFI_STUB 进行构建。systemd-boot 支持两种配置:
有关更多详细信息,请参阅 systemd-boot。 注意 要使用启用了安全启动的设备,必须进行签名。
- Type1:Type1 配置使用引导加载程序规范(BLS)描述文件。您可以在 EFI 上的
/loader/entries/目录中找到这些文件。- Type2:Type2 配置使用统一内核镜像(UKI)。这些镜像将内核、initrd 和内核命令行组合到单个 EFI 可执行文件中。Type2 提供更好的安全性,因为 UKI 包含设备启动所需的所有信息。对 UKI 镜像进行签名可保护其中包含的所有实体。如果启用了 UEFI 安全启动,系统仅加载已签名的镜像,因此签名成为必需项。
UKI
UKI 是将 UEFI 启动存根程序、Qualcomm Linux 内核镜像、initrd 和其他资源组合到单个 UEFI 可移植可执行(PE)文件中的产物。UEFI 启动存根在 UEFI PE 二进制文件内部查找用于内核调用的各种资源。这允许将各种资源组合到单个 UKI 镜像中,然后可以使用 sbsign 对其进行签名。Qualcomm Linux 使用 sbsign 对 PE 文件进行签名,而 DTB 等非 PE 文件则使用 OpenSSL 进行签名。 有关 UKI 的更多详细信息,请参阅统一内核镜像。下表显示了uki.efi 的内容:
镜像配方
meta-qcom/recipes-kernel/images 包含以下配方:
esp-qcom-image.bb生成一个 VFAT 镜像efi.bin,其中包含uki.efi和systemd-boot。
meta-qcom/classes-recipe/image_types_qcom.bbclass 类会调用 esp-qcom-image。
EFI 镜像
EFI 镜像efi.bin 是存储在闪存 EFI 分区中的 VFAT 文件系统镜像。此 VFAT 文件系统包含 UEFI 加载并将执行控制权移交给 systemd-boot 所需的镜像。为了将执行控制权移交给 systemd-boot 管理器,UEFI 会挂载 efi.bin,加载 bootaa64.efi 并执行它。systemd-boot 管理器解析 loader.conf,加载内核镜像,并将控制权移交给它。
有关 EFI 结构的更多信息,请参阅 EFI 系统分区。
以下是来自 Qualcomm Linux 的 efi.bin 示例结构。它在 /ostree/poky-<sha256-sum> 目录下包含 systemd-boot 的 bootaa64.efi 和 Qualcomm Linux 内核 vmlinuz-<version>。

图:具有 OSTree 支持生成的 efi.bin 文件
签名
安全启动是 UEFI 标准中的一项功能,但在 Qualcomm Linux 中默认未启用。启用后,安全启动通过维护一份在设备启动时运行且经过成功身份验证的二进制文件的加密签名列表,为预启动过程增加了一层保护。这可确保设备的启动固件和 Linux OS 启动组件(例如启动管理器、内核和 initramfs)未被篡改。 UEFI 安全启动使用数字签名来验证其加载的二进制代码的真实性和完整性。UEFI 安全变量存储所有密钥。实现 UEFI 安全启动涉及使用平台密钥(PK)、密钥交换密钥(KEK)、数据库(DB)和禁用签名数据库(DBX)。 使用安全启动需要 PK、KEK 和 DB 密钥。虽然允许有多个 KEK、DB 和 DBX,但只允许有一个 PK。 启用 UEFI 安全启动需要在系统中注册 PK。Qualcomm 建议在安全启动启用过程的最后一步配置 PK。有关 Qualcomm 如何实现 UEFI 安全启动功能的更多信息,请参阅安全启动。主机工具 signing_tool.py 用于对 Qualcomm Linux 构建生成的 Linux OS 镜像进行签名
启用 UEFI 安全启动需要对 EFI 和 DTB 镜像进行签名。使用 signing_tool.py 主机签名工具可简化此过程。这个命令行 Python 脚本在 Linux 主机(Ubuntu 20.04 或更高版本)上运行。它通过两个独立的操作自动完成 EFI 和 DTB 镜像的签名。
主机签名工具可在 GitHub 上下载。
主机签名工具在安装了 Python3 的 Linux 机器上运行。它可以在一次操作中对 EFI 镜像或 DTB 镜像进行签名。要同时对 EFI 和 DTB 镜像进行签名,必须使用不同的输入调用该工具两次。

图:安装了 OpenSSL 和 sbsign 的 Linux 机器
先决条件
要运行此工具,请在 Linux 主机上安装以下内容:- OpenSSL、sbsign 和 mtools 实用工具
- Python3,包括
pip包管理器 - 该工具使用的
subprocess、shlex、socket、glob和shutil模块是 Python3 标准库的一部分,无需单独安装。
配置主机签名工具
在开始操作之前,您必须配置主机签名工具。 主机工具需要在config.ini 配置文件中提供必要的信息。该工具读取此文件并据此对镜像进行签名。以下代码片段显示了配置文件中的变量:
config.ini 文件
要使用
config.ini 文件配置主机签名工具,请执行以下操作:
- 设置
operation变量以指定必须执行的操作。选项为sign_image。 - 如果选择
operation == sign_image,请通过设置image_type变量指定要签名的镜像。选项为efi或dtb。 - 使用
file_path变量指明未签名的 EFI 和 DTB 镜像、密钥和证书的位置。- 如果在配置文件中选择
local,请手动将 EFI 和 DTB 镜像、密钥和证书文件复制到本地工作目录:- 在与脚本相同的路径下创建
unsigned_binaries目录,然后将efi.bin和dtb.bin镜像复制到该目录中。 - 在与脚本相同的路径下创建
keys目录,然后将db.auth、db.crt、db.key、KEK.auth和PK.auth文件复制到该目录中。
- 在与脚本相同的路径下创建
- 如果希望脚本自动从同一网络中的远程 Linux 机器复制所需文件,请在配置文件中选择
remote。在配置文件中,为以下变量提供信息:local_machine_private_key_path(必填)[efi_config]部分(如果operation为sign_image且image_type为efi)[keys_config]部分(如果operation为sign_image)[dtb_config]部分(如果operation为sign_image且image_type为dtb) 注意 该脚本支持在同一网络内通过 SCP 从另一台 Linux 机器进行复制。
- 如果在配置文件中选择
- 当配置文件中的
image_type设置为 efi 时,请更新loader_conf_timeout变量。 - 如果遗漏了任何配置信息,脚本运行时会通过命令行提示您输入缺失的详细信息。
运行主机签名工具
- 完成代码构建过程并获得未签名的
efi.bin和dtb.bin镜像后,运行主机签名工具。 - 将主机签名工具文件(
signing_tool.py和config.ini)存储在一台 Linux 机器上。确保这两个文件位于同一工作目录中。 - 按照配置说明设置主机签名工具。
- 运行以下命令从命令行启动主机工具:
$python3 signing_tool.py。主机签名工具会在屏幕上显示您的选择和操作命令。它还会在命令行中显示错误。工具完成其过程后,会在同一工作目录中创建一个名为signed_binaries的目录。已签名的efi.bin或dtb.bin镜像存储在该目录中。签名后,该工具会删除其他用户创建的目录。 - 请执行此过程两次,一次针对
efi.bin,一次针对dtb.bin。在每次签名操作之后、开始新操作之前,请删除signed_binaries目录。
主机签名工具工作流
下图显示了主机签名工具的工作流:
图:主机签名工具工作流
-
主机工具需要
efi.bin和dtb.bin的路径(绝对路径或网络路径)。- 具有 OSTree 支持的
efi.bin包含vmlinuz-x.y.z(Qualcomm Linux 内核镜像)和bootaa64.efi(引导加载程序镜像)。 dtb.bin包含qclinux_fit.img。
- 具有 OSTree 支持的
-
主机工具需要
certificate和key的路径(绝对路径或网络路径)来对镜像进行签名。 -
主机工具将
efi.bin和dtb.bin挂载到 FAT 分区上,这提供了以下目录结构并遵循各自独立的签名流程:efi.bin的目录结构:图:efi.bin 具有 OSTree 支持的
图:efi.bin
efi.bin的目录结构:图:具有 OSTree 支持的 efi.bin
图:具有 OSTree 支持的 efi.bin
dtb.bin的目录结构:
图:dtb.bin
-
对镜像签名后,主机工具会将 .auth 文件复制到
efi.bin和dtb.bin的/loader/keys/authkeys目录中。 -
主机工具在
systemd-boot加载程序配置中配置等待时间。此等待时间会暂停内核加载,允许您查看并选择systemd-boot菜单选项。loader.conf文件必须存在于更新后的efi.bin文件中。注意dtb.bin文件不遵循此签名过程。- 主机工具配置
/loader/loader.conf。 loader.conf的语法为timeout x,其中 x = 超时时间(秒)。
- 主机工具配置
-
镜像签名后,主机工具会从 FAT 分区卸载
efi.bin/dtb.bin。将已签名的efi.bin和dtb.bin存储在主机上与主机工具类似的路径下的signed_binaries目录中。 -
以下是已签名的
efi.bin和dtb.bin的目录结构:
图:efi.bin 和 dtb.bin 文件的目录结构
efi.bin 签名流程
- 主机工具使用
sbsign实用工具分别对uki.efi或 vmlinuz.x.y.z 以及bootaa64.efi镜像进行签名。 sbsign的签名过程需要certificate和key。验证以下语法,其中dsk1.key为密钥,dsk1.crt为证书,输出文件名与输入文件相同:示例:
dtb.bin 签名流程
- 主机工具需要
dtb.bin文件的路径。 - 主机工具需要
key和certificate的路径(绝对路径或网络路径)来对镜像进行签名。 - UEFI 安全启动需要 PE 格式的文件进行验证。诸如
dtb之类的非 PE 文件无法使用sbsign签名,因为此签名工具需要 PE 格式的文件作为输入。 - 主机工具使用
openssl实用工具对dtb文件进行签名。验证以下语法,其中dsk1.key为密钥,dsk1.crt为证书:示例:此命令将 DTB 文件的签名添加到一个单独的文件(foo.sig)中,而不会修改原始文件(foo.img)。因此,主机工具必须同时保留这两个文件,其中*.sig文件在 UEFI 安全启动验证期间使用。
多 DTB 支持
Qualcomm 支持基于同一硬件 SoC 的多个 Qualcomm 开发套件。例如,QCS6490 开发套件变体包括 RB3 Gen 2 Core 开发套件和 RB3 Gen 2 Vision 开发套件。 每个 Qualcomm 开发套件变体在内核中都有自己的 DTB。在启动期间,UEFI 会根据特定的 Qualcomm 开发套件变体选择适当的 DTB。为此,请按如下方式使用多 DTB 扁平镜像树(FIT)镜像:生成多 DTB FIT 镜像
Qualcomm Linux 支持为单个硬件 SoC 需要多个 DTB 的平台生成基于 FIT 的多 DTB 镜像。这允许 UEFI 在启动时根据检测到的硬件变体选择适当的 DTB。 对于支持 FIT 镜像的平台,多个 DTB 通过机器配置文件中的KERNEL_DEVICETREE 变量列出。例如,meta-qcom/conf/machine/rb3gen2-core-kit.conf 中的以下代码片段为 RB3 Gen 2 Core 开发套件定义了两个 DTB:
- 添加 DTB compatible 字符串:FIT 镜像中包含的每个 DTB 都必须有一个关联的 compatible 字符串。UEFI 使用这些 compatible 字符串在启动时选择正确的 DTB。
- compatible 字符串在
meta-qcom/conf/machine/include/fit-dtb-compatible.inc中定义。- 这些值必须通过参考以下位置提供的 DTB 元数据来推导:https://github.com/qualcomm-linux/qcom-dtb-metadata 对于 RB3 Gen 2 Core Kit 示例,请添加以下条目:
- 启用多 DTB 打包:要将生成的 FIT 镜像打包为 VFAT 镜像(
dtb.bin),请在meta-qcom/classes-recipe/image_types_qcom.bbclass中设置以下变量:当此变量设置为 multi-dtb 时,构建系统会将包含KERNEL_DEVICETREE中列出的所有 DTB 的组合 FIT 镜像打包到dtb.bin中。
不支持 FIT 镜像的开发套件
某些平台不支持基于 FIT 的 DTB 选择。这包括某些 ride 开发套件,例如:qcs9100-ride-sxqcs8300-ride-sx
dtb.bin 中。例如,meta-qcom/conf/machine/qcs9100-ride-sx.conf 中的以下代码片段列出了多个 DTB:
QCOM_DTB_DEFAULT 变量:
qcs9100-ride-r3.dtb 会被打包到 VFAT 镜像(dtb.bin)中并在启动期间使用。
DTB 分区
- 生成的名为
dtb.bin的 VFAT 镜像包含组合的 DTB 镜像。Qualcomm 开发套件上有一个名为dtb的专用分区。请将dtb.bin烧录到此分区。 - UEFI 解析
dtb分区中存在的组合 DTB,并为硬件选择匹配的 DTB。
后续步骤
- 有关 UEFI 安全启动实现的更多信息,请参阅安全启动。
- 有关 UEFI 变量管理,请参阅使用 efivar 工具管理 UEFI 环境变量。
- 有关使用 capsule 的 OTA 固件更新,请参阅使用 capsule 和 OSTree 机制更新 Qualcomm Linux 上的固件和操作系统。

