在Fedora中全自动签名英伟达驱动内核模块以支持安全启动(Secure Boot)

前言

目前新出厂的电脑UEFI会默认开启安全启动(Secure Boot),以阻止不受信任的引导加载程序启动,可以在一定程度上防御RootKit病毒,不过同样会阻止一些未经微软签名的Linux发行版的安装和运行,比如Arch Linux。虽然可以直接选择在主板设置中关闭安全启动来解决一系列麻烦,但就在近期微软公布的Windows11最低硬件标准中可以看到,安全启动被微软看的越来越重。所以掌握让自己常用的Linux发行版支持安全启动的方法是有必要的。然而,让Linux本身支持安全启动,最重要的是让发行商对该Linux的内核与引导加载器进行签名。本文就已经通过安全启动认证的比较受欢迎的一个Linux发行版——Fedora,来讲解常见的英伟达驱动签名问题。

至于为什么有这个教程,是因为如果在Fedora上通过自带软件源一键安装官方的英伟达驱动,会造成这些驱动的内核模块未签名,导致在Linux启动过程中因为安全启动校验签名的存在,被阻止加载这些模块,进而无法正常驱动显卡。用过Ubuntu的伙伴们应该知道,在安全启动开启的情况下 ,Ubuntu安装程序会自动用自签密钥签名英伟达驱动内核模块,并在开机过程中自动将该自签密钥导入MOK List(安全启动机器主人信任密钥列表)。而Fedora只会保证自身内核签名有效,对后期安装的第三方内核模块签名问题不予理会,导致无法正常加载英伟达驱动。

本教程参考这里并实现,感谢该博客作者
本教程已在Fedora 36 Beta版本上测试通过,理论上向下兼容,具体是否有效请自测。注意备份重要数据!笔者仅为分享经验,不对您的任何操作造成的任何后果而负责!
最新测试显示,本教程方法仅适用于Fedora 36 Beta及以下版本,Fedora 36正式版不再适用,官方支持通过特定工具一键生成安全启动密钥并导入,具体请参考这里

前提条件

在开始之前,您的电脑必须满足以下条件

  1. 主板必须在已经开启安全启动的情况下安装Fedora
  2. 必须确保任何来源、任何版本的英伟达驱动从未被安装过 (如果已经安装过,请搜索有关彻底卸载的相关教程,或者直接重装系统。因为笔者在试验时发现卸载完后再继续进行以下步骤仍然会导致驱动模块无法被签名)

具体步骤

打开终端,按步骤分别执行以下命令(本教程通用性强,无需考虑命令中的路径与环境变量问题)。

1.将系统更新到最新并重启Fedora

sudo dnf update
sudo reboot

将系统更新到最新并重启Fedora

2.安装Mok工具(mokutil)和密钥生成工具(openssl)

sudo dnf install mokutil openssl

安装Mok工具和密钥生成工具

3.生成内核驱动模块的自签安全启动密钥

sudo openssl req -new -x509 -newkey rsa:2048 -keyout ~/driver-signing.key -outform DER -out ~/driver-signing.der -nodes -days 36500 -subj "/CN=Private Driver Signing"

生成内核驱动模块的自签安全启动密钥

4.将刚刚自签的安全启动密钥进行注册(导入进主板)

此操作会让Linux内核信任由该自签密钥签名过的任何内核模块。

sudo mokutil --import ~/driver-signing.der

执行完此命令后,控制台会让您设置一个密码,该密码的作用是用来导入并注册自签自签密钥,只会在第6步用到一次,合理设置即可,建议8位。
在这里插入图片描述

5.重启电脑

sudo reboot

6.导入并注册自签密钥

在第5步键入完命令并重启时,系统启动之前会出现一个蓝色界面(标题为MOK Manager)。在安全启动的条件下安装过Ubuntu的您可能会熟悉。按照以下选项导入密钥即可:
注意:以下几个步骤要小心,任何一步误操作,都必须从第4步开始重做。

  1. 通过方向键选择“Enroll MOK”Enroll MOK

  2. 选择“Continue”Continue

  3. 选择“Yes”Yes

  4. 此时输入在第4步时设置的密码并回车(输入过程中密码不会显示)键入密码并回车

  5. 成功后选择“Reboot”Reboot
    此时,电脑会再次重启,等待进入Fedora即可。

7.启用两个第三方仓库,以便于安装修改过的内核工具进行模块签名

(感谢Elia Geretto提供的仓库)

sudo dnf copr enable egeretto/kmodtool-secureboot

在这里插入图片描述

sudo dnf copr enable egeretto/akmods-secureboot

在这里插入图片描述

8.修改仓库优先级,让修改过的内核工具优先于官方原版安装

以ROOT权限打开文件管理器,修改以下两个文件,每个文件均增加一行:priority=1,然后保存退出。
在这里插入图片描述
执行以下命令刷新软件源:

sudo dnf update --refresh

9.安装修改过的内核工具(kmodtool与akmods)

sudo dnf install kmodtool akmods

注意控制台中的此处,查看这两个软件包是否来自于刚刚添加的第三方仓库
如图所示
输入y同意导入仓库公钥:
在这里插入图片描述

10.移动证书至正确的位置以便于内核工具能识别到

依次执行以下命令即可:

sudo mv ~/driver-signing.der /etc/pki/akmods/certs/public_key.der
sudo chown root:akmods /etc/pki/akmods/certs/public_key.der
sudo chmod 640 /etc/pki/akmods/certs/public_key.der
sudo mv ~/driver-signing.key /etc/pki/akmods/private/private_key.priv
sudo chown root:akmods /etc/pki/akmods/private/private_key.priv
sudo chmod 640 /etc/pki/akmods/private/private_key.priv

