ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Ubuntu 18.04 NVIDIA驱动安装与故障排查:解决分辨率异常和nvidia-smi报错

2026/9/16 21:00:11 拓冰建站 浏览量
Ubuntu 18.04 NVIDIA驱动安装与故障排查:解决分辨率异常和nvidia-smi报错 1. 故障现象与原因拆解为什么分辨率变大NVIDIA-SMI 又为什么报错先还原一下大部分朋友遇到的画面Ubuntu 18.04 用得好好的某次开机突然发现屏幕图标、任务栏、字体都变得特别大进“设置-显示”一看分辨率从原本的 2560x1440 掉到了 1024x768 甚至 800x600而且怎么调都回不去。再打开终端敲一句nvidia-smi直接给你来一段红字NVIDIA-SMI has failed because it couldnt communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.其实这两个现象是同一个问题分别从两个角度暴露出来系统图形界面已经放弃使用独立显卡输出转而用 CPU 内置的兼容显示方案在顶班而 N 卡驱动栈里用户空间的nvidia-smi工具和内核空间的驱动模块已经断了联系。先说屏幕分辨率变大这件事。这里的“变大”实际是“变糙”分辨率降到安全模式了。X Server 或者 Wayland 在启动时如果发现 NVIDIA 内核模块没有加载就会自动回退到fbdev或vesa这类通用驱动这类驱动不认识你的显示器 EDID 信息只能给一个最基础的分辨率通常就是 1024x768 或 800x600。所以桌面元素全部放大了跟 Windows 的“安全模式”是一个逻辑。再看nvidia-smi报错。nvidia-smi本质是一个用户态工具它要正常输出显存占用、GPU 温度、进程列表前提是内核里已经正确加载了nvidia、nvidia-modeset、nvidia-uvm等模块而且用户态库libnvidia-ml.so能被找到。只要内核模块没加载、版本不匹配、或者被 DKMS 编译失败后遗留了错误的模块签名nvidia-smi就会抛出无法与驱动通信的报错。结合我这些年处理过的案例触发这个问题的最常见诱因有这么几个系统自动更新内核新内核跑起来之后原本靠 DKMS 自动重编译的 NVIDIA 模块因为编译链缺失或签名问题没有成功生成某个依赖库被apt upgrade升级后和现有驱动版本产生 ABI 不兼容安装过.run官方驱动之后又通过 apt 安装了另一个版本的驱动两边文件互相覆盖双系统用户开启 Secure Boot新编译的模块没做 MOK 签名显卡硬件松了、PCIe 链路异常导致内核模块加载时探测不到设备。搞清楚原理后面动手处理就有思路了。下面从安装前的准备工作开始讲一直到故障排查给你一套完整的实操流程。2. 装驱动前必须搞定的事禁用 nouveau 与准备工作很多教程一上来就让你apt install nvidia-driver-470装完重启发现还是进不去图形界面或者驱动没加载。我见到的绝大多数翻车不是驱动安装那一步出了问题而是准备工作没做到位尤其是没有禁用 nouveau 开源驱动。nouveau 是 Linux 内核里的 NVIDIA 开源驱动框架性能差、功能不全但问题是它一旦先加载占了设备闭源的 NVIDIA 驱动模块在插入时就会因为设备已经被别的驱动占用而静默失败。这才是很多人安装后nvidia-smi依然报 couldnt communicate 的隐藏原因之一。2.1 判断显卡型号和当前驱动状态开始之前先确认机器上到底是什么显卡、现在装了什么驱动。依次跑这几个命令lspci | grep -i nvidia这一步能确认 PCIe 总线上有没有识别到 NVIDIA 显卡。如果这步输出为空先别急着装驱动查显卡供电、PCIe 插槽或 BIOS 设置甚至是显卡本身有没有物理故障。nvidia-smi如果驱动正常会显示显卡型号、驱动版本、显存占用和当前进程。如果报错记住报错原文后面排查时可以精确搜索定位。ubuntu-drivers devices这个命令会列出当前系统能用的 NVIDIA 驱动版本并且会给出系统推荐的版本。在 18.04 里这个工具由ubuntu-drivers-common提供如果没有安装可以先装一下sudo apt install ubuntu-drivers-common2.2 禁用 nouveau 驱动无论你是要用 apt 安装还是.run文件安装禁用 nouveau 都要放在第一步。具体操作新建一个黑名单配置文件sudo vim /etc/modprobe.d/blacklist-nouveau.conf写入以下内容blacklist nouveau blacklist lbm-nouveau options nouveau modeset0 alias nouveau off alias lbm-nouveau off保存后更新 initramfs让这个配置在下次开机时生效sudo update-initramfs -u然后重启sudo reboot重启后验证一下 nouveau 是否真的没加载lsmod | grep nouveau正常情况下这行没有任何输出。如果你发现自己怎么改都禁用不掉且系统有 BIOS 设置项可以尝试进入 BIOS 将 Primary Display 设为 PEG/PCIe同时关闭 CSM只保留 UEFI这能从根本上避免 nouveau 在早期阶段占用设备。2.3 补全编译与安装依赖用 apt 方式安装的时候虽然系统会自动处理依赖但如果内核升级后需要靠 DKMS 重建模块你就必须已经装好了对应的编译工具链。缺少linux-headers是 DKMS 编译失败的最常见原因。建议先把这些包装齐sudo apt update sudo apt install build-essential dkms linux-headers-$(uname -r) gcc make其中linux-headers-$(uname -r)是当前内核对应版本的头文件。之所以要强调这一点是因为安装驱动时编译模块必须匹配当前运行的内核源码树。同时建议把 Secure Boot 关掉或者提前准备好 MOK 签名流程。安全启动开启状态下所有第三方内核模块都必须带有效签名否则即使模块编译成功启动时也会被拒绝加载表现出来就是nvidia-smi报通信失败。如果你必须在开启 Secure Boot 的情况下使用那在驱动安装流程的最后会进入 MOK 管理界面按照提示设置一个密码重启后再选择 Enroll MOK 完成签名注册否则重启后一切照旧。3. 三种驱动安装方式实测apt、附加驱动、.run 文件Ubuntu 18.04 下安装 NVIDIA 驱动市面上主流的方法其实就是三种从 Ubuntu 仓库用 apt 安装、用“软件和更新-附加驱动”图形界面安装、去 NVIDIA 官网下载.run文件手动安装。很多人纠结到底选哪种我把三种方式的优缺点都列出来再给你一套我实测下来最稳的路径。3.1 三种方式对比与场景选择安装方式优点缺点适合场景apt 安装nvidia-driver-xxx依赖自动处理内核升级后有 DKMS 自动重编版本比官网更新慢可能不是最新大多数人日常使用追求省心稳定“附加驱动”图形界面直观勾选即可不需要记命令有时界面显示列表和命令行不完全一致需要切换源新手朋友已经能进图形界面NVIDIA 官网.run安装版本最新官方推荐卸载升级麻烦每次内核升级要手动重编兼容性风险更高CUDA 开发需要特定版本的场景或跑最新显卡必须用新驱动我自己在不同机器上三种方式都用过如果只是想让系统正常显示、跑一下深度学习推理最推荐第一种apt 仓库的驱动足够用。如果你刚买了 40 系以后的新显卡Ubuntu 18.04 自带的官方源里驱动版本偏低可能要采用第三种方式去官网选一个支持你显卡型号的最新版。3.2 推荐流程apt 方式完整操作以你大概率会碰到的nvidia-driver-470为例顺序如下第一彻底清理现有 NVIDIA 相关软件包防止残留文件干扰新驱动sudo apt purge nvidia-* sudo apt autoremove如果没有输出或者提示找不到包说明之前没装过跳过即可。第二重新生成 initramfs把旧的内核模块残留清掉sudo update-initramfs -u第三查询仓库里可用的驱动版本ubuntu-drivers devices系统会在输出里标注一个recommended版本。也可以直接看候选版本列表选择你需要的apt list --all-versions | grep nvidia-driver第四安装sudo apt install nvidia-driver-470安装过程中如果提示是否生成并签名 DKMS 模块全部选 Yes。安装完成后先不要立即重启先查看 DKMS 的状态确认模块确实编译成功dkms status正常情况会看到类似nvidia/470.xx.x, 5.4.0-xxx-generic, x86_64: installed的输出。只要出现 installed 字样就说明内核模块编译成功有能力在开机时自动加载。第五重启sudo reboot重启后第一时间在终端执行nvidia-smi看到显卡型号和驱动版本号就说明安装成功。3.3 .run 文件安装的完整流程与注意事项用官网.run文件安装的场景主要发生在新显卡、老 Ubuntu 源里没有适配驱动或者 CUDA 版本要求比较苛刻的时候。到 NVIDIA 官网驱动下载页面根据自己的显卡型号选择对应的 Latest Production Branch。搜索显卡型号时注意笔记本用户不要选成桌面版否则会下载到完全不同的包。下载完成后先别急着执行。你需要做两件事。第一停止图形界面服务。如果不停止X Server 会占用显卡驱动安装程序无法卸载旧驱动或加载新模块。Ubuntu 18.04 默认用 lightdm 或 gdm3先确认用的是哪一个cat /etc/X11/default-display-manager如果是/usr/sbin/lightdm就执行sudo service lightdm stop如果是/usr/sbin/gdm3则执行sudo service gdm3 stop如果你在远程通过 SSH 操作这一步不影响 SSH 连接可以放心执行。第二给.run文件加执行权限并运行chmod x NVIDIA-Linux-x86_64-470.xx.xx.run sudo ./NVIDIA-Linux-x86_64-470.xx.xx.run --no-opengl-files关于--no-opengl-files这个参数存在很多争议。简单说明一下如果你不搞 OpenGL 开发加这个参数可以防止官方驱动覆盖系统自带的 OpenGL 库导致桌面循环登录如果你需要 CUDA 做 GPU 计算加也没有影响因为 CUDA 运行时会自带需要的库。我通常建议加上因为绝大多数普通用户跳进循环登录坑都是因为 OpenGL 文件冲突。安装过程中会有好几个交互问题遇到Would you like to run nvidia-xconfig?可以选 Yes这样驱动会帮你生成一份包含显卡配置的 X 配置文件省去手动改/etc/X11/xorg.conf的麻烦。装完后重启前如果你之前停止了图形界面服务重启即可sudo reboot重启后如果分辨率还是不对检查 Xorg 日志grep -i nvidia /var/log/Xorg.0.log能看到(EE) NVIDIA: Failed to load the NVIDIA kernel module之类的报错就往内核模块的方向排查能看到(II) NVIDIA(0): Valid display device(s)说明驱动加载正常问题更多出在显示器和线材上。3.4 内核升级后必须重新编译模块的问题Ubuntu 18.04 默认开启自动安全更新这意味着系统会定期更新内核版本。每次内核升级后原来编译好的 NVIDIA 内核模块就废了新的内核必须重新编译一次模块。如果你用的是 apt 装的驱动系统里的 DKMS 会尝试自动完成这件事。判断是否成功只需在升级完内核重启后执行dkms status如果状态为installed放心用如果出现build失败或显示original module字样多半是编译过程中缺了linux-headers-$(uname -r)或者 gcc 版本和编译内核时不一致。手动补救sudo dkms remove nvidia/470.xx.xx --all sudo dkms install nvidia/470.xx.xx -k $(uname -r)如果是.run方式安装的内核升级后一定要记住重新执行一次.run安装程序或者专门到官网下载对应版本的驱动重新安装没有捷径可走。4. 常见问题的完整排查手法与避坑经验故障处理这一块我觉得比安装本身更有价值。很多朋友遇到问题时病急乱投医老是在重装驱动反而越弄越糟。我把这几年在 Ubuntu 18.04 上遇到的高频报错整理成速查表按图索骥能省很多时间。4.1 核心报错速查表报错信息本质原因排查方向最稳的解决办法NVIDIA-SMI has failed because it couldnt communicate with the NVIDIA driver内核模块没加载或模块崩溃lsmod | grep nvidia、dmesg | grep -i nvidia、dkms status重新安装驱动检查 DKMS 编译状态确认 nouveau 已禁用nvidia-smi: command not found, but can be installed with驱动工具没装进 PATH或压根没装驱动ls /usr/bin/nvidia-smidpkg -l | grep nvidia重新安装驱动软链接/usr/bin/nvidia-smi指向/usr/lib/nvidia-xxx/bin/nvidia-smicouldnt find libnvidia-ml.so library in your system用户态库路径丢失检查/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.470.xx.xx是否存在在/etc/ld.so.conf.d/添加/usr/lib/x86_64-linux-gnu执行sudo ldconfigno devices were found驱动模块加载了但没探测到 GPUlspci | grep -i nvidia、BIOS 设置、PCIe 插槽检查硬件关闭 CSM确认显卡供电unable to determine the device handle for gpu0000:xx:xx.0: Unknown Error模块与设备通信异常通常带驱动与硬件不兼容dmesg尾部内容、驱动版本与显卡卡对应关系换一个驱动分支通常从 535 换到 470 或相反Failed to initialize NVML: Driver/library version mismatch内核模块版本和用户态工具版本不一致cat /proc/driver/nvidia/version与实际驱动文件版本对比完全清理后重装驱动不要混装 apt 与 .run循环登录 / 黑屏回登录界面X Server 加载 OpenGL 库失败常见于 .run 安装覆盖系统库cat /var/log/Xorg.0.log尾部看EE行用--no-opengl-files重装或apt install --reinstall libgl1-mesa-glx恢复 Mesa这里特别提醒一句NVIDIA-SMI 报通信失败在大多数情况下不需要重装整个系统也不要一上来就重装驱动。建议按这个顺序排查先看硬件在不在 → 再看内核模块加载没加载 → 再看 DKMS 编译状态 → 最后才动驱动本身。4.2 双系统与 Secure Boot 场景的处理经验双系统用户遇到驱动问题的频率明显更高。Windows 和 Ubuntu 双系统尤其是新一点的电脑默认开了 Secure Boot这会让 NVIDIA 闭源驱动的加载变得比较麻烦。如果你开机后进 Ubuntu 执行dkms status显示模块是 installed但系统日志里报Lockdown: insmod of unsigned module或者Operation not permitted大概率就是 Secure Boot 卡住了。解决思路有两个方向第一个方向进入 BIOS 关闭 Secure Boot。这是最省事的方法适合电脑自己不承担机密环境要求的普通用户。注意不同主板 BIOS 菜单位置不同一般在 Boot 或 Security 菜单下面。第二个方向用 MOK 注册签名的流程。Ubuntu 首次安装驱动时如果检测到 Secure Boot 开启重启时会出现蓝色 MOK 管理界面按提示选 Enroll key from disk然后重启到mokutil界面设置密码完成签名注册。如果没有自动弹出来也可以手动给模块签名sudo mokutil --import /var/lib/shim-signed/mok/MOK.der然后重启按照提示走完 MOK 注册流程。这个方法保留 Secure Boot相对更严谨适合不能关安全启动的办公环境。4.3 解决更换显卡后的驱动残留问题还有一个高频场景机器原来用 A 卡或者核显后来换了 NVIDIA 显卡或者是拿到了别人装过别的显卡驱动的机器。这时候直接装 NVIDIA 驱动大概率会碰到各种诡异问题。正确的处理姿势是先把旧的显卡驱动彻底清掉。整理一个通用清理流程# 删除 NVIDIA 相关包 sudo apt purge nvidia-* cuda-* libnvidia-* # 删除 AMD 相关包如果是 A 卡换 N 卡 sudo apt purge amdgpu* mesa-vulkan-drivers # 清理所有不用的依赖 sudo apt autoremove # 更新 initramfs 并重启 sudo update-initramfs -u sudo reboot重启后确认系统用的是默认的nouveau或者intel驱动再走一遍第 2 节安装驱动的完整流程。很多人“驱动冲突”的困扰其实是新旧驱动的用户态库混在/usr/lib/x86_64-linux-gnu里ldconfig加载时产生版本错乱造成的。4.4 开机黑屏、卡在登录界面的还原技巧如果你的驱动问题已经发展到开机黑屏或者循环登录不要慌还有一个有效的还原技巧。重启后在 GRUB 菜单处选择 Ubuntu 高级选项进入恢复模式recovery mode。在恢复菜单里选择root进入 root shell然后执行mount -o remount,rw / apt purge nvidia-* apt autoremove update-initramfs -u reboot这样会把系统恢复到用 nouveau 驱动的初始状态至少能进图形界面再重新按正确方式安装。如果你连恢复模式的 root 都进不去还可以在 GRUB 菜单按e编辑启动项在linux那一行后面加nomodeset然后按 CtrlX 启动。nomodeset会强制内核不做模式设置很多黑屏和显示异常问题都能靠这个参数先撑过去进系统后再解决驱动。4.5 一个避免反复翻车的内核版本锁定技巧处理完驱动问题后如果你的系统经常因为内核自动升级又出问题我的个人习惯是把已经稳定运行的内核版本锁住不让 apt 随便升级。查看当前内核uname -r锁定版本禁止其被自动更新替换sudo apt-mark hold linux-image-$(uname -r) sudo apt-mark hold linux-headers-$(uname -r)以后想解除锁定执行sudo apt-mark unhold linux-image-$(uname -r)这个方法看起来简单但能避免掉 90% 的“重启后 nvidia-smi 又挂了”的悲剧。等你确认新内核确实没问题再手动解锁更新即可。5. 实操心得装驱动这件事最关键的是理解自己的场景这几年在 Ubuntu 18.04 上装 NVIDIA 驱动前前后后修过几十台机器踩过的坑多得数不清。最大的感受是装驱动本身并不难难的是对症下药。同一个nvidia-smi has failed报错原因可能是 DKMS 编译失败、可能是 nouveau 没禁干净、可能是 Secure Boot 签名问题、也可能是显卡物理接触不良。不搞清楚系统具体处于什么状态就直接重装驱动那才是大多数问题的根源。所以我的习惯是在处理任何驱动问题之前先收集三类信息lspci | grep -i nvidia看设备在不在、dkms status看模块编译状态、cat /var/log/Xorg.0.log | grep -i EE看图形界面加载报错。拿到这三份信息问题的范围基本能缩小到一半以内。平时维护的服务器上我还会把内核模块加载状态做成一个小脚本开机自动记录到日志里这样即使某一天远程连接后发现 GPU 掉了也能通过日志定位是重启后立即掉的还是运行一段时间后才掉的。前者多半是驱动加载和内核不兼容的问题后者多半要查散热、电源或硬件稳定性。最后分享一个很多人都忽略的小技巧如果你的 Ubuntu 18.04 源里的驱动版本太低导致新显卡装不上可以先把源里的驱动列表更新一下sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update这个 PPA 提供了相对较新的 NVIDIA 驱动打包比官网.run文件省心一些DKMS 支持也做得更完善。不过要注意加了 PPA 之后系统升级大版本时可能会遇到依赖冲突升级前最好先确认 PPA 维护者是否有对应的版本支持。根据自己的实际情况选一条路走到底比反复横跳切换安装方式要稳妥得多。