尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

在Ubuntu 24.04上为紫光FPGA PCIe驱动签名,绕过Secure Boot限制(保姆级避坑)

在Ubuntu 24.04上为紫光FPGA PCIe驱动签名,绕过Secure Boot限制(保姆级避坑) 在Ubuntu 24.04上为紫光FPGA PCIe驱动签名绕过Secure Boot限制保姆级避坑国产FPGA的崛起为开发者带来了新的机遇但同时也伴随着一系列技术挑战。紫光FPGA作为国产芯片的代表之一其PCIe接口在高速数据传输场景中扮演着重要角色。然而当我们在Ubuntu 24.04这样的现代Linux发行版上部署相关驱动时Secure Boot安全机制往往会成为一道难以逾越的门槛。本文将深入探讨如何在不关闭Secure Boot的情况下为紫光FPGA的PCIe驱动进行签名确保其能够顺利加载并运行。1. Secure Boot与驱动签名的背景解析Secure Boot是UEFI固件中的一项安全功能旨在防止未经授权的代码在系统启动过程中执行。当这一机制启用时所有内核模块包括驱动程序都必须经过有效签名才能加载。对于紫光FPGA的PCIe驱动而言这意味着我们需要创建一个可信的签名密钥并用它来为驱动模块签名。现代Linux内核从5.0版本开始加强了对模块签名的验证特别是在Ubuntu 24.04这样的发行版中这一要求变得更加严格。开发者通常会遇到以下两种典型错误modprobe: ERROR: could not insert pango_pci_driver: Operation not permitted或insmod: ERROR: could not insert module: Required key not available这些错误信息表明系统拒绝了未签名的驱动加载请求。传统解决方案是直接禁用Secure Boot但这会降低系统安全性特别是在企业环境或需要合规认证的场景下不可行。2. 驱动签名全流程详解2.1 准备工作与环境配置在开始签名流程前需要确保系统已安装必要的工具链sudo apt update sudo apt install -y mokutil openssl sbsigntool build-essential linux-headers-$(uname -r)关键组件说明mokutil管理机器所有者密钥MOK的工具openssl生成密钥对的标准工具sbsigntool用于对EFI二进制文件进行签名linux-headers包含内核模块签名脚本2.2 密钥生成与管理系统创建专用目录存储密钥文件避免权限混乱mkdir -p ~/kernel_keys cd ~/kernel_keys使用OpenSSL生成X.509密钥对有效期约100年openssl req -new -x509 -newkey rsa:2048 \ -keyout MOK.priv -outform DER -out MOK.der \ -nodes -days 36500 -subj /CNPango_Driver_Signing_Key/生成的文件说明文件名类型用途安全要求MOK.priv私钥用于签名驱动必须严格保密MOK.der公钥注册到系统可公开分发注意私钥文件(MOK.priv)的权限应设置为600防止未授权访问chmod 600 ~/kernel_keys/MOK.priv2.3 密钥注册到Secure Boot将公钥导入系统MOKMachine Owner Key数据库sudo mokutil --import MOK.der执行此命令后系统会提示设置临时密码至少8个字符这个密码将在重启后使用一次。建议使用简单易记的临时密码如temp1234。完整注册流程立即重启系统sudo reboot在GRUB菜单中选择Enroll MOK按照屏幕提示完成密钥注册系统会自动重启验证密钥是否成功注册sudo mokutil --list-enrolled2.4 驱动签名实战操作定位到驱动模块所在目录使用内核提供的签名脚本进行签名sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file \ sha256 ~/kernel_keys/MOK.priv ~/kernel_keys/MOK.der \ /path/to/pango_pci_driver.ko验证签名是否成功modinfo /path/to/pango_pci_driver.ko | grep sig_id\|signer成功签名后输出应包含类似以下内容sig_id: PKCS#7 signer: Pango_Driver_Signing_Key2.5 驱动加载与验证最后加载已签名的驱动模块sudo insmod /path/to/pango_pci_driver.ko检查驱动是否成功加载lsmod | grep pango dmesg | tail -n 203. 常见问题排查与解决方案3.1 签名后仍无法加载驱动现象驱动已签名但insmod仍报错可能原因内核配置强制要求特定证书签名使用的哈希算法不匹配解决方案 检查内核强制签名要求cat /proc/sys/kernel/modules_restrict如果值为1需要临时放宽限制不推荐长期使用echo 0 | sudo tee /proc/sys/kernel/modules_restrict3.2 MOK密钥注册失败现象重启后未出现MOK管理界面解决方案确认UEFI固件中Secure Boot已启用检查mokutil状态sudo mokutil --sb-state sudo mokutil --list-enrolled尝试手动触发注册sudo mokutil --import MOK.der --root-pw3.3 多用户环境下的密钥管理在团队开发环境中建议由系统管理员统一生成并分发公钥私钥存储在安全的中央位置使用自动化脚本统一签名驱动示例团队签名脚本#!/bin/bash # 批量签名脚本 KEY_DIR/opt/secure_keys MODULE_DIR/opt/drivers for ko in $(find $MODULE_DIR -name *.ko); do echo Signing $(basename $ko)... /usr/src/linux-headers-$(uname -r)/scripts/sign-file \ sha256 $KEY_DIR/MOK.priv $KEY_DIR/MOK.der $ko done4. 自动化与持久化方案每次系统更新或驱动重新编译后都需要重新签名为避免重复操作可以建立自动化流程。4.1 DKMS自动签名方案对于频繁更新的驱动建议配置DKMSDynamic Kernel Module Support创建DKMS配置文件POST_BUILD../../scripts/sign-file sha256 /home/$USER/kernel_keys/MOK.priv /home/$USER/kernel_keys/MOK.der \$module注册驱动到DKMSsudo dkms add -m pango_pci -v 1.0 sudo dkms build -m pango_pci -v 1.0 sudo dkms install -m pango_pci -v 1.04.2 Systemd服务单元示例创建持久化加载服务cat EOF | sudo tee /etc/systemd/system/pango-pci.service [Unit] DescriptionLoad Pango PCIe Driver Aftersystemd-modules-load.service [Service] Typeoneshot ExecStart/sbin/insmod /lib/modules/$(uname -r)/updates/pango_pci_driver.ko RemainAfterExityes [Install] WantedBymulti-user.target EOF启用服务sudo systemctl enable pango-pci.service sudo systemctl start pango-pci.service4.3 内核启动参数优化对于性能敏感型应用可以在GRUB配置中添加以下参数sudo sed -i s/GRUB_CMDLINE_LINUX_DEFAULT[^]*/ module.sig_enforce0/ /etc/default/grub sudo update-grub这个设置虽然不会禁用签名验证但会减少内核在加载驱动时的额外检查开销。
返回列表