You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Ubuntu 22.04开启Secure Boot后远程主机NVIDIA驱动重启需手动输入密钥的解决方案咨询

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.konvidia-modeset.konvidia-drm.konvidia-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”):

    1. 选择Enroll MOK -> Continue
    2. 选择Yes确认导入公钥,输入刚才设置的临时密码
    3. 选择Reboot重启系统
      这次重启后就不需要再手动输入密钥了,系统会自动信任我们签名的NVIDIA模块。
  • 设置自动签名(避免驱动更新后重复操作)
    以后NVIDIA驱动更新时,DKMS会重新编译模块,所以我们可以设置一个自动签名脚本,让DKMS编译完自动签名模块:

    1. 创建签名脚本/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
      
    2. 给脚本加执行权限:
      sudo chmod +x /etc/dkms/sign_helper.sh
      
    3. 编辑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

火山引擎 最新活动