如何在 Linux 中签名内核模块以便使用 dkms 成功安装 NVIDIA 驱动程序?

如何在 Linux 中签名内核模块以便使用 dkms 成功安装 NVIDIA 驱动程序?

我使用 Kubuntu 18.04,并尝试使用 NVIDIA 本身提供的运行文件安装 NVIDIA 驱动程序,而不是使用包管理器。我首先安装了以下软件包:

$ sudo nano /etc/modprobe.d/blacklist-nouveau.conf

进入文件后,我添加了以下内容并保存了文件:

blacklist nouveau
options nouveau modeset=0

运行以下命令并重新启动操作系统:

$ dracut -f

如果你不熟悉它,它就像这样的命令:

update-initramfs -u

重启后我安装了这些必需的软件包:

$ sudo apt install build-essential make acpid dkms libglvnd-core-dev libglvnd0 libglvnd-dev dracut pkg-config linux-headers-$(uname -r)
$ sudo dpkg --add-architecture i386
$ sudo apt update
$ sudo apt install libc6:i386

处理所有必要的依赖关系

由于已启用安全启动(我打算保持这种状态),为了能够继续安装,我必须签署内核模块才能安装 NVIDIA 驱动程序。但我不知道如何从内核模块制作所需的 .der 文件,但我知道如何将其添加到 UEFI/BIOS 中的 DB 中,这样错误就会消失。如果我尝试使用 dkms 安装,它会卡在 5%,如果我不使用 dkms 安装,我会收到此错误:

The kernel module failed to load, because it was not signed by a key that is trusted by the kernel. Please try installing the driver again, and sign the kernel module when prompted to do so.

那么我如何签署内核模块并输出.der 文件以添加到安全启动数据库?

答案1

如果你以前没有做过这件事,那就不容易。

  1. 安装xca,因为它更容易使用和创建自签名证书或链。
  2. 将根链或自签名证书本地存储在证书数据库中并运行导入脚本。不确定它在 Ubuntu 上的位置。
  3. 安装内核源
  4. 运行<path to kernel source>/scripts/sign-file sha256 <path to cert root PEM> <path to cert CRT file> <kernel module.ko>。PEM 和 CRT 不能是同一个文件。
  5. 将其复制到/lib/modules/<kernel mod dir>/misc,并根据需要压缩它。
  6. 跑步depmod
  7. 现在你应该能够做到modprobe了。

我确信该证书必须设置代码签名属性。

思考这就对了。

相关内容