在 systemd-boot Fedora 上安装 NVIDIA 驱动程序
导入 DB、自动签署及处理 UEFI 的指南
0. 开始之前#
我在 Dell Precision 5570 笔记本电脑上进行安装,注册 db 密钥的步骤可能因你的电脑而异。
这里涉及两个独立的信任操作:
- EFI 签署:固件
db信任 systemd-boot 和你的 UKI。 - 内核模块签署:NVIDIA 模块由内核信任的密钥签署。
当直接通过 systemd-boot 启动时,不需要 MOK,前提是模块证书存在于固件 db 中,且 Fedora 将该密钥导入到模块验证接受的 keyring 中。线上的教程主要针对 grub+shim,通常会要求你注册 MOK 密钥。
1. 安装所需软件包#
根据 Fedora 版本启用 RPM Fusion,然后安装:
1sudo dnf install akmods kernel-devel-matched openssl keyutils efitools sbctl确保匹配的内核开发文件存在:
1KVER=$(uname -r)
2test -x /usr/src/kernels/"$KVER"/scripts/sign-file2. 创建专用的 akmods 密钥#
如果软件包尚未生成 Fedora akmods 密钥,请手动生成:
1sudo kmodgenca -a检查路径:
1sudo readlink -e /etc/pki/akmods/private/private_key.priv
2sudo readlink -e /etc/pki/akmods/certs/public_key.der两个命令都必须返回真实的文件路径。
确认证书:
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 无法访问其目标。因此,以下测试在构建中失败:
1[ -e /etc/pki/akmods/private/private_key.priv ]Shell 短路了签署条件,因此从未检查 public_key.der,也从未调用 /usr/lib/rpm/brp-kmodsign。
对解析后的目标以及目录遍历权限进行设置:
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使用执行构建的身份进行测试:
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。
确认密钥和证书匹配:
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 输入:
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:
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验证它包含有效的证书:
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 密钥。
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 附加:
1sudo efi-updatevar \
2 -a \
3 -f /boot/efi/EFI/Linux/akmods.auth \
4 db如果固件阻止 Linux 变量更新,请使用 Dell 固件:
1Expert Key Management -> db -> Append from File -> akmods.auth使用附加(append),切勿替换(replace)。替换 db 可能会移除 sbctl 和 Microsoft 证书。
重新启动后验证:
1sudo efi-readvar -v db确认固件证书已送达内核:
1sudo keyctl list %:.platform
2sudo keyctl list %:.secondary_trusted_keys
3sudo keyctl list %:.machine 2>/dev/null你的证书应该至少在一个输出中出现。
5. 构建并签署 NVIDIA 模块#
首先安装 NVIDIA 驱动程序:
1sudo dnf update -y # 如果你不在最新内核上,请重新启动
2sudo dnf install akmod-nvidia # rhel/centos 用户可以使用 kmod-nvidia
3sudo dnf install xorg-x11-drv-nvidia-cuda #可选,用于 cuda/nvdec/nvenc 支持从可访问的目录执行:
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 并重新启动#
1sudo dracut --force --kver "$KVER"
2sudo reboot最后测试驱动程序:
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+-----------------------------------------------------------------------------------------+