[{"title":"在 systemd-boot Fedora 上安裝 NVIDIA 驅動程式","url":"/posts/systemd-nvidia/","date":"2026-07-26","tags":["driver","linux"],"summary":"0. 開始之前# 我在 Dell Precision 5570 筆記型電腦上進行安裝，註冊 db 金鑰的步驟可能因你的電腦而異。\n這裡涉及兩個獨立的信任操作：\nEFI 簽署：韌體 db 信任 systemd-boot 和你的 UKI。 內核模組簽署：NVIDIA 模組由內核信任的金鑰簽署。 當直接通過 systemd-boot 啟動時，不需要 MOK，前提是模組憑證存在於韌體 db 中，且 …","content":" 0. 開始之前# 我在 Dell Precision 5570 筆記型電腦上進行安裝，註冊 db 金鑰的步驟可能因你的電腦而異。\n這裡涉及兩個獨立的信任操作：\nEFI 簽署：韌體 db 信任 systemd-boot 和你的 UKI。 內核模組簽署：NVIDIA 模組由內核信任的金鑰簽署。 當直接通過 systemd-boot 啟動時，不需要 MOK，前提是模組憑證存在於韌體 db 中，且 Fedora 將該金鑰匯入到模組驗證接受的 keyring 中。線上的教學主要針對 grub+shim，通常會要求你註冊 MOK 金鑰。\n1. 安裝所需套件# 根據 Fedora 版本啟用 RPM Fusion，然後安裝：\nbash COPY 1sudo dnf install akmods kernel-devel-matched openssl keyutils efitools sbctl 確保匹配的內核開發檔案存在：\nbash COPY 1KVER=$(uname -r) 2test -x /usr/src/kernels/\u0026amp;#34;$KVER\u0026amp;#34;/scripts/sign-file 2. 建立專用的 akmods 金鑰# 如果套件尚未生成 Fedora akmods 金鑰，請手動生成：\nbash COPY 1sudo kmodgenca -a 檢查路徑：\nbash COPY 1sudo readlink -e /etc/pki/akmods/private/private_key.priv 2sudo readlink -e /etc/pki/akmods/certs/public_key.der 兩個指令都必須返回真實的檔案路徑。\n確認憑證：\nbash COPY 1sudo openssl x509 \\ 2 -inform DER \\ 3 -in /etc/pki/akmods/certs/public_key.der \\ 4 -noout -subject -issuer -fingerprint -sha256 此輸出不應為空。\n3. 修正 Akmods 金鑰權限# RPM 構建以非特權使用者 akmods 身份執行。Root 可以解析並讀取 symlink，但 akmods 無法存取其目標。因此，以下測試在構建中失敗：\nbash COPY 1[ -e /etc/pki/akmods/private/private_key.priv ] Shell 短路了簽署條件，因此從未檢查 public_key.der，也從未調用 /usr/lib/rpm/brp-kmodsign。\n對解析後的目標以及目錄遍歷權限進行設定：\nbash COPY 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 \u0026amp;#34;$PRIVATE\u0026amp;#34; 5sudo chmod 640 \u0026amp;#34;$PRIVATE\u0026amp;#34; 6 7sudo chown root:akmods \u0026amp;#34;$PUBLIC\u0026amp;#34; 8sudo chmod 644 \u0026amp;#34;$PUBLIC\u0026amp;#34; 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 使用執行構建的身份進行測試：\nbash COPY 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。\n確認金鑰和憑證匹配：\nbash COPY 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 | …"},{"title":"P2481 [SDOI2010] 代码拍卖会","url":"/notes/p2481/","date":"2026-07-25","tags":["luogu","cp"],"summary":"設：\ndp[len][last][rem] last：目前最後一隻豬的出價，範圍 1..9 rem：目前構成的 len 位數除以 P 的餘數 若在右邊加入數字 x，必須滿足 x \u0026gt;= last，新餘數是：\n$newRem=(rem\\times 10+x)\\bmod P$\n","content":"設：\ndp[len][last][rem] last：目前最後一隻豬的出價，範圍 1..9 rem：目前構成的 len 位數除以 P 的餘數 若在右邊加入數字 x，必須滿足 x \u0026amp;gt;= last，新餘數是：\n$newRem=(rem\\times 10+x)\\bmod P$\n"},{"title":"刪除 CF Pages 部署","url":"/posts/cf-too-many-deploy/","date":"2026-07-25","tags":["cloudflare","pages","tools"],"summary":"當你嘗試刪除一個擁有超過約 100 次部署的 Pages 專案時（每次構建都算作一次部署，例如你更新了網誌中的一篇文章），你可能會遇到以下錯誤：Your project has too many deployments to be deleted, follow this guide to delete them: https://cfl.re/3CXesln\n於是我叫大肥魚（Deepseek）幫 …","content":"當你嘗試刪除一個擁有超過約 100 次部署的 Pages 專案時（每次構建都算作一次部署，例如你更新了網誌中的一篇文章），你可能會遇到以下錯誤：Your project has too many deployments to be deleted, follow this guide to delete them: https://cfl.re/3CXesln\n於是我叫大肥魚（Deepseek）幫我寫一個 Python 腳本，自動刪除部署，這樣我之後就可以刪除該專案。cloudflare-bulk-delete 這個 repo 已經壞了，因為 Pages API 每頁查詢的記錄上限是 25 條，而該工具每次發送 100 條記錄的查詢，導致 HTTP 400 錯誤。\npython COPY 1#!/usr/bin/env python3 2\u0026amp;#34;\u0026amp;#34;\u0026amp;#34;Bulk delete all Cloudflare Pages deployments in a project.\u0026amp;#34;\u0026amp;#34;\u0026amp;#34; 3 4import os 5import sys 6import requests 7 8# Config — set these via environment variables or edit inline 9ACCOUNT_ID = os.environ.get(\u0026amp;#34;CLOUDFLARE_ACCOUNT_ID\u0026amp;#34;, \u0026amp;#34;your_account_id\u0026amp;#34;) 10TOKEN = os.environ.get(\u0026amp;#34;CLOUDFLARE_API_TOKEN\u0026amp;#34;, \u0026amp;#34;cfut_kfcCRAZYthursday\u0026amp;#34;) 11PROJECT = os.environ.get(\u0026amp;#34;CLOUDFLARE_PROJECT\u0026amp;#34;, \u0026amp;#34;hugo\u0026amp;#34;) 12 13BASE = f\u0026amp;#34;https://api.cloudflare.com/client/v4/accounts/{ACCOUNT_ID}/pages/projects/{PROJECT}/deployments\u0026amp;#34; 14HEADERS = {\u0026amp;#34;Authorization\u0026amp;#34;: f\u0026amp;#34;Bearer {TOKEN}\u0026amp;#34;} 15 16 17def fetch_all_deployment_ids(): 18 \u0026amp;#34;\u0026amp;#34;\u0026amp;#34;Fetch all deployment IDs across all pages.\u0026amp;#34;\u0026amp;#34;\u0026amp;#34; 19 ids = [] 20 page = 1 21 while True: 22 resp = requests.get(f\u0026amp;#34;{BASE}?page={page}\u0026amp;#34;, headers=HEADERS).json() 23 if not resp[\u0026amp;#34;success\u0026amp;#34;]: 24 print(f\u0026amp;#34;Error fetching page {page}: {resp[\u0026amp;#39;errors\u0026amp;#39;]}\u0026amp;#34;, file=sys.stderr) 25 sys.exit(1) 26 27 ids.extend(d[\u0026amp;#34;id\u0026amp;#34;] for d in resp[\u0026amp;#34;result\u0026amp;#34;]) 28 total_pages = resp[\u0026amp;#34;result_info\u0026amp;#34;][\u0026amp;#34;total_pages\u0026amp;#34;] 29 print(f\u0026amp;#34; Page {page}/{total_pages} — collected {len(ids)} total\u0026amp;#34;) 30 31 if page \u0026amp;gt;= total_pages: 32 break 33 page += 1 34 35 return ids 36 37 38def delete_deployment(dep_id): 39 \u0026amp;#34;\u0026amp;#34;\u0026amp;#34;Delete a single deployment. Returns (ok, message).\u0026amp;#34;\u0026amp;#34;\u0026amp;#34; 40 r = requests.delete(f\u0026amp;#34;{BASE}/{dep_id}\u0026amp;#34;, headers=HEADERS) 41 data = r.json() 42 if data.get(\u0026amp;#34;success\u0026amp;#34;): 43 return True, \u0026amp;#34;OK\u0026amp;#34; 44 else: 45 err = data.get(\u0026amp;#34;errors\u0026amp;#34;, …"},{"title":"簽署 systemd-boot 檔案並註冊 PK 以啟用安全啟動","url":"/posts/systemd-secureboot/","date":"2026-07-25","tags":["linux"],"summary":"0. 開始之前# 最近我嘗試安裝 Fedora 來取代 Ubuntu，以擺脫 snap 的爛東西。然後我不知道從哪裡冒出一個想法，決定試試 systemd-boot，噩夢就是這樣開始的。\n這裡涉及兩個獨立的信任操作：\nEFI 簽署：韌體 db 信任 systemd-boot 和你的 UKI。 內核模組簽署：NVIDIA 模組由內核信任的金鑰簽署。 當直接通過 systemd-boot 啟動時，不需 …","content":" 0. 開始之前# 最近我嘗試安裝 Fedora 來取代 Ubuntu，以擺脫 snap 的爛東西。然後我不知道從哪裡冒出一個想法，決定試試 systemd-boot，噩夢就是這樣開始的。\n這裡涉及兩個獨立的信任操作：\nEFI 簽署：韌體 db 信任 systemd-boot 和你的 UKI。 內核模組簽署：NVIDIA 模組由內核信任的金鑰簽署。 當直接通過 systemd-boot 啟動時，不需要 MOK，前提是模組憑證存在於韌體 db 中，且 Fedora 將該金鑰匯入到模組驗證接受的 keyring 中。線上的教學主要針對 grub+shim，通常會要求你註冊 MOK 金鑰。\n如果你對我的安裝過程以及我如何為安全啟動配置 systemd-boot 不感興趣，請跳過第 0 章。\n安裝 Fedora# systemd-boot 方式只能使用 Everything netinst 映像進行配置（據說離線映像也可以做到，但步驟更複雜）。從 USB 金鑰啟動後，導航到——\n建立金鑰：\nbash COPY 1sudo sbctl create-keys 註冊 sbctl 金鑰同時保留 Microsoft 憑證：\nbash COPY 1sudo sbctl enroll-keys -m 當需要 Microsoft 簽署的 Option ROM、Windows 或其他 Microsoft 簽署的 EFI 組件時，-m 參數很重要。\n簽署已註冊的 EFI 檔案：\nbash COPY 1sudo sbctl sign-all 2sudo sbctl verify "}]