拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Ubuntu 24.04 NVIDIA驱动安装与排错:DKMS内核模块指南

不夸张地说我在 Ubuntu 24.04 上装 NVIDIA 驱动前前后后折腾了快一个晚上。升级完系统第一次跑nvidia-smi就直接给我来了一句couldnt communicate with the NVIDIA driver心里那个凉。后来又是黑屏、登录循环、Xorg 报错一个接一个。这篇文章我把自己在 Ubuntu 24.04、23.10 这类较新版本上踩过的坑、试出来的路子按完整流程整理出来。不管你是刚装好系统准备装驱动还是装完已经翻车在找救命稻草这篇应该都能给你省下不少时间。1. 新版本 Ubuntu 装 NVIDIA 驱动到底难在哪1.1 内核越新驱动模块被卡住的概率越高Ubuntu 24.04 LTS 默认带的是 6.8 内核23.10 是 6.5 内核。对普通人来说内核新一点是好事硬件兼容性更好但对 NVIDIA 闭源驱动来说新内核往往意味着新的麻烦。NVIDIA 驱动并不是一个复制进去就能用的二进制文件它在安装时要把nvidia.ko、nvidia_drm.ko、nvidia_modeset.ko这些内核模块针对当前内核版本重新编译一次。如果官方驱动还没适配最新内核的 API编译就会失败模块装不上自然nvidia-smi就找不到驱动。另外一个隐藏问题是编译器。Ubuntu 24.04 自带的 gcc 已经是 13.x部分旧版 NVIDIA 驱动比如 470、535 的某些小版本在 6.8 内核 gcc 13 的组合下编译期会报一些警告升级成错误的问题。这也是为什么同样的安装命令在 22.04 上一点事没有换到 24.04 就各种失败。理解了这一层你就明白为什么解决较新版本 Ubuntu 的驱动问题不能只靠网上老教程里的“三条命令搞定”。1.2 常见报错对号入座先别急着重装系统很多人一看到nvidia-smi报错或者开机黑屏第一反应是卸载重装或者干脆重做系统。其实大部分问题都有明确的指向性先判断是哪一类再对症下药效率会高很多。我列出这段时间高频遇到的几类错误错误 / 现象出现场景主要嫌疑nvidia-smi has failed because it couldnt communicate with the NVIDIA driver刚装完驱动或升级内核后内核模块未加载、Secure Boot 拦截、DKMS 编译失败(EE) NVIDIA: Failed to load module glxserver_nvidia进桌面时 Xorg 日志报错驱动安装不完整、Xorg 与驱动版本不匹配登录界面死循环输入密码又回到登录页装完驱动重启后GDM 与 NVIDIA GLX 冲突、Xorg 崩溃开机直接黑屏只剩光标重启后进桌面阶段nouveau 冲突、nvidia-drm.modeset1搭配问题DKMS build 过程报错安装驱动或内核升级时缺内核头文件、gcc 版本不对、源码与内核 API 不兼容需要注意同一个现象可能由不同原因引起。比如nvidia-smi通信失败可能是模块没加载也可能是 Secure Boot 把模块拒了。所以后面每一步排查我都会说清楚怎么看日志、怎么确认具体原因而不是盲目跑命令。2. 准备阶段三件事不做后面全是坑2.1 确认显卡型号和推荐驱动版本动手前先做点侦查。终端里执行lspci | grep -i nvidia输出会告诉你显卡型号比如GA106 [GeForce RTX 3060 Lite Hash Rate]。然后执行ubuntu-drivers devices这个命令是 Ubuntu 官方提供的驱动检测工具会列出当前硬件可用的驱动并标出哪个是推荐版本。正常情况下你会看到这样一段driver : nvidia-driver-550 - third-party non-free recommended看到 recommended 基本就不用纠结版本直接装它。如果你的机器是 NVIDIA 笔记本 Intel 核显的混合架构检测结果可能会显示多个可用驱动此时优先选推荐的那个通常不会错。如果你有明确的 CUDA 版本要求再按 CUDA 官方文档核对该 CUDA 版本需要的驱动下限。2.2 先把系统更新到位内核头文件必须装这是我最想强调的一步。很多人拿着刚刻盘装好的 Ubuntu 24.04 镜像就直接ubuntu-drivers install然后莫名其妙失败其实很可能是系统镜像里的内核已经积累了几个小版本的修复但你没有升级。先把基础打好sudo apt update sudo apt upgrade -y sudo reboot重启后确认内核版本uname -r比如输出6.8.0-47-generic。接下来必须安装当前内核对应的头文件这是 DKMS 编译 NVIDIA 内核模块的硬性依赖sudo apt install -y build-essential linux-headers-$(uname -r)我见过太多人卡在 DKMS build 失败打开 make.log 一看第一行就是找不到linux/version.h这类文件。这就是典型的没装内核头文件。还有一点如果你手动换过内核或者用过主线内核 PPA要确保/usr/src/下的头文件目录和你uname -r的内核版本完全一致不一致就继续sudo apt install linux-headers-$(uname -r)补上。2.3 Secure Boot 要么关掉要么签好名这个话题在较新版本 Ubuntu 上极其重要。Secure Boot 开启时内核只加载有合法签名的模块。NVIDIA 闭源驱动默认没有 UEFI 签名所以即使模块编译成功系统也会拒绝加载。检查状态mokutil --sb-state如果输出SecureBoot enabled那你面临两个选择。一种是直接进 BIOS 关闭 Secure Boot。这个方法最干脆适合大多数个人电脑。不同厂商主板入口位置不一样一般在 Boot 或 Security 分类下找到 Secure Boot 设为 Disabled 保存重启即可。另一种是保持开启使用 MOKMachine Owner Key签名。在 apt 安装 NVIDIA 驱动的过程中终端会提示你设置一个 MOK 密码重启后会自动进入蓝色 MOK 管理界面选择Enroll MOK输入刚才设置的密码再重启系统才会信任这个驱动模块的签名。但很多人在这一步没看到终端提示就直接重启进去后发现驱动根本没生效然后又绕一大圈。如果你已经装完驱动才发现 Secure Boot 是开启的也可以主动导入签名sudo mokutil --import /var/lib/shim-signed/mok/MOK.der但我个人的实际建议是除非工作环境或安全策略强制要求否则装 NVIDIA 驱动的机器直接关掉 Secure Boot 省心得多。3. 三种安装方式怎么选以及各自的细节3.1 方法一ubuntu-drivers 自动安装最推荐这是 Ubuntu 官方推荐的路径也是我试下来最省心的方式。它会根据你的硬件自动匹配驱动版本同时把nvidia-settings、libnvidia-compute等配套包一起装好还自动处理 nouveau 冲突。sudo ubuntu-drivers install想指定版本也可以sudo ubuntu-drivers install nvidia:550装完重启sudo reboot重启后验证nvidia-smi正常会看到驱动版本、CUDA 版本、显存占用等信息。这种方式对新手最友好因为它走的是 Ubuntu 源和系统集成度高以后内核升级时 DKMS 也会自动重新编译模块不需要你手动介入。3.2 方法二直接用 apt 装指定版本有时候ubuntu-drivers devices没有正确显示推荐项或者你因为某个项目需要装特定版本那就直接用 aptapt search nvidia-driver | grep ^nvidia-driver先看看源里有哪些版本然后sudo apt install -y nvidia-driver-550这里注意一个细节Ubuntu 的 NVIDIA 驱动包命名是nvidia-driver-xxx其中 xxx 是驱动版本号。选版本时不要盲目选最新要看你显卡的架构和项目需求。老一点显卡比如 Maxwell、Pascal可以去源里找 legacy 分支比如nvidia-driver-470。新显卡则尽量选 535 或 550 这些较新的分支。另外不管哪种安装方式都建议主动确认 nouveau 被禁用。虽然 Ubuntu 装 NVIDIA 驱动时会自动处理但自己动手更保险sudo bash -c echo -e blacklist nouveau\noptions nouveau modeset0 /etc/modprobe.d/blacklist-nvidia-nouveau.conf sudo update-initramfs -u执行后可以用lsmod | grep nouveau检查是否还存在加载。确认没有 nouveau 了再重启否则装完还是可能被开源驱动干扰。3.3 方法三官方 .run 文件安装为什么我不太推荐NVIDIA 官网下载的NVIDIA-Linux-x86_64-550.xx.run不是不能用而是在 Ubuntu 上它和系统包管理集成度太差。用 .run 装完以后每次升级内核驱动模块不一定能自动重新编译同时如果 apt 里后来又装了其他 NVIDIA 相关包两个来源容易互相打架出现各种莫名其妙的问题。所以我一般把它作为备选方案只有当源里的驱动版本太老或者显卡太新需要发布会最新驱动时才考虑。如果你确实要用 .run这里有一套相对安全的流程按 CtrlAltF3 切换到文本终端。停止桌面管理器。GDM 是默认的执行sudo systemctl stop gdm如果你用的是 lightdm就停sudo systemctl stop lightdm。给 .run 文件加权限并安装chmod x NVIDIA-Linux-x86_64-550.xx.run sudo ./NVIDIA-Linux-x86_64-550.xx.run --no-opengl-files--no-opengl-files是我强烈建议加的参数。Ubuntu 桌面的 OpenGL 相关库和系统深耦合直接用官方安装包覆盖很容易引发登录循环或花屏。不加这个参数翻车概率很高。安装完后重建 initramfssudo update-initramfs -u重启sudo reboot还是那句话标准 Ubuntu 24.04/23.10 环境能用 apt 尽量 apt。.run 是最后选择。4. 装完翻车现场怎么定位怎么救4.1 nvidia-smi 报 couldnt communicate按这个顺序排查这个错误几乎人人都会遇到关键是不要一看报错就卸载重装。按下面的顺序查。先看模块有没有加载lsmod | grep nvidia如果为空说明内核里根本没有 NVIDIA 模块。再试着手动加载sudo modprobe nvidia如果报错是modprobe: ERROR: could not insert nvidia: Key was rejected by the service那基本就是 Secure Boot 在拦截回到第 2.3 节处理。如果报Unknown symbol或Invalid module format说明模块和当前内核不匹配大概率是内核升级后旧模块还在。再看内核日志dmesg | grep -i nvidia | tail -20 journalctl -k -b | grep -i nvidia如果出现nvidia: disagrees about version of symbol module_layout这一类信息说明模块是用其他内核版本编译的需要用 DKMS 针对当前内核重新编译。查看 DKMS 状态dkms status如果显示某个 NVIDIA 内核模块状态是failed去查看编译日志cat /var/lib/dkms/nvidia/550.xx/build/make.log | tail -50定位到错误后常见补救是补装内核头文件、调整 gcc 版本然后重新构建sudo dkms install nvidia/550.xx -k $(uname -r) sudo update-initramfs -u sudo reboot模块能加载但nvidia-smi还是失败的检查一下设备节点ls -l /dev/nvidia*如果设备节点不存在重新 modprobe 后一般会自动生成。另外如果你是在虚拟机里或者机器上根本没有 NVIDIA 物理显卡那当然报这个错排除硬件环境再看。4.2 登录循环、黑屏多半是 Xorg 和 GDM 的问题装完驱动重启卡在登录界面输密码又弹回来或者直接黑屏这是最让人崩溃的场景。别慌先切到文本终端按 CtrlAltF3 登录进去看这几类日志cat ~/.xsession-errors 2/dev/null | tail -50 journalctl -xe -u gdm | tail -50 grep -i EE /var/log/Xorg.0.log如果 Xorg 日志里能看到(EE) Failed to load module nvidia (module does not exist, 0)说明驱动模块压根没被 Xorg 加载。此时要回到第 4.1 节把内核模块层面解决掉再重启 Xorg。如果日志里没有明确的模块报错可以尝试重装驱动并更新 initramfssudo apt install --reinstall nvidia-driver-550 sudo update-initramfs -u还有一种常见情况是nvidia-drm.modeset1这个内核参数和桌面环境不兼容。如果你在 GRUB 里加了这个参数或者系统自动生成时带上了尝试去掉它再启动。编辑/etc/default/grubGRUB_CMDLINE_LINUX_DEFAULTquiet splash然后sudo update-grub sudo reboot这个参数主要影响 Wayland 和硬件加速在 X11 下不是必需的。如果去掉后能正常进桌面说明问题出在这里。如果驱动层面查不出问题可以切换桌面管理器。把 GDM 换成 lightdm 试试sudo apt install -y lightdm sudo dpkg-reconfigure lightdm选择 lightdm 确认后重启。这个操作能解决部分 NVIDIA 驱动下的登录循环问题特别是老显卡。4.3 glxserver_nvidia 报错Xorg 扩展模块路径不对日志里看到(EE) NVIDIA: Failed to load module glxserver_nvidia (module does not exist, 0)这种情况通常发生在驱动安装不完整或者 Xorg 在启动时找不到 NVIDIA 提供的 GLX server 模块。先检查模块文件是否存在ls -l /usr/lib/xorg/modules/extensions/ | grep nvidia正常情况会看到类似libglxserver_nvidia.so.550.xx的文件。如果没有重装一次驱动。如果你之前用的是 .run 安装且参数不对很可能这个文件没被正确放置。可以从驱动包安装目录拷贝sudo cp -r /usr/lib/xorg/modules/extensions/nvidia /usr/lib/xorg/modules/extensions/之后重建 initramfs 并重启 Xorg。另外Xorg 版本太旧而驱动太新或者驱动太旧而 Xorg 太新也会引起这个报错。Ubuntu 24.04 的 Xorg 是 21.1.x如果你在强行使用 NVIDIA 470 这种 legacy 分支就要做好它对新 Xorg 支持不完善的心理准备。老显卡建议直接apt install nvidia-driver-470让源里自动匹配 legacy 包。4.4 内核升级后驱动失效DKMS 自动重建失效怎么办这是长期使用中最常见的问题。某次 apt upgrade 自动升级了内核重启后nvidia-smi又废了。原因很简单新内核启动后NVIDIA 内核模块需要为新内核重新编译一次。正常情况下 DKMS 会接管这个过程但如果你之前用 .run 装过或者 DKMS 数据库状态混乱就会失败。检查dkms status看到状态是installed就没事看到failed或者新内核版本没有对应记录手动执行sudo dkms autoinstall或者指定内核版本sudo dkms install nvidia/550.xx -k 6.8.0-47-generic完成后确认模块路径存在ls /lib/modules/6.8.0-47-generic/updates/dkms/ | grep nvidia然后重建 initramfs 再重启sudo update-initramfs -u sudo reboot这里提醒一句不要手贱执行apt autoremove --purge它有时候会把linux-headers-generic甚至dkms一起清理掉之后驱动一坏就彻底没法自动重建了。5. 收尾与长期维护经验5.1 X11 还是 Wayland别硬上Ubuntu 24.04 默认已经在向 Wayland 靠拢但 NVIDIA 驱动下的 Wayland 体验尤其是多显示器和混流场景还是有历史遗留问题。我的建议是如果你是开发者、搞深度学习的或者只是日常办公娱乐直接选 X11 会话。登录界面齿轮图标里选 Ubuntu on Xorg稳定省心。如果你确实需要 Wayland 的某些特性比如 HiDPI 混合缩放确保内核参数里有nvidia-drm.modeset1驱动版本 535 以上。实测下来部分组合下还是会有小毛病非刚需别折腾。5.2 卸载驱动要干净避免二次安装出问题来回折腾驱动的时候最忌讳卸载不干净。apt 方式安装的执行sudo apt purge ^nvidia -y sudo apt autoremove -y然后清理残留配置sudo rm -f /etc/modprobe.d/blacklist-nvidia-nouveau.conf sudo update-initramfs -u如果你之前试过 .run 安装还要手动清理/usr/lib/xorg/modules/extensions/下的 NVIDIA 残留以及/usr/src/nvidia-550.xx这类构建目录确认 /opt 下没有遗留 NVIDIA 相关文件夹。混装是最容易出鬼问题的宁可多花十分钟重新重启一次确认干净了再装新的。5.3 配合 CUDA 和 Docker 的验证思路NVIDIA 驱动装好之后下一步大概率是 CUDA 或者容器环境。CUDA Toolkit 可以直接用官方 run 文件装它不需要重装驱动。验证时注意两个命令的区别nvidia-smi看驱动和显存nvcc -V看 CUDA 编译器版本。两者没有必然的版本绑定关系只要驱动不低于 CUDA 要求的下限就行。Docker 调用 GPU先确认宿主机驱动正常然后安装 runtimesudo apt install -y nvidia-container-toolkit sudo systemctl restart docker跑一个测试容器docker run --gpus all --rm nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-smi如果容器里能正常输出 GPU 信息说明驱动、runtime、container toolkit 全链路已经通了。混合显卡笔记本还可以装nvidia-prime支持按需切换sudo prime-select on-demand日常用核显省电需要跑任务时再切 NVIDIA。折腾了几年 Ubuntu 上的 NVIDIA 驱动我最大的体会是新版本系统报驱动错误十有八九是内核模块没加载成功而加载失败的原因要么出在 Secure Boot 拦截要么是内核头文件没装导致 DKMS 编译失败。安装前把准备工作做扎实安装后不乱动系统翻车概率能降八成。最后分享一个笨办法但很管用的习惯每次升级内核后先跑一次dkms status确认所有内核模块状态是 installed 而不是 failed再去重启。这样能避免很多“睡一觉起来驱动又没了”的情况。真遇到问题了别急着重装系统按照本文第4节的排查顺序走一遍大多数情况都能救回来。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门