ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

UEFI Secure Boot下NVIDIA驱动安装与MOK签名完整指南

UEFI Secure Boot下NVIDIA驱动安装与MOK签名完整指南 每次在UEFI安全启动模式下给Ubuntu装NVIDIA显卡驱动总有人卡在同一个地方——驱动装完了重启之后nvidia-smi却直接给你脸色看报错“couldnt communicate with the NVIDIA driver”仿佛你刚才装了个寂寞。如果从头倒推你会发现九成原因都出在UEFI安全启动Secure Boot上。Secure Boot这个功能本身是为了防住恶意引导程序和早期启动阶段的可疑代码结果它把关卡得太严把NVIDIA这种闭源内核模块也当成了“可疑对象”直接拒绝加载。于是你的显卡就像一张“僵尸卡”系统正常跑但GPU加速完全没启用。这篇文章就把这条链路完整拆开从Secure Boot原理讲起到MOK签名、驱动安装、重启验证再到各种报错排查全部用手把手的方式走一遍。无论你用的是Ubuntu 20.04、22.04还是24.04整个流程的核心逻辑是一样的命令上只有细微差别。适合刚刚接触Linux、对“安全启动”一头雾水的朋友也适合已经折腾过好几次、就差重启后那一步“MOK注册”的人。1. 为什么UEFI安全启动会让NVIDIA驱动“装上却用不了”1.1 Secure Boot到底在保护什么要搞清楚这个问题得先理解Secure Boot的定位。传统BIOS启动电脑时开机固件会直接去找引导程序只要引导程序存在就无脑执行中间没有任何校验环节。这意味着一个恶意程序只要能把自己写到引导区域开机时就能抢在系统之前运行后续所有安全措施都可能被绕过。UEFI安全启动相当于在引导链路上加了关卡固件只允许执行携带有效数字签名的引导程序。从固件到引导管理器再到操作系统内核每一环都需要验证签名。Ubuntu的引导程序之所以能在绝大多数OEM机器上正常启动是因为Ubuntu官方和微软之间有签名认证shim引导文件带有有效签名机器信任了shimshim再去引导后续的GRUB和内核。这个机制设计得没问题问题在于当你想往系统里塞一个“第三方闭源内核模块”时Secure Boot会问“这玩意儿有签名吗我认识它吗”。NVIDIA驱动默认没有进入任何系统固件的白名单自然就被拦在了内核加载阶段。1.2 NVIDIA闭源驱动为什么会被拦截NVIDIA显卡驱动在Linux下的运行机制是加载一个内核模块nvidia.ko它运行在内核态负责GPU硬件的底层控制和显存管理用户态的libnvidia-gl、nvidia-smi这些工具都要通过它才能和显卡交互。问题就出在这个nvidia.ko身上。它是NVIDIA编译出来的二进制模块NVIDIA没有把它的签名公开验证链放到你的固件里系统固件也不认识它。Secure Boot开启时内核拒绝加载任何未经签名的模块于是驱动虽然在文件系统里装好了但真正的“发动机”根本没点火。很多人会在这一步选择“偷懒方案”——进BIOS把Secure Boot关掉然后一切顺利。说实话这也是我一直推荐给急用机器的临时办法但它有两个问题一是部分机型的BIOS选项藏得深关掉后系统会显示“Secure Boot被禁用”的安全警告二是在有些版本的Windows 11预装机上关闭Secure Boot可能影响Windows的启动或后续更新。所以能在“不关Secure Boot”的前提下把驱动装上才是最优雅的解法。1.3 解锁钥匙MOK签名机制Ubuntu早就想到了这个场景所以提供了MOKMachine Owner Key机器所有者密钥机制。MOK可以理解成“你自己给自己签发的通行证”流程是这样系统生成一对公私钥私钥留在本机用私钥给NVIDIA模块签名把公钥证书导入到机器的MOK列表里重启时UEFI固件会在“MOK管理界面”让你确认是否信任这个公钥确认之后固件记住这枚证书以后凡是这个证书签名的模块Secure Boot都会放行。整个过程相当于你自己创建了一个“本地认证中心”然后告诉主板“我签的东西你可以信”。MOK不是Ubuntu独有的很多需要加载闭源驱动的Linux发行版都有类似方案。理解了这一层后面安装时的那些提示就都顺理成章了。2. 安装前把这三件事搞清楚能省一大半折腾时间2.1 确认系统版本、内核和Secure Boot状态不要一上来就装驱动先花五分钟摸清机器当前的状态。打开终端依次执行下面几条命令先把信息记录下来# 查看Ubuntu版本 lsb_release -a # 查看当前内核版本 uname -r # 查看显卡型号 lspci | grep -i nvidia # 确认Secure Boot当前的开启状态 mokutil --sb-state其中mokutil --sb-state很关键。如果输出是SecureBoot enabled那说明你正处于我们要讨论的“UEFI安全启动模式”下继续往下看如果输出是SecureBoot disabled那你直接装驱动就行不需要签名但也别跳着看因为你迟早会碰到装完驱动后内核升级导致失效的问题。另外建议顺手确认一下BIOS里的启动模式确实是UEFI而不是Legacy。可以用这个命令[ -d /sys/firmware/efi ] echo UEFI mode || echo Legacy mode如果是Legacy模式MOK机制大概率不会参与引导流程后面的操作需要换成别的思路。我见过一些老机器比如Dell XPS系列刷了支持UEFI的魔改BIOS后实际上是“UEFICSM兼容”混着用这时候Secure Boot的实际行为比较迷还是先手动关掉再装驱动最稳妥。2.2 怎么选驱动版本官方推荐和实际需求的取舍装驱动最怕的就是闭眼装最新版。NVIDIA驱动的版本号一直在滚动更新但并不是越新越适合你。Ubuntu的软件源里其实维护了一份“经过验证的驱动版本列表”优先看这里的推荐版本基本不会出大问题。# 查看Ubuntu推荐的驱动版本 ubuntu-drivers devices这条命令会扫描你的显卡列出可用的驱动包通常带recommended标记的那个就是最稳的选择。比如我的RTX 3080上显示的是nvidia-driver-550我就直接装550不折腾565、570这些更“新”的版本。如果你有CUDA开发需求情况会稍微复杂一些你需要先确定CUDA版本再去NVIDIA官网找对应支持的最低驱动版本然后装那个驱动。比如CUDA 12.x通常要求驱动版本不低于525CUDA 13.0则可能要求更新一些的驱动。这种情况下Ubuntu源里的“recommended”不一定符合你的需求就得走官方.run文件安装的路线也就是后面要讲的方案B。有一类特殊情况笔记本双显卡Intel集显NVIDIA独显。这类机器上我建议优先尝试Ubuntu源里的驱动因为Ubuntu的驱动包会自动配置好prime-select切换工具用起来省心不少。而官方.run文件在Optimus笔记本上需要额外配置新手容易翻车。2.3 关于Nouveau开源驱动别再手动乱禁了以前网上的Ubuntu装NVIDIA教程开头第一步永远是“禁用Nouveau”然后让你改/etc/modprobe.d/blacklist.conf把开源的Nouveau驱动拉黑最后还要重建initramfs。这件事在以前确实非做不可因为Nouveau这个开源驱动的加载会占住显卡导致NVIDIA闭源驱动加载失败。但现在新版Ubuntu里的NVIDIA驱动包无论是通过“软件和更新”安装还是通过官方.run安装在安装过程中都会自动处理Nouveau的冲突问题不需要手动去改配置文件。我自己实测下来的经验是在Ubuntu 22.04和24.04上直接运行官方.run文件安装器会明确弹出提示“检测到Nouveau正在运行需要禁用它并重启”然后它会自动帮你写blacklist配置你只需确认即可。如果你提前手动改过blacklist反而可能和安装器的自动逻辑冲突得不偿失。所以这一步的原则就一句话先别动Nouveau等安装器提示了再让它自己处理。实在要手动干预也等安装出问题再排查。3. 两种安装方案按场景选就行3.1 方案A用Ubuntu自带的“额外驱动”安装适合大多数人这是我最推荐新手走的路因为整个流程和MOK签名的结合做得最顺滑。最开始用图形界面操作路径是设置 - 软件和更新 - 附加驱动Additional Drivers系统会自动扫描显卡并列出可用的驱动版本选中你想要的版本点击“应用更改”即可。但我平时更喜欢用命令行因为能看得更清楚发生了什么# 更新软件源 sudo apt update # 查看可用驱动 ubuntu-drivers devices # 直接安装系统推荐的驱动 sudo ubuntu-drivers install如果想要指定版本也可以手动装sudo apt install nvidia-driver-550这里有一个非常关键的细节安装过程中终端可能会弹出“设置MOK密码”的界面让你输入一个至少8位的密码。这个密码不是让你登录用的而是用于重启后的MOK确认。这一步千万别跳过也别随意按回车跳过否则驱动装完照样加载不了。装完后先别着急重启心里默念一下刚才设置的MOK密码然后执行sudo reboot重启后电脑不会直接进入系统而是进入一个蓝色的“MOK管理界面”可能让选择Enroll MOK、Continue boot、Change Secure Boot state等选项这时候直接用方向键选择Enroll MOK回车接着会问你是否继续再回车然后输入刚才设置的密码最后选择Reboot确认。之后电脑再次重启驱动才会被真正加载。3.2 方案B用NVIDIA官方.run文件安装适合对版本有特殊要求的人如果你要用CUDA 13、或者需要某个特定版本驱动Ubuntu源里没有那就只能走官方.run文件这条路线了。这个路线在Secure Boot下的坑多一些但理解了MOK原理后也没那么吓人。先去 NVIDIA官网驱动下载页面 选好自己的显卡型号和操作系统下载对应版本的.run文件。假设下载到了NVIDIA-Linux-x86_64-550.144.03.run接下来# 安装编译环境和内核头文件 sudo apt install build-essential dkms linux-headers-$(uname -r) # 给.run文件加执行权限 chmod x NVIDIA-Linux-x86_64-550.144.03.run # 运行安装 sudo ./NVIDIA-Linux-x86_64-550.144.03.run运行后会进入一个文本引导界面一路确认就好。有几个选项要注意出现“Would you like to run nvidia-xconfig?”时选Yes出现“Install NVIDIAs 32-bit compatibility libraries?”时看个人需要日常游戏还是选Yes出现“Would you like to register the kernel module sources with DKMS?”时一定要选Yes这关系到以后内核升级后驱动自动重编译。最关键的一步就在这里如果系统检测到Secure Boot处于开启状态安装器会提示设置MOK密码流程和方案A类似。但有些版本的.run安装器并不会有这个提示它只会在最后告诉你“模块已被签名但需要手动导入MOK密钥”。这时候就要完全手动操作了。先手动生成密钥并导入MOK# 生成私钥和证书 sudo openssl req -new -x509 -newkey rsa:2048 -keyout /root/signing_key.priv -outform DER -out /root/signing_key.der -nodes -days 36500 -subj /CNMyOwnDriverSigningKey/ # 把证书导入MOK列表会要求设置一个MOK密码 sudo mokutil --import /root/signing_key.der注意这里的mokutil --import会让你设置MOK密码记住它重启后会用到。导入完成后先别急着新开安装程序我们需要手动给NVIDIA生成的模块签名。如果你已经把驱动装好了但发现nvidia.ko没签名可以找到模块文件再签# 先找到安装好的nvidia.ko find /lib/modules/$(uname -r) -name nvidia.ko # 假设路径是 /lib/modules/$(uname -r)/updates/dkms/nvidia.ko # 对模块签名 sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 /root/signing_key.priv /root/signing_key.der /lib/modules/$(uname -r)/updates/dkms/nvidia.ko这一步做完后重启进入MOK管理界面注册公钥之后驱动就能正常加载了。3.3 MOK注册实操重启后那个蓝色界面到底怎么选很多人在重启后看到蓝色全屏界面就慌了其实它就是一个简单的交互工具选项不多中文用户可能看到的还是英文。我遇到的界面通常长这样Enroll MOK注册密钥Enroll key from disk从磁盘导入密钥Continue boot不注册继续启动我们要选第一项Enroll MOK。选定后进入子菜单再选Continue然后它会提示Enroll the key(s)?选Yes接着要求输入你之前设置的MOK密码。密码输入正确后会看到提示Saving...然后跳到最终页面选Reboot电脑重启后整个签名流程就闭环了。有个坑必须提一下MOK界面里的密码输入次数有限制好像是三次机会输错三次会直接继续启动。这不会对系统造成破坏只是驱动仍然加载不了。解决方法是重新执行一次sudo mokutil --import导入新的MOK请求再重启注册。还有一个易错点有些人设置的MOK密码在键盘上大小写没问题但MOK界面默认是美国键盘布局如果你的密码里有特殊字符比如、#可能会因为键盘布局不同而输入不对。我自己吃过这个亏后来索性把MOK密码设置成全小写字母加数字的组合省得折腾。4. 安装完成后的验证与常见“假死”状态4.1 别只看nvidia-smi先确认内核模块真的加载了装完驱动后第一件事当然是跑一下nvidia-smi看到下面这样的输出就代表驱动生效了。--------------------------------------------------------------------------------------- | NVIDIA-SMI 550.144.03 Driver Version: 550.144.03 CUDA Version: 12.4 | |--------------------------------------------------------------------------- | | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |但nvidia-smi正常只是入门想确认驱动真的被内核加载了建议再执行# 查看内核是否加载nvidia相关模块 lsmod | grep nvidia # 查看nvidia模块的签名信息 modinfo nvidia | grep signer # 查看DKMS状态对用DKMS安装的方式会有记录 dkms statusmodinfo nvidia | grep signer这行命令能直接显示模块签名者的名称如果显示MyOwnDriverSigningKey或者你设置的其他CN说明签名成功了Secure Boot已经放行。如果这条命令没有输出说明这个模块根本没有签名下一步就准备排查吧。4.2 用日志和工具定位“驱动装了但没生效”如果nvidia-smi报错先看内核日志这一步能省去99%的猜谜环节# 查看内核日志中与nvidia相关的报错 sudo dmesg | grep -i nvidia常见的报错有两类。一类是module verification failed: signature and/or required key missing这基本就是模块没签名解决方法看上面第3节。另一类是symbol not found或unknown symbol这通常是驱动版本和内核版本不匹配比如你用一个特别老的驱动强行装在新内核上只能换驱动版本。还有一种情况是Failed to initialize the NVIDIA kernel module这多半和驱动本身无关而是显卡被Nouveau占着。可以用lsmod | grep nouveau看看如果有输出需要禁用Nouveau后重建initramfs再重启sudo bash -c echo blacklist nouveau /etc/modprobe.d/blacklist-nouveau.conf sudo update-initramfs -u sudo reboot4.3 重启黑屏或登录循环怎么办装完驱动后重启黑屏估计是每个人噩梦级别的体验。这里先深呼吸你要知道十有八九是可以救回来的。黑屏最常见的原因是驱动和当前内核不完全兼容导致Xorg或Wayland启动失败。解决办法是先进入文本模式TTY按住CtrlAltF2有些机器是F3-F6进入一个黑底白字的登录界面输入用户名密码登录。进去之后有两个选择如果只想快速恢复图形界面卸载刚装的驱动重来sudo apt purge nvidia-* sudo apt install --reinstall ubuntu-desktop sudo reboot如果想先看看能不能修复检查一下Xorg的日志cat /var/log/Xorg.0.log | grep -i nvidia cat /var/log/Xorg.0.log | grep -i EE如果报错集中在EEError行的显示输出多半还是驱动和显卡不匹配建议换成Ubuntu源里的推荐版本重装。如果只是登录循环输密码后回到登录界面可以试试在登录界面选择“Ubuntu on Xorg”而非默认的“Ubuntu”Wayland有时候驱动在Xorg下就是正常的。5. 内核升级后驱动失效的终极解决方案5.1 DKMS签名链让模块在每一次内核更新后自动签名装好驱动后最怕的就是某天更新系统内核升级了开机后驱动又没了。原因是新内核不再自动加载旧内核编译的nvidia.ko必须针对新内核重新编译模块。DKMSDynamic Kernel Module Support就是为了解决这个问题而存在的。它在你安装驱动时把驱动源码注册到DKMS框架里每当内核升级时DKMS自动为新的内核重新编译模块。但这里有个坑DKMS自动编译出的新模块是没有签名的Secure Boot开启的情况下新模块照样被拒绝加载。这就是为什么很多人内核升级后重新运行一遍NVIDIA安装器又好了因为安装器会重新签名。解决的办法是把我们的签名密钥配置到DKMS里让DKMS每次编译完模块后自动签名。编辑配置文件sudo nano /etc/dkms/framework.conf在文件末尾追加两行mok_signing_key/root/signing_key.priv mok_certificate/root/signing_key.der保存退出。之后每次内核升级DKMS都会用这把私钥自动给新编译的nvidia.ko签名。因为公钥已经在MOK列表里注册过了所以Secure Boot会直接放行你甚至不需要再重启进入MOK界面。使用方案A通过apt install nvidia-driver-550安装的驱动默认使用的签名密钥路径是/var/lib/shim-signed/mok/下自动生成的DKMS配置一般也已经自动写好了。但如果你用的是官方.run文件安装务必自己配好这段。5.2 已经失效了怎么快速恢复如果内核升级后驱动已经挂了按照下面的顺序操作基本都能救回来# 查看当前内核 uname -r # 查看DKMS注册的模块状态 dkms status如果状态显示installed但驱动还是加载失败大概率是签名丢了。重新签一遍# 找到新内核对应的nvidia.ko find /lib/modules/$(uname -r) -name nvidia.ko假设路径是/lib/modules/$(uname -r)/updates/dkms/nvidia.ko执行签名命令sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 /root/signing_key.priv /root/signing_key.der /lib/modules/$(uname -r)/updates/dkms/nvidia.ko然后重启基本就能恢复。6. 常见问题速查表与最后的避坑心得6.1 高频问题速查表故障现象可能原因处理方法nvidia-smi报“couldnt communicate with the NVIDIA driver”Secure Boot拦截、Nouveau冲突、模块未签名查看dmesg确认具体原因注册MOK或禁用Nouveau重启后进入蓝屏MOK界面不知道选什么正常现象驱动安装过程中触发了MOK请求选Enroll MOK输入安装时设置的密码重启黑屏驱动版本不适配、Xorg配置异常进TTYpurge驱动重装或换系统推荐版本登录循环Wayland会话和NVIDIA驱动冲突在登录界面切换Xorg会话或重装gdm内核升级后驱动失效DKMS未自动签名配置framework.conf用sign-file手动签名后重启Ubuntu源里找不到驱动未启用restricted和multiverse源sudo add-apt-repository restricted universe multiverse卸载不干净驱动残留部分包未被清理sudo apt purge nvidia-*再sudo apt autoremove老笔记本BIOS里开启UEFI后启动异常CSM和Secure Boot组合模式怪异直接关闭Secure Boot装驱动或更新BIOS到最新版6.2 几个我最后想单独拎出来讲的坑你们在搜索引擎里可能会看到各种“终极解决办法”我自己实测下来很多都是旧时代的遗留方案。比如有人让你改grub配置加nomodeset参数这通常解决的是内核早期的显示问题不是在驱动安装后生效的又比如有人让你用nvidia-xconfig重新生成xorg.conf这在Wayland为主流的Ubuntu 22.04上已经没有太大意义。真正值得单独拎出来讲的是“驱动卸载”这件事。很多人装了又卸、卸了又装但从来没有真正卸载干净导致后面装新驱动时总出怪毛病。官方.run安装的驱动和apt安装的驱动卸载方式不一样很容易搞混apt安装的sudo apt purge nvidia-*然后sudo apt autoremove.run安装的sudo ./NVIDIA-Linux-x86_64-550.144.03.run --uninstall如果两种方式都用过建议先purge一遍再去.run的目录里执行--uninstall最后检查一下残留dpkg -l | grep -i nvidia ls /lib/modules/$(uname -r)/updates/dkms/ 2/dev/null有残留就手动删掉再到/usr/src/下看看有没有旧的nvidia-xxx目录一并清理确保系统干干净净。另外还有一个被很多人忽略的问题MOK密码设置得太复杂导致忘记或者键盘布局导致输入失败。如果你在MOK界面折腾半天还是进不了系统别慌先选“Continue boot”继续正常启动然后用sudo mokutil --import重新导入一个新的MOK请求设置一个新的简单密码再次重启重新注册就行。MOK本身不存储密码它只负责在UEFI的NVRAM里写入一条公钥记录所以反复导入并不会把系统搞坏。我在实际过程中还有个习惯驱动装好后会立刻做一次“重启压力测试”。如果机器有多个操作系统比如Windows和Ubuntu双系统装完驱动后两边都进去一次确认引导菜单没有被破坏、Windows还能正常启动。某些Dell、联想的老机型在开启Secure Boot时如果内核模块签名步骤出现异常会导致UEFI启动项错乱重启后直接进BIOS设置界面。遇到这种情况用efibootmgr检查启动项顺序手动把Ubuntu的shimx64.efi加回去就能解决。6.3 最后的体验总结折腾了这么多我的总体建议是不要为了“新版驱动”而冒险Ubuntu软件源里带recommended标记的驱动是Ubuntu团队在多种硬件组合下测试过的版本稳定性和兼容性都最有保障。尤其是你买新显卡后装驱动一定要先看看ubuntu-drivers devices推荐的是什么千万别一上来就装官网最顶配的新版。也许你会觉得MOK签名流程烦但在2024年这个时间点UEFI安全启动已经是多数电脑默认开启的状态了与其每次绕过它不如花点时间把MOK这个机制完全搞懂。我在帮人处理这个问题时经常说一句话Secure Boot不是你的敌人它只是一个尽职尽责的安检员。你给它看一个它认识的证件它就会放行。MOK签名就是你自己给自己办的那个证件。如果以后你遇到“NVIDIA驱动装了、系统重启了、屏幕黑了”这种问题先别急着把锅甩给显卡。按顺序检查三件事dmesg里有没有签名相关的报错lsmod | grep nvidia有没有输出dkms status是不是正常。这三步查完90%的问题都能定位到方向剩下的就是按表操作而已。
返回列表