在 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+-----------------------------------------------------------------------------------------+