ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Ubuntu下NVIDIA驱动安装、卸载与排错全攻略

Ubuntu下NVIDIA驱动安装、卸载与排错全攻略 如果你的Ubuntu机器是用来跑深度学习、做视频渲染或者玩Steam游戏那么装NVIDIA显卡驱动基本是绕不开的第一步。我见过太多人在这一步卡住装完重启黑屏、无限循环登录、nvidia-smi报错提示“couldnt communicate with the nvidia driver”最后只能重装系统。这篇东西就把我从18.04一路用到24.04这些年踩过的坑一次性说清楚从最简单的一条命令安装到最彻底的干净卸载再到高频问题排查全部覆盖。不管你是刚接触Linux的新手还是被驱动问题折磨过几次的老用户这篇都值得收藏。1. 为什么你的Ubuntu需要NVIDIA驱动动手前必须明白的几个问题1.1 哪些场景必须自己手动装驱动很多刚切换到Ubuntu的人会有一个疑问系统装完不是能正常显示桌面吗为什么还要单独折腾显卡驱动这里要分清楚Ubuntu默认自带的是开源的nouveau驱动它属于“能用但不好用”的程度。日常打字、浏览网页、看视频没有太大问题但一旦涉及GPU加速计算、CUDA推理、3D渲染、大型游戏nouveau的性能和兼容性就完全跟不上而且不支持较新的CUDA版本。需要手动安装NVIDIA闭源驱动的典型场景包括跑PyTorch、TensorFlow这类深度学习框架用Blender、DaVinci Resolve做渲染和剪辑玩Steam上的大型3D游戏搞CUDA编程或者使用NVIDIA容器工具包。如果你只把Ubuntu当普通桌面用不碰这些那确实可以不装。但只要涉及上面任何一项官方闭源驱动就是必须的。这也是为什么标题里强调“安装”和“干净卸载”同样重要——装不好会出各种问题卸载不干净也会给下一次安装埋雷。1.2 装之前先回答自己四个问题动手前建议先冷静回答几个问题能帮你少走很多弯路。第一个问题你的显卡是哪一代NVIDIA从Kepler架构到现在的Ada Lovelace、Blackwell架构驱动版本跨度很大。一般来说较新的显卡需要较新的驱动旧卡用太新的驱动反而可能出现兼容性问题。第二个问题你需不需要CUDA如果只是装驱动玩游戏那直接装图形驱动就行如果要跑深度学习驱动版本和CUDA版本、PyTorch版本之间都有对应关系建议先定好CUDA版本再决定驱动版本。第三个问题你的系统是刚装的还是已经用了很久刚装的系统装驱动成功率最高因为环境干净旧系统可能装过其他版本的驱动、配置过乱七八糟的源排查起来更费劲。第四个问题是否开启了Secure Boot这个非常关键如果主板开启了Secure BootNVIDIA闭源驱动模块需要签名才能加载否则装完必出问题。这四个问题中Secure Boot和内核版本这两个坑最容易被忽略。很多人的驱动装完重启后报错或者直接被禁用十有八九和Secure Boot有关。建议BIOS里先关掉Secure Boot或者提前准备好MOK签名流程否则后面每一步都可能踩坑。内核版本也是同理特殊的HWE内核、实时内核等都有可能和NVIDIA驱动的编译兼容性产生冲突。2. 安装前的准备工作显卡识别、nouveau禁用与依赖安装2.1 确认你的显卡型号和系统状态在安装驱动之前先确认硬件信息。打开终端执行lspci | grep -i nvidia这条命令会列出所有NVIDIA相关的PCI设备信息。如果输出里能看到类似“NVIDIA Corporation GA106 [GeForce RTX 3060]”这样的行说明系统已经识别到显卡。但注意这里识别到硬件不代表驱动已经装好Ubuntu自带的nouveau驱动也能让系统识别到N卡。接着执行nvidia-smi如果系统提示“command not found”说明当前没有安装NVIDIA官方驱动如果提示“NVIDIA-SMI has failed because it couldnt communicate with the NVIDIA driver”则说明可能装过驱动但驱动没有正确加载或者加载失败。这两种情况下的处理方式完全不同后者往往需要先做一次彻底清理可以参考后面第4节的内容。再查看一下当前nouveau驱动的加载状态lsmod | grep nouveau如果有输出说明nouveau正在使用中。这个模块必须在安装NVIDIA官方驱动之前被禁用否则两个驱动会发生冲突导致安装失败或者显示异常。Ubuntu 18.04之后的部分版本默认自动加载nouveau有的版本在安装驱动时安装器会自动处理禁用但为了稳定起见强烈建议手动操作。2.2 禁用nouveau开源驱动关键一步禁用nouveau是所有安装方式的前提条件这一步做不好后面全是坑。先创建配置文件sudo nano /etc/modprobe.d/blacklist-nouveau.conf写入以下两行内容blacklist nouveau options nouveau modeset0保存退出后更新内核initramfs并重启sudo update-initramfs -u sudo reboot重启后再执行lsmod | grep nouveau只要没有输出就说明nouveau已经被成功禁用。如果仍然有输出建议检查conf文件是否生效可以执行cat /etc/modprobe.d/blacklist-nouveau.conf确认内容是否写入正确。另外注意文件名必须以.conf结尾并且放在/etc/modprobe.d/目录下否则不会被加载。我自己的经验是在部分Ubuntu 22.04和24.04版本上单独写blacklist文件有时候不够还需要确认系统有没有加载其他位置的黑名单配置。可以用modprobe --show-config | grep nouveau来查看当前生效的配置状态。如果不生效顺手检查一下是否有/etc/modprobe.d/blacklist.conf这种老式命名文件把blacklist nouveau也加进去。2.3 安装编译依赖针对离线runfile方式如果你打算用runfile方式安装驱动编译依赖这一步必须提前做好。虽然Ubuntu的apt源里可以直接装预编译好的驱动包但很多特殊场景——比如新显卡首发、Ubuntu版本太老、或者需要自定义驱动参数——都会逼你选择runfile方式。安装编译需要的工具链sudo apt update sudo apt install build-essential linux-headers-$(uname -r) gcc make dkms这里linux-headers-$(uname -r)是当前内核对应的头文件runfile安装器在编译内核模块时必须要用到它。很多人在这一步报错报的错误类似“Unable to find the kernel source tree”原因就是没有安装对应的kernel headers。如果你刚升级过内核重启之前和重启之后的内核版本可能不同务必以当前运行的内核版本为准执行命令。DKMSDynamic Kernel Module Support也很重要它的作用是让NVIDIA驱动模块在内核升级后自动重新编译注册避免每次内核更新后驱动失效。用runfile安装时安装器会询问是否需要注册DKMS建议选择注册用apt方式安装时驱动包通常默认就集成了DKMS支持。3. 安装NVIDIA驱动的三种主流方式从最简单到最可控3.1 方式一ubuntu-drivers一句话自动检测安装这是最简单、最适合新手的安装方式也是我在Ubuntu 22.04、24.04上最推荐的方法。Ubuntu自带了一个硬件驱动检测工具ubuntu-drivers它会自动扫描你的显卡硬件匹配当前系统软件源中可用的最佳驱动版本。首先执行sudo ubuntu-drivers devices这条命令会列出当前设备支持的驱动列表输出中会显示类似driver : nvidia-driver-535 - third-party free这样的信息前面带recommended标记的就是系统推荐的版本。看到推荐版本后直接执行sudo ubuntu-drivers autoinstall系统会自动安装推荐的驱动以及所有依赖包。安装完成后重启sudo reboot。重启后执行nvidia-smi如果看到显卡信息、驱动版本、CUDA版本那就恭喜你一次成功。这个方式的优点是完全自动化系统帮你处理好了依赖关系、DKMS注册、模块加载配置。缺点是它依赖软件源里的驱动版本对于特别新的显卡源里的驱动版本可能偏旧不一定支持。比如RTX 4090刚发布时旧版Ubuntu软件源还没有对应的新驱动这个时候就要用第二种或第三种方式。3.2 方式二apt install指定版本号安装如果你想安装特定版本的NVIDIA驱动或者ubuntu-drivers autoinstall选择的版本不对可以手动指定版本号安装。先说一个我走过的老路网上很多教程让人去运行sudo apt install nvidia-driver-390这类老版本命令这通常是把驱动版本写死在教程里不适合现在的系统。正确的做法是先查一下自己的显卡支持什么版本的驱动。还是先执行ubuntu-drivers devices查看可用版本假设输出推荐的是nvidia-driver-535你就可以执行sudo apt install nvidia-driver-535如果你想安装更精确的版本号比如带小数点的那种可以先搜索软件仓库apt search nvidia-driver然后选择你需要的版本安装。安装完成后同样重启验证。这种方式其实和第一种本质相同都是走apt包管理器区别只是指定版本与否。注意apt方式安装的驱动后续卸载也要走apt不要用runfile的nvidia-uninstall否则会出现卸载状态混乱。另外提供一个小技巧如果你需要的不是最新驱动而是某个CUDA版本明确对应的驱动版本建议去NVIDIA官方文档查看CUDA和驱动版本的兼容对照表。比如CUDA 12.x通常需要驱动版本530以上CUDA 11.x则需要470以上。别随便装个低版本驱动然后发现CUDA跑不了那就尴尬了。3.3 方式三runfile离线安装适合新卡和特殊环境runfile是NVIDIA官方提供的离线安装包名字类似NVIDIA-Linux-x86_64-550.78.run。它的适用场景很明确第一系统软件源里的驱动版本不够新无法支持你的新显卡第二你需要自定义安装参数第三目标机器没有外网只能拷贝安装包离线装。先从NVIDIA官网下载对应的驱动文件下载时注意选择Linux 64-bit、你的显卡型号和对应版本。把文件拷贝到目标机器后先执行chmod x NVIDIA-Linux-x86_64-550.78.run然后需要切换到纯命令行模式。Ubuntu的桌面环境会占用显卡相关资源不关掉可能导致安装失败。按CtrlAltF3进入tty终端登录后执行sudo service lightdm stop或者使用sudo telinit 3切换到多用户命令行模式。如果你用的是GDM3桌面管理器可能需要sudo service gdm3 stop。不同桌面环境对应的服务名不同可以先执行systemctl status display-manager查看当前使用的是哪一个。停止桌面服务后执行sudo bash NVIDIA-Linux-x86_64-550.78.run安装过程中会出现几个交互式问题比较常见的包括“Would you like to register the kernel module sources with DKMS?”选Yes“Install NVIDIAs 32-bit compatibility libraries?”如果需要跑32位应用选Yes否则No“Would you like to run the nvidia-xconfig utility?”选Yes。安装完成后重启sudo reboot。这里有个非常关键的点runfile方式安装好后如果后续要用apt或ubuntu-drivers再装其他版本必须先执行sudo nvidia-uninstall干净卸载否则会残留冲突文件。runfile安装的驱动不归apt管apt的卸载命令对它无效。4. 干净卸载NVIDIA驱动完整清理不留残留4.1 如果是apt方式安装的驱动用apt purge干净卸载这个话题困扰的人其实比安装还多。很多人的系统里残留着几十个nvidia相关包新驱动装不上旧驱动卸不掉最后只能重装系统。这里先说apt方式的卸载。先查看系统中装了多少个nvidia相关的包dpkg -l | grep -i nvidia你会看到nvidia-driver-535、libnvidia-gl-535、nvidia-kernel-common-535等等一堆包。卸载核心驱动包时不要一个个手动删直接用purge命令批量卸载sudo apt purge ^nvidia-.* sudo apt autoremove第一条命令会匹配所有以nvidia开头的包并彻底删除包括配置文件第二条命令会自动清理不再需要的依赖包。执行完后再检查一遍dpkg -l | grep -i nvidia这时理论上应该没有任何输出了。如果有残留继续手动删除注意libnvidia-*这类包名也是匹配范围但有时候你会发现还有libcuda-*之类的包残留可以一并purge。4.2 如果是runfile方式安装的驱动用nvidia-uninstallrunfile方式安装的驱动卸载方式完全不同。如果你直接用apt purge nvidia-*会发现自己根本没有这些apt包。正确的方法是找到之前安装时用的runfile文件或者直接从NVIDIA官网重新下载一个相同版本的runfile然后执行sudo nvidia-uninstall如果找不到nvidia-uninstall这个工具也可以用runfile的自带卸载模式sudo bash NVIDIA-Linux-x86_64-550.78.run --uninstall执行时会提示是否保留配置文件选No或者Uninstall all确保彻底卸载。卸载完成后建议手动检查几个容易残留的位置/usr/lib/nvidia 目录是否还存在/usr/src/ 目录下的nvidia源码目录比如nvidia-550.78如果有就手动删除/lib/modules/$(uname -r)/kernel/drivers/video/nvidia.ko 等内核模块文件/etc/modprobe.d/ 目录下和nvidia相关的conf文件有一个很隐蔽的坑有些驱动会生成/proc/driver/nvidia目录这个目录在驱动卸载后通常会自动消失。如果还在说明有内核模块仍然加载需要用lsmod | grep nvidia查看是否有进程引用必要时重启后再检查。4.3 验证卸载是否干净顺便清理DKMS注册卸载完成后不要急着装新驱动先做一轮彻底的验证。我自己习惯按这个顺序检查lsmod | grep nvidia没有输出说明内核模块已卸载再执行nvidia-smi应该提示命令找不到或无法连接驱动然后检查DKMS状态dkms status如果还有nvidia相关条目用以下命令删除sudo dkms remove -m nvidia -v 版本号 --all最后检查启动脚本和服务ls /etc/init.d/ | grep nvidia systemctl list-units | grep nvidia有残留的脚本或服务继续手动清理掉。这一步很多人忽略但非常重要。我遇到过一种情况驱动明明卸载干净了但一重启系统就自动加载老版本的nvidia内核模块最后发现是/etc/rc.local和/etc/modules里残留了加载指令。只有把这些清理干净下次装驱动才能保证一个绝对干净的环境。4.4 补充apt方式卸载后关于卸载顺序的常见误区有一个非常常见的误区先卸载nvidia-driver包然后立刻执行autoremove结果发现驱动还是删不干净。原因在于很多nvidia相关包之间存在复杂的依赖关系autoremove只会清理“不再被任何包依赖”的包如果还有别的包引用旧驱动它就不会动。正确的顺序是先执行sudo apt purge ^nvidia-.*再执行sudo apt autoremove然后再执行一次sudo apt autoclean清理apt缓存。如果做完之后用dpkg查询仍有残留再手动sudo dpkg --remove 包名逐个清理。还有一个建议卸载NVIDIA驱动后建议把nouveau黑名单临时注释掉或者留着都行。如果接下来你要装回开源驱动或者干脆不再用NVIDIA闭源驱动需要恢复nouveau的使用就把blacklist文件删掉并重新执行update-initramfs -u如果打算稍后装回闭源驱动保留黑名单即可。5. 高频问题排查与避坑实录5.1 nvidia-smi报错“couldnt communicate with the nvidia driver”怎么修这个错误算是NVIDIA驱动使用中出现频率最高的报错了提示信息一般是NVIDIA-SMI has failed because it couldnt communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.很多人在这一步直接崩溃要么重装系统要么反复装十几遍。实际上这个错误的核心原因只有一个NVIDIA内核模块没有正确加载到当前运行的内核里。原因通常分为几类第一驱动和当前内核版本不匹配尤其是你刚升级过内核旧的驱动模块是针对旧内核编译的第二Secure Boot阻止了驱动模块加载第三之前卸载不干净新旧驱动模块冲突第四驱动安装过程中没有注册DKMS。排查的时候第一步执行lsmod | grep nvidia如果无输出说明模块确实没加载。然后查看内核日志dmesg | grep -i nvidia这一步能直接看到模块加载失败的具体原因可能是Unknown symbol、Module has invalid ELF header或者是Operation not permitted。根据日志内容对症下药如果指向Secure Boot就在BIOS里关掉或完成签名如果指向版本不匹配就重装对应内核的驱动并重新注册DKMS如果有残留模块就先做一次第4节的彻底清理。5.2 安装驱动后无限循环登录装完驱动重启输入密码后屏幕闪一下又回到登录界面这是最常见的安装失败症状之一。我两次遇到过这个问题一次是因为在安装runfile时没有停掉桌面服务另一次是因为nouveau没有彻底禁用。循环登录的本质是桌面环境无法正常启动而NVIDIA驱动加载失败或者配置错误是最常见的原因。排查思路按照顺序来第一步按CtrlAltF3切换到tty命令行界面登录如果命令行能登录说明系统本身没坏只是图形界面起不来执行nvidia-smi看驱动是否加载。如果驱动正常但循环登录依旧检查/etc/X11/xorg.conf文件NVIDIA驱动安装时可能自动生成了显示器配置如果该配置有问题直接备份后删除然后重启试试。第二步确认nouveau是否真的被禁用了有些情况下重启后nouveau会重新加载可以通过lsmod | grep nouveau检查。第三步检查磁盘空间和系统日志/var/log/Xorg.0.log很多时候故障原因就在日志最后几行里。有一个很隐蔽的坑如果你的系统同时安装了多个内核版本而当前启动的内核并不是安装驱动时用的那个内核那么驱动模块也会加载失败导致循环登录。这时候在启动菜单里选择旧内核通常会恢复正常然后重新注册DKMS即可。5.3 内核升级后驱动失效如何用DKMS救回来Ubuntu系统每次更新内核版本后NVIDIA驱动以模块形式编译后仍然是绑定内核的内核升级后如果不重新编译驱动就会失效。如果你安装时注册了DKMS系统在检测到新内核后会自动完成重新编译这个过程通常不会有感知。但如果因为某些原因DKMS没有自动执行就会出现内核升级后nvidia-smi直接报错的情况。这时先查看DKMS状态dkms status如果看到nvidia模块的状态是installed而不是built for current kernel就手动重新构建一下sudo dkms install -m nvidia -v 你的驱动版本版本号可以从dkms status输出里看到比如nvidia/550.78中的550.78。执行完成后重启驱动就恢复正常了。我的建议是每次系统进行大版本更新前先执行uname -r记录当前内核版本再去看看更新日志。如果更新中包含linux-image相关的包就要做好驱动可能需要重新构建的心理准备提前确保build-essential和linux-headers-*这些包都是安装好的。5.4 安装失败显示“CC version check failed”或“Unable to find the kernel source tree”这两个错误都是编译环节的问题。CC version check failed表示系统当前默认的gcc版本和编译内核时使用的gcc版本不一致。Ubuntu 24.04默认gcc是13如果你同时装了多个gcc版本或者用了某些特殊工具链就可能触发这个问题。解决办法是手动指定编译器sudo bash NVIDIA-Linux-x86_64-550.78.run --ccgcc-12具体用哪个版本取决于你当前内核编译时用的gcc版本可以通过cat /proc/version查看到。而Unable to find the kernel source tree则几乎一定是没装linux-headers-$(uname -r)导致的。执行sudo apt install linux-headers-$(uname -r)安装后重试即可。这两个错误在装runfile驱动时极其常见但都可以提前规避在安装前把build-essential和linux-headers装好基本就不会遇到了。5.5 Ubuntu 24.04和20.04/22.04的特殊差异不同Ubuntu版本之间安装NVIDIA驱动的体验差异其实挺大。先说20.04这是目前AI开发最常用的版本软件源里的驱动版本相对保守但非常稳定ubuntu-drivers autoinstall基本都可以顺利搞定。22.04的体验也不错但内核版本更新较快内核和驱动之间的兼容问题比20.04稍微多一点。到了24.04默认内核可能是6.8或更高版本较老版本的NVIDIA驱动可能无法适配新内核建议优先选择软件源中较新的驱动版本比如550或以上系列。24.04还有一个变化系统默认使用GDM3桌面环境部分老教程里sudo service lightdm stop这种命令不生效需要改成sudo systemctl stop gdm3。另外24.04在某些硬件上默认开启了Wayland而NVIDIA驱动在Wayland下的体验虽然比前几年好很多但依然有一些小坑比如部分应用无法正常GLX加速。如果遇到显示问题可以在登录界面选择“Ubuntu on Xorg”会话模式。6. 安装完成后的验证与日常使用建议6.1 驱动正常运行的判断标准装好驱动后很多人看到nvidia-smi有输出就觉得大功告成其实还可以再深入验证一下。首先执行nvidia-smi看输出是否包含显卡型号、驱动版本、显存使用量。接着执行lsmod | grep nvidia确认nvidia、nvidia_drm、nvidia_modeset等模块都已加载。如果你要跑深度学习建议再跑一个简单的CUDA测试不一定非要装CUDA工具包才能验证驱动是否正常。可以直接用nvidia-smi -a查看显卡状态或者运行一个Python环境下的torch.cuda.is_available()检查。额外建议检查一下驱动是否支持超高频供电模式。NVIDIA显卡在默认状态下的空闲功耗管理可能比较保守执行nvidia-smi -pm 1开启持久化模式这个设置对深度学习场景下频繁调用显卡的小任务非常有用能显著降低启动延迟。不过这个设置重启后会失效如果想要每次开机自动开启需要把命令写入rc.local或者作为systemd服务运行。6.2 日常更新时注意别把驱动搞坏一个很实用的建议Ubuntu系统更新时如果提示有linux-image相关的更新建议在更新前先执行一次nvidia-smi记录当前的驱动状态。更新后重启前先看看/var/log/dpkg.log里是否出现了nvidia相关包的更新记录。如果更新后驱动失效按照5.3节的DKMS方法重建即可。还有一个经常踩的坑很多人在系统更新后出现了多个内核版本共存而启动时默认选择的是最新内核。如果最新内核和你当前NVIDIA驱动的兼容性不好反而会导致原本正常的驱动罢工。这种时候可以检查/boot目录下的内核文件有需要的话用sudo apt autoremove --purge清理旧内核或者通过调整GRUB启动顺序来指定优先级。6.3 如果驱动正常但桌面显示仍有异常有些时候驱动安装成功nvidia-smi也正常但桌面存在闪烁、分辨率不对、或者外接显示器识别不出来的问题。这种情况多半和显示管理器及显示服务器的配置有关。对于使用Xorg的会话可以尝试重新生成xorg.confsudo nvidia-xconfig然后重启。如果使用的是GDM3加Wayland组合且异常难以解决可以切换到Xorg登录会话通常能解决大部分渲染异常。另外如果你的机器有核显和NVIDIA独显双显卡那么还需要处理Prime切换问题默认情况下NVIDIA驱动会通过PRIME机制管理双显卡可以在NVIDIA X Server Settings里切换工作模式。7. 写在最后的个人经验分享这些年帮人折腾Ubuntu装NVIDIA驱动我自己最大的体会是大多数失败都发生在“赶时间”和“照着老教程硬抄”这两种情况下。赶时间体现在安装前没有确认环境没看系统版本、没查内核、没关Secure Boot就急着下载runfile结果装完各种报错硬抄老教程则体现在明明用着24.04却拿着十年前针对18.04的命令一行行复制不报错才奇怪。所以我在上面反复强调的那些准备工作比如确认显卡型号、禁用nouveau、检查Secure Boot、装好build-essential和linux-headers每一步都不是走过场。别看它们枯燥这些恰恰是决定一次安装能否成功的关键。尤其是卸载环节我见过太多同学想换驱动版本结果直接用apt purge一下然后装新的装不上又跑回来问为什么——答案很简单残留没清干净。最后再分享一个实用习惯不管装驱动还是卸载驱动都建议先把当前的软件包列表和内核状态记下来。执行一条命令搞定dpkg -l | grep -i nvidia nvidia-before.txt uname -r nvidia-before.txt万一后面出了问题这份记录能帮你快速定位是哪一步出了差池。希望大家都能一次成功不再被NVIDIA驱动折腾到怀疑人生。
返回列表