在 systemd-boot Fedora 上安装 NVIDIA 驱动程序

导入 DB、自动签署及处理 UEFI 的指南

0. 开始之前#

我在 Dell Precision 5570 笔记本电脑上进行安装,注册 db 密钥的步骤可能因你的电脑而异。

这里涉及两个独立的信任操作:

  1. EFI 签署:固件 db 信任 systemd-boot 和你的 UKI。
  2. 内核模块签署:NVIDIA 模块由内核信任的密钥签署。

当直接通过 systemd-boot 启动时,不需要 MOK,前提是模块证书存在于固件 db 中,且 Fedora 将该密钥导入到模块验证接受的 keyring 中。线上的教程主要针对 grub+shim,通常会要求你注册 MOK 密钥。

1. 安装所需软件包#

根据 Fedora 版本启用 RPM Fusion,然后安装:

bash
1sudo dnf install akmods kernel-devel-matched openssl keyutils efitools sbctl

确保匹配的内核开发文件存在:

bash
1KVER=$(uname -r)
2test -x /usr/src/kernels/"$KVER"/scripts/sign-file

2. 创建专用的 akmods 密钥#

如果软件包尚未生成 Fedora akmods 密钥,请手动生成:

bash
1sudo kmodgenca -a

检查路径:

bash
1sudo readlink -e /etc/pki/akmods/private/private_key.priv
2sudo readlink -e /etc/pki/akmods/certs/public_key.der

两个命令都必须返回真实的文件路径。

确认证书:

bash
1sudo openssl x509 \
2  -inform DER \
3  -in /etc/pki/akmods/certs/public_key.der \
4  -noout -subject -issuer -fingerprint -sha256

此输出不应为空。

3. 修复 Akmods 密钥权限#

RPM 构建以非特权用户 akmods 身份执行。Root 可以解析并读取 symlink,但 akmods 无法访问其目标。因此,以下测试在构建中失败:

bash
1[ -e /etc/pki/akmods/private/private_key.priv ]

Shell 短路了签署条件,因此从未检查 public_key.der,也从未调用 /usr/lib/rpm/brp-kmodsign

对解析后的目标以及目录遍历权限进行设置:

bash
 1PRIVATE=$(sudo readlink -e /etc/pki/akmods/private/private_key.priv)
 2PUBLIC=$(sudo readlink -e /etc/pki/akmods/certs/public_key.der)
 3
 4sudo chown root:akmods "$PRIVATE"
 5sudo chmod 640 "$PRIVATE"
 6
 7sudo chown root:akmods "$PUBLIC"
 8sudo chmod 644 "$PUBLIC"
 9
10sudo chown root:akmods /etc/pki/akmods/private
11sudo chmod 750 /etc/pki/akmods/private
12
13sudo chmod 755 /etc/pki/akmods/certs
14sudo restorecon -RFv /etc/pki/akmods

使用执行构建的身份进行测试:

bash
1sudo -u akmods test -r /etc/pki/akmods/private/private_key.priv
2sudo -u akmods test -r /etc/pki/akmods/certs/public_key.der

两个命令都必须返回 0

确认密钥和证书匹配:

bash
1sudo openssl pkey \
2  -in /etc/pki/akmods/private/private_key.priv \
3  -pubout -outform DER | sha256sum
4
5sudo openssl x509 \
6  -inform DER \
7  -in /etc/pki/akmods/certs/public_key.der \
8  -pubkey -noout |
9openssl pkey -pubin -outform DER | sha256sum

两个哈希值必须完全相同。

4. 将 Akmods 证书注册到固件 db#

将 DER 证书转换为 PEM,因为 cert-to-efi-sig-list 需要 PEM 输入:

bash
1sudo openssl x509 \
2  -inform DER \
3  -in /etc/pki/akmods/certs/public_key.der \
4  -outform PEM \
5  -out /boot/efi/EFI/Linux/akmods.pem

创建 ESL:

