在现代 Ubuntu 系统中,尤其是基于 UEFI 的安装版本,出于安全考虑,内核默认要求所有加载的内核模块必须经过数字签名,这通常被称为“模块签名验证”。
如果你尝试加载一个未经签名的第三方驱动程序、自己编译的内核模块,或者某些特定的硬件驱动,系统通常会报错,提示类似于“module verification failed: signature and/or required key missing - bad module [模块名]”。
本文将详细讲解 Ubuntu 加载非签名模块的几种方法,以及相关的安全注意事项。

为什么会出现这个问题?
Ubuntu 默认开启了 Secure Boot(安全启动)功能,并且内核配置中启用了 CONFIG_MODULE_SIG,这意味着,在内核加载任何 .ko 文件之前,它会先验证该文件的数字签名,如果签名无效、缺失或与预期的密钥不匹配,内核将拒绝加载该模块,从而导致设备不可用或服务启动失败。
解决方案
根据你的需求(是临时测试、开发调试,还是为了保留系统安全),有以下几种解决方案:
临时禁用 Secure Boot(最简单、最彻底)
这是最直接的方法,它绕过了整个签名验证机制。
- 进入 BIOS/UEFI 设置: 重启电脑,在开机启动时按下
F2、Del或Esc(具体按键取决于你的主板厂商)进入 BIOS 设置界面。 - 关闭 Secure Boot: 找到 "Security" 或 "Boot" 选项卡,将 "Secure Boot" 设置为
Disabled(禁用)。 - 重启系统: 保存设置并重启 Ubuntu。
- 加载模块: 现在你可以尝试加载之前无法加载的非签名模块,系统将不再进行签名验证。
- (可选)恢复安全启动: 如果你完成工作后希望恢复系统的安全性,可以再次进入 BIOS 将 Secure Boot 重新开启。
注意: 关闭 Secure Boot 会降低系统的整体安全性,虽然对于个人桌面用户风险有限,但应谨慎操作。
手动给模块签名(保留安全启动)
如果你希望保留 Secure Boot 开启,同时又能加载自定义的非签名模块,你需要手动对模块进行签名。
-
安装签名工具: 首先需要安装
sbsigntool(如果尚未安装)。sudo apt update sudo apt install sbsigntool
-
找到模块文件: 通常模块位于
/lib/modules/$(uname -r)/extra/或/usr/lib/modules/$(uname -r)/extra/目录下,假设你的模块文件名为my_module.ko。 -
创建密钥对(仅首次需要): 你需要一个私钥来签名模块,可以使用 OpenSSL 生成一个自签名密钥。
# 生成私钥 openssl genrsa -out my_private_key.priv 2048 # 生成证书 openssl req -new -x509 -key my_private_key.priv -out my_cert.cer -subj "/CN=My Module Signer"
-
签名模块: 使用
sbsigntool对模块进行签名。sudo sbsigntool --sign my_cert.cer --key my_private_key.priv my_module.ko
签名成功后,会生成一个带签名的副本(通常原文件会被覆盖或重命名)。
-
加载模块: 现在你可以正常加载该模块,Secure Boot 会验证通过。
修改内核启动参数(仅验证失败时有效)
这种方法比较少见,通常用于需要加载特定的非标准驱动,但有时也可以通过内核参数来临时禁用模块验证。
-
编辑 GRUB 配置文件:
sudo nano /etc/default/grub
-
在
GRUB_CMDLINE_LINUX_DEFAULT这一行中添加modprobe.blacklist=<模块名>或者尝试添加force_module_signature=0(注意:并非所有内核版本都支持此参数,且可能导致系统不稳定)。 -
更新 GRUB 并重启:
sudo update-grub sudo reboot
在 Ubuntu 中处理“加载非签名模块”的问题,核心在于理解 Secure Boot 和 内核模块签名 机制。
- 如果你只是想快速解决驱动问题进行测试,方法一(关闭 Secure Boot) 是最快的选择。
- 如果你是在进行开发或必须保证系统安全,方法二(手动签名) 是最标准的做法。
请务必在操作前备份重要数据,并在修改系统安全设置时保持警惕。
