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