bash
1OWNER_GUID=$(uuidgen)
2
3sudo cert-to-efi-sig-list \
4  -g "$OWNER_GUID" \
5  /boot/efi/EFI/Linux/akmods.pem \
6  /boot/efi/EFI/Linux/akmods.esl

验证它包含有效的证书:

bash
1sudo sig-list-to-certs \
2  /boot/efi/EFI/Linux/akmods.esl \
3  /tmp/akmods
4
5openssl x509 \
6  -inform DER \
7  -in /tmp/akmods-0.der \
8  -noout -subject -fingerprint -sha256

它必须报告非零字节数,且 SHA-256 指纹与 public_key.der 相同。

由于 Setup Mode 在 sbctl 注册后已禁用,纯 ESL 可能不会被接受。使用 sbctl KEK 创建已验证的附加:

你可以将 /boot/efi/EFI/Linux/ 设置为任何你想要的位置,如果需要也可以是 USB 密钥。

bash
1sudo sign-efi-sig-list \
2  -a \
3  -c /var/lib/sbctl/keys/KEK/KEK.pem \
4  -k /var/lib/sbctl/keys/KEK/KEK.key \
5  db \
6  /boot/efi/EFI/Linux/akmods.esl \
7  /boot/efi/EFI/Linux/akmods.auth

从 Linux 附加:

bash
1sudo efi-updatevar \
2  -a \
3  -f /boot/efi/EFI/Linux/akmods.auth \
4  db

如果固件阻止 Linux 变量更新,请使用 Dell 固件:

text
1Expert Key Management -> db -> Append from File -> akmods.auth

使用附加(append),切勿替换(replace)。替换 db 可能会移除 sbctl 和 Microsoft 证书。

重新启动后验证:

bash
1sudo efi-readvar -v db

确认固件证书已送达内核:

bash
1sudo keyctl list %:.platform
2sudo keyctl list %:.secondary_trusted_keys
3sudo keyctl list %:.machine 2>/dev/null

你的证书应该至少在一个输出中出现。

5. 构建并签署 NVIDIA 模块#

首先安装 NVIDIA 驱动程序:

bash
1sudo dnf update -y # 如果你不在最新内核上,请重新启动
2sudo dnf install akmod-nvidia # rhel/centos 用户可以使用 kmod-nvidia
3sudo dnf install xorg-x11-drv-nvidia-cuda #可选,用于 cuda/nvdec/nvenc 支持

从可访问的目录执行:

bash
1cd /tmp
2KVER=$(uname -r)
3
4sudo akmods \
5  --force \
6  --rebuild \
7  --kernels "$KVER"
8
9sudo depmod -a "$KVER"

然后验证 NVIDIA 模块已签署:modinfo -F signer nvidia,这应该显示非空字段。

6. 重建 Initramfs 并重新启动#

bash
1sudo dracut --force --kver "$KVER"
2sudo reboot

最后测试驱动程序:

bash
 1nvidia-smi
 2
 3输出应类似于:
 4Sun Jul 26 12:37:08 2026       
 5+-----------------------------------------------------------------------------------------+
 6| NVIDIA-SMI 610.43.03              KMD Version: 610.43.03     CUDA UMD Version: 13.3     |
 7+-----------------------------------------+------------------------+----------------------+
 8| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
 9| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
10|                                         |                        |               MIG M. |
11|=========================================+========================+======================|
12|   0  NVIDIA RTX A1000 Laptop GPU    Off |   00000000:01:00.0 Off |                  N/A |
13| N/A   42C    P0            749W /   40W |      38MiB /   4096MiB |     12%      Default |
14|                                         |                        |                  N/A |
15+-----------------------------------------+------------------------+----------------------+
16
17+-----------------------------------------------------------------------------------------+
18| Processes:                                                                              |
19|  GPU   GI   CI              PID   Type   Process name                        GPU Memory |
20|        ID   ID                                                               Usage      |
21|=========================================================================================|
22|    0   N/A  N/A           18466    C+G   /usr/bin/kwin_wayland                     6MiB |
23+-----------------------------------------------------------------------------------------+