ARTICLE DETAIL

资讯详情

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

Ubuntu 20.04 NVIDIA显卡驱动安装、黑屏排查与版本选择

Ubuntu 20.04 NVIDIA显卡驱动安装、黑屏排查与版本选择 1. 为什么显卡驱动这事在 Ubuntu 20.04 上总出幺蛾子我手上有三台机器装 Ubuntu 20.04两台带 NVIDIA 独显一台是纯核显。这些年帮同事、帮实验室师弟师妹处理过上百次驱动问题最常见的两类求助就是装完之后进不去桌面卡在黑屏和nvidia-smi 报错说找不到驱动。这两个问题听起来是两回事其实根子都在一个地方驱动模块、内核模块、显示服务器X11 或 Wayland三者之间的版本和加载顺序没对齐。先把最容易混淆的概念说清楚。我们嘴里说的装显卡驱动在 Ubuntu 20.04 这个环境下通常有三条完全不同的路第一条是系统自带的ubuntu-drivers工具从官方仓库拉nvidia-driver-xxx这类预编译包第二条是去 NVIDIA 官网下.run结尾的官方安装包手动装第三条是在虚拟机或者某些特殊场景下走开源 nouveau。这三条路的适用场景完全不同选错了后面全是坑。提示如果你用的是 VMware 或 VirtualBox 这类虚拟机除非要做 GPU 直通否则根本不需要装 NVIDIA 驱动装了反而容易黑屏。虚拟机的显卡是虚拟出来的跟物理显卡驱动是两种东西。那为什么这么多人会掉进黑屏的坑我总结下来90% 的黑屏不是驱动本身有问题而是混合显卡架构导致的。现在的笔记本和台式机大多是 Intel 核显负责日常显示、NVIDIA 独显负责重负载计算这个叫 NVIDIA Optimus笔记本或者叫 PRIMELinux 下的叫法。你装完 NVIDIA 驱动之后如果显示输出还挂在核显上但驱动配置却指向了独显X 服务器启动时找不到正确的显示设备屏幕就黑了。另一个高频原因是内核版本与驱动版本不匹配。Ubuntu 20.04 默认内核是 5.4但很多人装完系统会顺手升级内核到 5.15、5.19 甚至更高这时候老版本的 NVIDIA 驱动比如 440、450 系列的 DKMS 模块就编译不过去了装的时候看着成功重启之后模块加载失败照样黑屏。还有一种情况是nouveau开源驱动没被彻底屏蔽装上闭源驱动之后两套驱动抢同一个设备结果是两败俱伤。搞清楚这几点我们再往下看具体怎么操作心里就有底了装驱动的核心不是把包装上而是让正确的模块在正确的时机加载、并且和你的显示输出架构匹配。下面我按先查清硬件和现状、再选方案、然后动手、最后处理异常的顺序把整套流程拆开讲。2. 动手之前必须搞清楚的三件事2.1 查清显卡型号和当前驱动状态不管你要装还是要卸第一件事是搞清楚现在机器上到底有什么。我见过太多人上来就敲安装命令结果装完发现驱动版本和显卡型号根本不匹配白白折腾两小时。最直接的一条命令lspci | grep -i vga lspci | grep -i 3d第一条会列出显示控制器第二条会列出 3D 控制器。如果机器是混合显卡你会看到两条输出一条是 Intel 的核显Integrated Graphics Controller一条是 NVIDIA 的独显3D Controller。台式机的话通常只有一条 NVIDIA 的记录因为台式机的显示输出一般直接由独显负责。拿到型号之后再用这条命令看当前装的是什么驱动ubuntu-drivers devices这个工具会列出所有适用于你当前硬件的 NVIDIA 驱动版本并在推荐版本后面标上recommended。比如 GTX 750 这种老卡它会推荐nvidia-driver-470如果是 RTX 30 系的新卡可能推荐nvidia-driver-535或者更新的版本。这一步非常关键不要盲目追求最新版驱动老显卡装新驱动大概率出问题新显卡装老驱动则可能不支持。还有一个命令值得记一下nvidia-smi如果当前已经装了驱动且正常工作这条命令会输出一张表格包含驱动版本、CUDA 版本、显卡型号、显存占用、温度等信息。如果报错NVIDIA-SMI has failed because it couldnt communicate with the NVIDIA driver那说明驱动模块没加载起来通常是内核更新后 DKMS 没重新编译或者驱动被卸载了但残留配置还在。2.2 判断是核显输出还是独显输出这一步是很多教程跳过、但恰恰是避免黑屏的关键。你要知道显示信号是从哪个卡出去的。对于台式机如果显示器插在主板的 HDMI/DP 口上那是核显输出插在独立显卡的接口上才是独显输出。这两种情况下驱动的配置方式不一样。插主板的话你其实还需要核显驱动正常工作插独显的话理论上可以只装 NVIDIA 驱动。对于笔记本情况更复杂一点。绝大多数笔记本的屏幕和 HDMI 口都接在核显上独显负责渲染后把图像通过 PRIME 传给核显输出这叫PRIME Offloading。只有少数高端游戏本带 MUX Switch显卡直连开关可以切换成独显直连。判断方法xrandr --listproviders输出里会显示有几个 Provider。如果有两个一个 Intel、一个 NVIDIA说明是混合输出模式独显是通过 PRIME 转发画面的。这种情况下绝对不能在 NVIDIA 驱动配置里把PrimaryGPU设成 yes 之外还乱改否则核显的输出链路被切断直接黑屏。2.3 确认系统版本、内核版本和安全启动状态lsb_release -a uname -r mokutil --sb-state第一条确认是 20.04Focal Fossa第二条看内核版本第三条看安全启动Secure Boot有没有开。这里有个大坑Secure Boot 开启状态下第三方内核模块包括 NVIDIA 驱动默认是被拒绝加载的。你装完驱动重启模块加载被安全机制挡掉表现就是黑屏或者分辨率异常。处理办法要么进 BIOS 关掉 Secure Boot要么在安装驱动时给模块签名并注册 MOKMachine Owner Key。前者简单粗暴后者规范但步骤多。我个人在开发机上一般直接关 Secure Boot省事如果是公司统一管理的机器那就得走签名流程。注意关 Secure Boot 之前先确认这台机器有没有开启全盘加密或者依赖安全启动的其他机制有的话要先评估影响别一关了之。3. 方案选型三种装法到底选哪个3.1 官方仓库 apt 安装推荐给 95% 的人这是我最推荐的方案没有之一。原因很简单apt装的驱动包是 Ubuntu 官方维护的适配当前内核、会自动配置 DKMS这样内核升级后驱动会自动重新编译、会和系统里的其他组件比如 CUDA、cuDNN保持依赖一致。具体命令就一句sudo apt update sudo apt install nvidia-driver-535版本号换成ubuntu-drivers devices里推荐的那个。装完之后重启然后跑nvidia-smi验证。这套方案的好处是可回滚。万一装完出问题sudo apt remove --purge nvidia-driver-535就能干净卸载掉不会留下乱七八糟的残留文件。这也是为什么我强烈不推荐新手用官方.run包。3.2 NVIDIA 官方 .run 包特定场景才用什么时候需要走这条路主要是三种情况一是你需要某个特定版本的驱动而 Ubuntu 仓库里没有二是你要装 CUDA Toolkit且必须和驱动版本严格对应三是离线环境仓库连不上。但.run包有几个天坑。首先它会覆盖系统里的libGL.so、libglx.so这些核心库如果之后再装apt包依赖关系就崩了。其次它不会自动配置 DKMS内核一升级驱动就失效得手动重装。最后卸载极其麻烦官方给的--uninstall经常删不干净。如果你非要用正确的姿势是sudo telinit 3 # 切到纯字符界面停掉 X sudo ./NVIDIA-Linux-x86_64-xxx.run # 运行安装包安装过程中它会问你要不要注册 DKMS、要不要装 32 位兼容库DKMS 一定要选 yes32 位库看需求。装完sudo reboot。3.3 混合场景的补充配置如果是混合显卡的笔记本光装驱动还不够还要配置 PRIME 让独显能参与渲染。Ubuntu 20.04 的 GNOME 自带了一个切换入口在设置 - 关于里能看到显卡信息但真正的渲染调度需要命令行# 全程用独显渲染 __NV_PRIME_RENDER_OFFLOAD1 __GLX_VENDOR_LIBRARY_NAMEnvidia glxinfo | grep OpenGL renderer # 单次命令用独显 __NV_PRIME_RENDER_OFFLOAD1 __GLX_VENDOR_LIBRARY_NAMEnvidia 你的程序如果输出里显示NVIDIA而不是Mesa说明 offload 生效了。这套环境变量的方式比早期修改 xorg.conf 的方式安全得多强烈建议不要用那种把 PrimaryGPU 设为 yes 然后删核显配置的老教程那是黑屏的重灾区。4. 完整实操流程从干净系统到可用驱动4.1 安装前的清理工作假设你接手一台装过各种杂牌驱动的机器先做清理。如果是全新的 Ubuntu 20.04可以跳过但建议还是跑一遍确认状态。# 卸载所有已安装的 nvidia 驱动包 sudo apt remove --purge ^nvidia-.* sudo apt remove --purge ^libnvidia-.* # 清理残留配置 sudo apt autoremove # 如果之前装过 .run 包用它的卸载器 sudo /usr/bin/nvidia-uninstall清理完之后把 nouveau 开源驱动也屏蔽掉避免它和闭源驱动冲突sudo bash -c echo -e blacklist nouveau\noptions nouveau modeset0 /etc/modprobe.d/blacklist-nouveau.conf sudo update-initramfs -u这条命令做了两件事把 nouveau 加入黑名单并禁止它设置显示模式。update-initramfs -u是重建初始化内存盘这一步不做的话重启后黑名单不生效。做完之后重启一次确保 nouveau 真的没在跑lsmod | grep nouveau输出应该是空的如果有输出说明黑名单没生效这时候继续装 NVIDIA 驱动等于给自己挖坑。4.2 关闭显示服务并进入字符界面不管你用 apt 还是 .run装驱动前都应该退出图形界面避免正在使用的 GL 库被替换导致崩溃。sudo systemctl set-default multi-user.target sudo reboot重启后你会停在 tty 字符登录界面输入账号密码登录。这时候再确认一下 X 服务没在跑ps aux | grep -i xorg如果只有 grep 自身的进程说明干净了。装完驱动之后要切回图形界面sudo systemctl set-default graphical.target这一步很多人不知道用telinit 3/telinit 5的方式临时切换也可以但systemctl set-default是永久生效的更稳。4.3 用 apt 安装并锁定驱动版本sudo apt update sudo apt install nvidia-driver-535命令跑完安装器会自动做几件事编译内核模块、注册 DKMS、生成/etc/X11/xorg.conf.d/下的相关配置。如果机器是混合显卡它可能还会装上nvidia-prime这个包。安装过程中如果看到 Building initial module for xxx-generic 这行一直在跑那是 DKMS 在编译模块慢是正常的等它跑完。如果报编译错误八成是内核头文件没装sudo apt install linux-headers-$(uname -r)4.4 验证驱动是否真正加载重启进图形界面后第一件事是验证nvidia-smi预期的输出长这样以 535 为例字段含义示例值Driver Version驱动版本535.183.01CUDA Version支持的最高 CUDA 版本12.2GPU Name显卡型号NVIDIA GeForce RTX 3060Memory-Usage显存占用245MiB / 12288MiBTemperature当前温度45CProcesses占用显存的进程无如果这条命令正常输出恭喜驱动装好了。再补一条命令确认 GL 渲染器glxinfo | grep OpenGL renderer输出里带 NVIDIA 就对了如果是llvmpipe软件渲染或者Mesa开源驱动说明还在用核显或者 nouveau。4.5 锁定版本防止内核升级踩坑Ubuntu 有个unattended-upgrades默认在后台自动更新某天它把内核升了而 NVIDIA 的 DKMS 模块编译失败你就得到一台黑屏的机器。我的做法是把驱动和内核都 hold 住sudo apt-mark hold nvidia-driver-535 sudo apt-mark hold linux-image-$(uname -r) linux-headers-$(uname -r)apt-mark hold会让 apt 不再自动升级这些包。等你有时间测试新版本时sudo apt-mark unhold解冻再手动升。5. 卸载驱动的正确姿势和黑屏急救5.1 什么时候需要卸载三种情况必须卸载重装一是换了显卡型号驱动得跟着换二是驱动版本装错了比如老卡装了新驱动三是装完之后系统不稳定需要回退到 nouveau。还有一种特殊情况是装了.run包之后想换回apt包那必须先彻底卸载.run的残留。5.2 apt 装的驱动怎么卸sudo apt remove --purge ^nvidia-.* sudo apt remove --purge ^libnvidia-.* sudo apt autoremove sudo apt autoclean写完这些再检查一遍残留dpkg -l | grep -i nvidia输出为空才算干净。然后重建 initramfs 并恢复 nouveausudo rm /etc/modprobe.d/blacklist-nouveau.conf sudo update-initramfs -u sudo reboot重启后 nouveau 会重新接管显示恢复正常性能会降但不影响基本使用。5.3 .run 包怎么卸如果你是用 .run 包装的先尝试官方卸载器sudo /usr/bin/nvidia-uninstall它会引导你走一遍卸载流程。如果报错说找不到这个脚本说明安装时没勾选注册 uninstall 脚本那就得手动删sudo rm -rf /usr/lib/nvidia /usr/lib32/nvidia /usr/share/nvidia sudo rm -f /etc/modprobe.d/nvidia*.conf sudo rm -f /usr/lib/x86_64-linux-gnu/libGL.so* sudo ldconfig手动删有风险删之前先备份/etc/X11/xorg.conf删完之后sudo apt install --reinstall libgl1 libglx-mesa0把系统自带的库装回来。5.4 黑屏了进不去系统怎么办这是最常见的求助场景。分两步走第一步进 GRUB。开机时按住 Shift有些机器是 Esc出现 GRUB 菜单后选Advanced options for Ubuntu然后选一个带(recovery mode)的内核项进去后选root就拿到一个 root shell。第二步在 root shell 里卸载出问题的驱动mount -o remount,rw / apt remove --purge ^nvidia-.* update-initramfs -u reboot如果黑屏是因为 Secure Boot 拒绝加载模块那还需要在 GRUB 内核参数里临时加nomodeset在 GRUB 菜单按e编辑当前启动项找到linux /boot/vmlinuz-xxx rootxxx ro quiet splash这一行把quiet splash换成nomodeset按 CtrlX 启动nomodeset的作用是让内核不要尝试设置显示模式改用最简单的 VESA 模式能让你先进系统再说。进去之后就能正常卸载驱动了。注意nomodeset是应急手段别长期留着。它能让你进桌面但分辨率会很低、性能很差而且显卡驱动永远加载不了。问题解决后一定要去掉这个参数。5.5 排查 nvidia-smi 报错的思路NVIDIA-SMI has failed because it couldnt communicate with the NVIDIA driver这条报错我见了不下一百次原因就那么几个按顺序排查现象可能原因排查命令解决办法内核升级后突然报错DKMS 模块没重编dkms statussudo dkms autoinstall安全启动开着模块签名验证失败mokutil --sb-state关 Secure Boot 或签名nouveau 还在跑两套驱动冲突lsmod | grep nouveau加黑名单并重建 initramfs模块文件缺失安装不完整ls /lib/modules/$(uname -r)/kernel/drivers/video/重装驱动硬盘驱动被禁用驱动包被 purgedpkg -l | grep nvidia重新 apt install我遇到过最折腾的一次是某台服务器的驱动死活加载不上dkms status显示模块是installedlsmod里却看不到nvidia。最后发现是/etc/modprobe.d/下有个很早之前的配置文件把nvidia给 blacklist 了而那个文件是某个同学做实验时留下的。所以排查时一定要把/etc/modprobe.d/下的所有文件都翻一遍grep -r blacklist nvidia /etc/modprobe.d/ grep -r blacklist nouveau /etc/modprobe.d/这两条命令能帮你找出所有相关的黑名单配置别让几年前的残留文件坑了今天的自己。6. 几个我踩过、你也大概率会踩的坑6.1 内核自动升级导致驱动失效这是 Ubuntu 上最高频的用着用着就坏了问题。unattended-upgrades半夜升级内核NVIDIA 的 DKMS 模块没跟着重编第二天开机黑屏。前面提到的apt-mark hold是个办法但更稳妥的是确认 DKMS 真的在正常工作dkms status正常输出应该是nvidia, 535.183.01, 5.4.0-xxx-generic, x86_64: installed。如果显示built但没installed或者干脆没有这一行那就是 DKMS 没配好。手动触发重编sudo dkms autoinstall -k $(uname -r)还有个小技巧装驱动的时候顺手把内核头文件也装上很多编译失败都是因为缺头文件sudo apt install linux-headers-generic linux-headers-$(uname -r)6.2 混合显卡乱改 xorg.conf 导致黑屏网上很多老教程教你写/etc/X11/xorg.conf指定BusID、Driver nvidia、PrimaryGPU yes。这在新显卡、新驱动上极易黑屏因为现在的系统默认走 PRIME 自动配置你手动写死了反而破坏自动协商。如果非要有 xorg 配置建议放在/etc/X11/xorg.conf.d/目录下作为附加片段而不是完整替换。大部分情况下用环境变量做 offload 完全够用根本不需要碰 xorg.conf。这是我这些年最深刻的一个教训能不手动写 xorg 就别写。6.3 装完驱动后 CUDA 找不到设备有些人装完驱动就跑nvidia-smi验证没问题但一跑 CUDA 程序就报 no CUDA-capable device is detected。这通常是nvidia_uvm模块没加载lsmod | grep nvidia_uvm没有输出的话手动加载sudo modprobe nvidia_uvm新版本的驱动一般会自动加载这个模块但老版本比如 440 系列需要手动。另外如果你通过apt install nvidia-driver-xxx装CUDA toolkit 要单独装驱动里的 CUDA Version 只是支持的最高版本不代表你系统里已经有 CUDA 了。想跑深度学习还得额外配置 toolkit 和环境变量。7. 关于离线安装和版本选择的补充经验7.1 内网机器怎么做离线安装有些实验室内网机器不能上外网只能离线装。我的做法是找一台能联网、系统版本相同的机器把依赖包全下下来sudo apt-get install --download-only nvidia-driver-535下载的.deb文件在/var/cache/apt/archives/目录下。把所有 deb 拷到 U 盘拿到内网机器上sudo dpkg -i /path/to/debs/*.deb sudo apt-get install -f # 修复可能的依赖缺失这里要注意离线安装最怕依赖不全。除了 nvidia 驱动本身还得把dkms、build-essential、对应内核版本的linux-headers都带上否则 module 编译不过。我吃过一次亏离线机器装到一半报编译失败回头补头文件又得再跑一趟机房。7.2 老显卡到底该用哪个版本驱动热词里有gtx750显卡驱动用什么版本的好这个问题我确实被问过很多次。GTX 750 是 Maxwell 架构NVIDIA 对 Maxwell 的官方支持停在 470 系列470.xx 是最后一个支持 Maxwell/Pascal/Volta 的长期分支。所以显卡架构代表型号推荐驱动系列说明MaxwellGTX 750, GTX 960470.xx最后的长期支持分支PascalGTX 1060, GTX 1080470.xx 或 535.xx两种都支持按需选TuringRTX 2060, 2080535.xx 或更新主流支持AmpereRTX 3060, 3090535.xx 或更新主流支持Ada LovelaceRTX 4060, 4090545.xx 或更新新架构新驱动装之前务必用ubuntu-drivers devices确认仓库里有没有对应版本。如果 470 已经不在你系统的软件源里了可能得手动加 PPA 或者从离线包安装。另外提醒一句不要给新卡装 470CUDA 功能会受限也不要给老卡硬装 535模块可能编译都过不了。8. 收尾说几句掏心窝的8.1 驱动稳定的核心是少折腾我这些年总结出一条规律Ubuntu 上显卡驱动最稳的状态就是apt 装官方推荐版本 什么都不改 apt-mark hold 锁住内核和驱动。所有花里胡哨的手动配置、第三方 PPA、xorg.conf 魔改都是在给未来的自己埋雷。除非有明确的性能需求或版本需求否则别动。装之前把现状查清楚lspci、ubuntu-drivers devices、nvidia-smi装的时候退出图形界面装完立刻验证并锁版本。这三步做到了90% 的黑屏和加载失败都能提前避免。8.2 留一手装之前备份关键配置有个习惯我强烈建议养成动驱动之前把可能受影响的配置备份一下。sudo cp -r /etc/X11 /etc/X11.bak sudo cp /etc/default/grub /etc/default/grub.bak sudo cp -r /etc/modprobe.d /etc/modprobe.d.bak真出问题的时候这几份备份能让你快速回滚比从头重装系统省事太多。尤其是/etc/modprobe.d/这个目录里面各种黑名单、参数配置出问题时挨个翻很费劲有备份就能直接对比差异。再补一个实用小技巧如果你手上有多个版本的 NVIDIA 驱动需要切换测试可以装多个版本然后用update-alternatives管理。不过这种场景比较少见大多数情况下选一个稳定版本、锁住、别动就是最优解。我见过太多把系统搞崩在试图同时管理三个驱动版本上的例子最后都是重装收场。驱动这块稳字当头。
返回列表