Fedora 38/39 上搞定 NVIDIA 驱动签名:UEFI 安全启动不再是拦路虎 Fedora 38/39 上搞定 NVIDIA 驱动签名UEFI 安全启动不再是拦路虎在 Linux 世界中使用 NVIDIA 显卡一直是个充满挑战的话题尤其是当 UEFI 安全启动Secure Boot介入时。本文将带你深入理解 Fedora 38/39 系统中 NVIDIA 驱动签名的核心机制并提供一套完整的解决方案让你不再被安全启动拦在门外。1. 理解 UEFI 安全启动与驱动签名的关系现代计算机系统的安全机制越来越复杂UEFI 安全启动就是其中重要的一环。这项技术通过在系统启动过程中验证所有加载组件的数字签名来防止恶意软件的入侵。听起来很美好对吧但当你尝试在 Fedora 上安装 NVIDIA 专有驱动时这个安全特性就变成了一个令人头疼的障碍。为什么安全启动会阻止 NVIDIA 驱动内核模块签名验证当安全启动启用时Linux 内核会强制验证所有加载的内核模块的签名信任链机制只有由系统信任的密钥签名的模块才能被加载NVIDIA 驱动特殊性作为第三方内核模块NVIDIA 驱动默认没有你的系统信任的签名提示安全启动不是敌人它是保护系统免受rootkit等低级恶意软件侵害的重要防线。我们的目标不是关闭它而是学会与之和谐共处。2. 准备工作搭建签名环境在开始签名之旅前我们需要确保系统具备必要的工具链。以下是在 Fedora 38/39 上需要安装的软件包sudo dnf install -y kernel-devel kernel-headers gcc make dkms mokutil openssl这些软件包的作用如下表所示软件包功能描述kernel-devel提供内核开发头文件用于模块编译gccGNU 编译器集合用于构建内核模块make构建自动化工具dkms动态内核模块支持框架mokutil管理机器所有者密钥(MOK)的工具openssl生成和管理数字证书重要注意事项确保你的内核版本与kernel-devel包版本完全一致推荐使用最新的稳定版内核避免使用正在开发中的内核版本如果使用自定义编译的内核需要额外安装对应的内核源码包3. 生成和注册签名密钥这是整个过程中最关键的一步。我们将创建一个属于你自己的签名密钥并将其注册到系统的信任链中。3.1 创建密钥对首先使用openssl生成一个RSA密钥对openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj /CNMy NVIDIA Driver Key/这条命令会生成两个文件MOK.priv私钥文件用于签名内核模块MOK.der公钥证书需要导入到系统的信任数据库中警告私钥文件(MOK.priv)是你的数字身份证明应当妥善保管。任何获得这个文件的人都可以用它签名恶意模块并加载到你的系统中。3.2 导入密钥到系统接下来我们需要将公钥证书导入到UEFI的MOKMachine Owner Key数据库中sudo mokutil --import MOK.der执行此命令后系统会提示你设置一个一次性密码。务必记住这个密码因为在下次重启时需要使用它来完成密钥注册。4. 安装并签名NVIDIA驱动有了密钥准备后我们现在可以安装NVIDIA驱动并进行签名了。4.1 下载官方驱动访问NVIDIA官方网站下载适合你显卡的最新Linux驱动。建议选择长期支持分支以获得更好的稳定性。wget https://us.download.nvidia.com/XFree86/Linux-x86_64/535.154.02/NVIDIA-Linux-x86_64-535.154.02.run chmod x NVIDIA-Linux-x86_64-*.run4.2 安装驱动并签名在安装过程中当被询问是否要签名内核模块时选择Sign the kernel module然后使用我们之前生成的密钥sudo ./NVIDIA-Linux-x86_64-*.run --module-signing-secret-keyMOK.priv --module-signing-public-keyMOK.der安装程序会自动使用你提供的密钥对NVIDIA内核模块进行签名。整个过程可能需要几分钟时间具体取决于你的系统性能。5. 完成密钥注册安装完成后重启系统。你会看到一个蓝色的MOK管理界面可能因主板厂商不同而有所差异。按照以下步骤操作选择Enroll MOK选择Continue选择Yes确认注册输入之前设置的密码选择Reboot完成注册常见问题解决如果看不到MOK界面可能是启动速度太快尝试在启动时反复按Esc或Enter键密码输入错误超过3次会导致注册失败需要重新运行mokutil --import某些主板可能需要先在UEFI设置中开启Custom Key Enrollment选项6. 验证驱动加载系统重启后可以通过以下命令验证NVIDIA驱动是否正常加载lsmod | grep nvidia nvidia-smi如果一切正常你应该能看到类似如下的输出nvidia_uvm 1474560 0 nvidia_drm 73728 2 nvidia_modeset 1228800 3 nvidia_drm nvidia 39010304 83 nvidia_uvm,nvidia_modeset而nvidia-smi会显示你的显卡信息和当前负载情况。7. 维护与更新随着时间的推移你可能需要更新内核或NVIDIA驱动。以下是几个常见场景的处理方法7.1 内核更新后的处理当系统更新内核后需要重新构建并签名NVIDIA模块sudo dkms install -m nvidia -v $(modinfo -F version nvidia) sudo /usr/lib/nvidia/sign-nvidia-for-secureboot7.2 驱动版本升级升级NVIDIA驱动版本时建议先卸载旧版本再安装新版本sudo nvidia-uninstall sudo ./NVIDIA-Linux-x86_64-*.run --module-signing-secret-keyMOK.priv --module-signing-public-keyMOK.der7.3 密钥轮换出于安全考虑建议每年轮换一次签名密钥生成新的密钥对使用新密钥签名现有模块注册新密钥到MOK删除旧密钥的注册可选8. 高级技巧与故障排除8.1 多显卡系统配置对于同时拥有集成显卡和NVIDIA显卡的系统你可能需要配置Prime选择sudo dnf install -y akmod-nvidia xorg-x11-drv-nvidia-cuda sudo prime-select nvidia8.2 Wayland支持从Fedora 38开始Wayland成为默认显示服务器。要获得最佳兼容性确保使用NVIDIA 470或更高版本驱动在/etc/gdm/custom.conf中设置WaylandEnabletrue安装必要的Wayland组件sudo dnf install -y egl-wayland8.3 常见错误解决错误1NVIDIA kernel module missing解决方案检查内核头文件是否安装重新运行dkms构建确认签名过程没有错误错误2Failed to load module nvidia-drm解决方案检查安全启动状态mokutil --sb-state重新导入并注册密钥确保没有多个冲突的NVIDIA驱动版本错误3Xorg/Wayland无法启动解决方案切换到虚拟终端(CtrlAltF2)检查日志journalctl -xe尝试使用开源驱动启动sudo systemctl set-default graphical.target --force9. 安全最佳实践虽然我们绕过了安全启动的限制但仍应遵循以下安全原则密钥管理将MOK.priv存储在加密的USB驱动器中不要将私钥留在系统硬盘上考虑使用硬件安全模块(HSM)存储密钥模块验证定期验证已加载模块的签名状态modinfo -F sig_key 模块名设置内核参数module.sig_enforce1强制所有模块必须签名系统监控使用完整性检查工具如AIDE或Tripwire监控内核模块加载事件auditctl -w /lib/modules -p wa -k modules10. 性能调优建议为了让NVIDIA显卡发挥最佳性能可以考虑以下调整内核参数优化 在/etc/default/grub的GRUB_CMDLINE_LINUX中添加nvidia-drm.modeset1 mitigationsoff然后更新grub配置sudo grub2-mkconfig -o /boot/grub2/grub.cfg电源管理设置 对于笔记本用户可以设置性能模式sudo nvidia-smi -pm 1 sudo nvidia-smi -pl 125 # 设置功率限制单位是瓦特OpenGL设置 在/etc/environment中添加__GL_THREADED_OPTIMIZATIONS1 __GL_SYNC_TO_VBLANK0经过这些步骤你的Fedora系统应该能够完美支持NVIDIA显卡同时保持UEFI安全启动的启用状态。这不仅提供了更好的安全性也为未来可能需要的企业环境兼容性打下了基础。