在这里插入图片描述

11.安装英伟达驱动

执行以下命令即可:

sudo dnf install gcc kernel-headers kernel-devel akmod-nvidia xorg-x11-drv-nvidia xorg-x11-drv-nvidia-libs xorg-x11-drv-nvidia-libs.i686

12.编译并签名驱动内核模块

sudo akmods --force

13.更新内核启动镜像

sudo dracut --force

在这里插入图片描述

14.重启电脑

sudo reboot

15.查看英伟达驱动是否正确加载

执行以下命令,查看是否有如图所示的类似结果,并查看英伟达控制面板是否正常显示。
内核模块已正确加载效果图
在这里插入图片描述
在这里插入图片描述
教程结束

sudo apt install -y wine32 正在解析依赖... 有错误! 有一些软件包无法被安装。如果您用的是 unstable 发行版,这也许是 因为系统无法达到您要求的状态造成的。该版本中可能会有一些您需要的软件 包尚未被创建或是它们已被从新到(Incoming)目录移出。 下列信息可能会对解决问题有所帮助: 无法满足的依赖关系: apt : 依赖: sqv 但是它将不会被安装 依赖: libapt-pkg7.0 (>= 2.9.33+kali1) 但是它将不会被安装 依赖: libssl3t64 (>= 3.0.0) 但无法安装它 依赖: libstdc++6 (>= 13.1) 但无法安装它 推荐: ca-certificates 但是它将不会被安装 coreutils : 预依赖: libgmp10 (>= 2:6.3.0+dfsg) 但无法安装它 预依赖: libssl3t64 (>= 3.0.0) 但无法安装它 dpkg : 预依赖: zlib1g (>= 1:1.1.4) 但无法安装它 libgcc-s1 : 依赖: gcc-14-base (= 14.2.0-17) 但无法安装它 破坏: libgcc-s1:i386 (!= 14.2.0-17) 但是 14.2.0-4ubuntu2 正要被安装 libgcc-s1:i386 : 破坏: libgcc-s1 (!= 14.2.0-4ubuntu2) 但是 14.2.0-17 正要被安装 python3 : 预依赖: python3-minimal (= 3.13.1-2) 但是它将不会被安装 依赖: python3.13 (>= 3.13.1-1~) 但是它将不会被安装 依赖: libpython3-stdlib (= 3.13.1-2) 但是它将不会被安装 shim-signed : 依赖: grub-efi-amd64-signed (>= 1.204~) 但是它将不会被安装 或 grub-efi-arm64-signed (>= 1.204~) 但无法安装它 依赖: grub2-common (>= 2.04-1ubuntu24) 但是它将不会被安装 依赖: mokutil (>= 0.3.0+1538710437.fb6250f-0ubuntu2) 但是它将不会被安装 依赖: sbsigntool 但是它将不会被安装 推荐: secureboot-db 但是它将不会被安装 错误: 错误,pkgProblemResolver::Resolve 发生故障,这可能是有软件包被要求保持现状的缘故。 错误: The following information from --solver 3.0 may provide additional context: Unable to satisfy dependencies. Reached two conflicting decisions: 1. libc6:i386 is selected for install because: 1. wine32:i386=9.0~repack-4build3 is selected for install 2. wine32:i386 依赖 libc6:i386 (>= 2.38) 2. libc6:i386 依赖 libgcc-s1:i386 but none of the choices are installable: - libgcc-s1:i386 is not selected for install because: 1. libgcc-s1:amd64 is selected for install 2. libgcc-s1:i386 破坏 libgcc-s1 (!= 14.2.0-4ubuntu2) For context, additional choices that could not be installed: * In libgcc-s1:amd64 -> | libgcc-s1:amd64=14.2.0-17 | libgcc-s
03-26
### 解决方案 在 Ubuntu 上安装 `wine32` 时遇到的依赖问题通常与架构支持或库版本不匹配有关。以下是详细的解决方案: #### 1. 启用多架构支持 如果尚未启用 i386 架构的支持,则需要通过以下命令添加它[^4]: ```bash sudo dpkg --add-architecture i386 ``` 执行此操作后,更新 APT 缓存以确保系统能够识别新的架构: ```bash sudo apt update ``` #### 2. 安装必要的依赖项 某些情况下,可能缺少特定的工具来完成安装过程。例如,`zenity` 是一个常用的图形化工具,可以辅助 Wine 的交互功能。可以通过以下命令安装这些工具: ```bash sudo apt install zenity -y ``` #### 3. 处理具体依赖冲突 对于提到的 `libgcc-s1` 和 `libc6:i386` 冲突问题,建议尝试强制重新安装这些基础库。这有助于解决潜在的版本兼容性问题: ```bash sudo apt install --reinstall libgcc-s1:i386 libc6:i386 ``` 如果上述方法仍然无法解决问题,可手动清理并重置 APT 状态: ```bash sudo apt clean sudo rm -rf /var/lib/apt/lists/* sudo apt update ``` #### 4. 尝试安装 `wine32` 最后再次运行安装命令,观察是否有改进效果: ```bash sudo apt install -y wine32 ``` 若仍存在未满足的依赖关系,可通过查看具体的错误日志进一步分析原因。 --- ### 注意事项 - 如果目标环境为较新版本的 Ubuntu(如 20.04 或更高),可能会因为官方仓库策略调整而导致部分旧版软件不可用。此时推荐考虑使用 PPA 源或其他第三方资源替代默认源[^2]。 - 对于长期维护需求较高的生产环境而言,应优先选用 LTS 长期支持版本而非短期发布版本(如 17.04 已停止支持)。这样能减少因过时而引发的技术难题概率[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KylinDemons.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值