Ubuntu 22.04开启Secure Boot后远程主机NVIDIA驱动重启需手动输入密钥的解决方案咨询
我之前遇到过完全一样的问题——要在保留Secure Boot的前提下,避免远程主机每次重启都得手动输入密钥来加载NVIDIA驱动。核心思路是创建自己的可信密钥对,给NVIDIA的内核模块签名,再把公钥导入Secure Boot固件,让系统自动认可签名后的模块。具体操作步骤如下:
生成自己的Secure Boot密钥对
用OpenSSL生成一个有效期100年的密钥对(私钥用于签名模块,公钥要导入固件),执行命令:openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=My Secure Boot Key/"执行后会在当前目录生成
MOK.priv(私钥)和MOK.der(公钥),记得把这两个文件存到安全的地方,别弄丢了。给NVIDIA内核模块签名
首先确保安装了签名工具依赖:sudo apt install linux-modules-extra-$(uname -r)然后找到NVIDIA驱动的内核模块,一般在
/lib/modules/$(uname -r)/updates/dkms/目录下,需要签名的模块包括nvidia.ko、nvidia-modeset.ko、nvidia-drm.ko、nvidia-uvm.ko,逐个签名:sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der /lib/modules/$(uname -r)/updates/dkms/nvidia.ko sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der /lib/modules/$(uname -r)/updates/dkms/nvidia-modeset.ko sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der /lib/modules/$(uname -r)/updates/dkms/nvidia-drm.ko sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der /lib/modules/$(uname -r)/updates/dkms/nvidia-uvm.ko导入公钥到Secure Boot固件
用mokutil工具导入公钥,执行:sudo mokutil --import MOK.der执行后会提示你设置一个临时密码,这个密码只在下次重启时用,用来确认导入密钥,一定要记好。
重启完成密钥导入
重启系统,这时候会进入蓝色的MOK管理界面(可能叫“Machine Owner Key Management”):- 选择
Enroll MOK->Continue - 选择
Yes确认导入公钥,输入刚才设置的临时密码 - 选择
Reboot重启系统
这次重启后就不需要再手动输入密钥了,系统会自动信任我们签名的NVIDIA模块。
- 选择
设置自动签名(避免驱动更新后重复操作)
以后NVIDIA驱动更新时,DKMS会重新编译模块,所以我们可以设置一个自动签名脚本,让DKMS编译完自动签名模块:- 创建签名脚本
/etc/dkms/sign_helper.sh:#!/bin/bash KEY_PRIV="/path/to/your/MOK.priv" # 替换成你实际的MOK.priv路径 KEY_DER="/path/to/your/MOK.der" # 替换成你实际的MOK.der路径 for module in "$@"; do /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 "$KEY_PRIV" "$KEY_DER" "$module" done - 给脚本加执行权限:
sudo chmod +x /etc/dkms/sign_helper.sh - 编辑DKMS配置文件
/etc/dkms/framework.conf,添加一行:POST_INSTALL_SCRIPT=/etc/dkms/sign_helper.sh
这样以后驱动更新时,新编译的模块会自动被签名,不用再手动操作。
- 创建签名脚本
验证是否成功
重启后可以用以下命令验证:modinfo nvidia | grep signature如果输出包含
Signature: PKCS#7之类的内容,说明签名成功;也可以查看驱动加载日志:dmesg | grep -i nvidia没有报错说明驱动正常加载,且无需手动输入密钥。
备注:内容来源于stack exchange,提问作者codingfreak




