Ubuntu 20.04 insmod加载内核模块提示受限、操作无权限如何解决
问题原因
Ubuntu 20.04 在开启UEFI安全启动的环境下会默认启用**内核锁定(Kernel Lockdown)**安全机制,其中一条默认规则就是禁止加载未经过系统受信密钥签名的内核模块,避免恶意代码注入内核运行态。
你自行编译的main.ko属于未签名第三方模块,加载时直接被机制拦截,对应看到的两条报错:
Lockdown: insmod: unsigned module loading is restricted是内核锁定抛出的明确拦截提示Operation not permitted是拦截后返回的标准操作拒绝错误
当前系统版本信息如下:
NAME="Ubuntu" VERSION="20.04.2 LTS (Focal Fossa)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 20.04.2 LTS" VERSION_ID="20.04" HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" VERSION_CODENAME=focal UBUNTU_CODENAME=focal
处理方案
根据使用场景选择对应方案即可:
方案1:临时关闭模块签名校验(适合单次调试场景)
操作步骤:
- 重启系统,在GRUB启动选择界面按
e键进入启动参数编辑页 - 定位到以
linux开头的启动参数行,在该行末尾追加参数:module.sig_enforce=0 - 按
Ctrl+X组合键保存参数并启动系统,进入系统后即可正常执行insmod加载自编译模块
注意:该方法仅单次启动生效,重启后签名校验规则会自动恢复。
方案2:永久关闭模块签名强制校验(适合长期做内核开发的场景)
操作步骤:
- 安装依赖工具:
sudo apt update && sudo apt install -y mokutil shim-signed - 执行关闭校验命令:
sudo mokutil --disable-validation - 按提示设置1-8位的临时MOK密码,记住密码后重启系统
- 重启时会弹出蓝色MOK管理界面,依次选择
Change Secure Boot state-> 按提示对应输入之前设置的密码字符 -> 选择Yes关闭校验,确认后系统自动重启,之后就可以永久加载未签名模块。
方案3:给自编译模块签名(保留安全启动防护,适合生产/日常使用场景)
如果不想关闭安全启动的安全特性,可以将自定义签名密钥加入系统信任列表,给模块签名后加载:
- 安装签名依赖工具:
sudo apt update && sudo apt install -y mokutil shim-signed openssl - 生成自定义签名密钥对:
openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=Custom Kernel Module Sign Key/"
- 将公钥导入系统MOK信任列表:
sudo mokutil --import MOK.der
执行后按提示设置临时MOK密码,重启系统 - 重启进入MOK管理界面,依次选择
Enroll MOK->Continue->Yes,输入之前设置的临时密码确认导入,完成后重启进入系统 - 进入系统后对编译好的
main.ko执行签名操作:sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der ./main.ko
签名完成后即可正常加载该模块。
虚拟机环境快速方案
如果Ubuntu运行在VMware、VirtualBox等虚拟化平台,可以直接关闭虚拟机设置里的「UEFI安全启动」选项,保存配置后重启虚拟机,内核锁定机制会自动停用,无需修改系统内配置。
内容的提问来源于stack exchange,提问作者samir mulani
相关产品推荐
相关产品推荐

