Ubuntu 18.04 NVIDIA驱动安装与故障排查:解决分辨率异常和nvidia-smi报错
2026/9/16 21:00:10 网站建设 项目流程

1. 故障现象与原因拆解:为什么分辨率变大,NVIDIA-SMI 又为什么报错

先还原一下大部分朋友遇到的画面:Ubuntu 18.04 用得好好的,某次开机突然发现屏幕图标、任务栏、字体都变得特别大,进“设置-显示”一看,分辨率从原本的 2560x1440 掉到了 1024x768 甚至 800x600,而且怎么调都回不去。再打开终端敲一句nvidia-smi,直接给你来一段红字:

NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.

其实这两个现象是同一个问题,分别从两个角度暴露出来:系统图形界面已经放弃使用独立显卡输出,转而用 CPU 内置的兼容显示方案在顶班;而 N 卡驱动栈里,用户空间的nvidia-smi工具和内核空间的驱动模块已经断了联系。

先说屏幕分辨率变大这件事。这里的“变大”实际是“变糙”,分辨率降到安全模式了。X Server 或者 Wayland 在启动时如果发现 NVIDIA 内核模块没有加载,就会自动回退到fbdevvesa这类通用驱动,这类驱动不认识你的显示器 EDID 信息,只能给一个最基础的分辨率,通常就是 1024x768 或 800x600。所以桌面元素全部放大了,跟 Windows 的“安全模式”是一个逻辑。

再看nvidia-smi报错。nvidia-smi本质是一个用户态工具,它要正常输出显存占用、GPU 温度、进程列表,前提是内核里已经正确加载了nvidianvidia-modesetnvidia-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依然报 couldn't 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-common

2.2 禁用 nouveau 驱动

无论你是要用 apt 安装还是.run文件安装,禁用 nouveau 都要放在第一步。具体操作:

新建一个黑名单配置文件:

sudo vim /etc/modprobe.d/blacklist-nouveau.conf

写入以下内容:

blacklist nouveau blacklist lbm-nouveau options nouveau modeset=0 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 couldn't communicate with the NVIDIA driver内核模块没加载,或模块崩溃lsmod | grep nvidiadmesg | grep -i nvidiadkms 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-smi
couldn't 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 ldconfig
no 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,然后按 Ctrl+X 启动。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 维护者是否有对应的版本支持。根据自己的实际情况选一条路走到底,比反复横跳切换安装方式要稳妥得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询