ARTICLE DETAIL

资讯详情

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

Ubuntu下NVIDIA驱动安装全攻略:版本选择、三种方法、黑屏急救与报错排查

Ubuntu下NVIDIA驱动安装全攻略:版本选择、三种方法、黑屏急救与报错排查 装NVIDIA驱动这件事我前前后后折腾了不知道多少台Ubuntu机器20.04、22.04都踩过不少坑。很多人装完后不是黑屏就是循环登录或者nvidia-smi直接报couldnt communicate with the nvidia driver问题五花八门。其实大部分坑都不是运气问题而是安装方式、驱动版本、内核模块这几件事没理顺。这篇就把我实际用过、验证过的方案完整梳理一遍覆盖Ubuntu 20.04和22.04从驱动版本选择到三种安装方式再到黑屏急救和常见报错排查照着做能少走很多弯路。这篇内容适合刚接触Ubuntu、准备装深度学习环境或者双系统入坑的朋友也适合已经被驱动折磨过、想彻底搞懂原理的老哥。文章里的命令我都实机跑过可以直接复制使用。1. 动手之前必须搞清楚的几件事1.1 先确认你的显卡型号和系统版本很多人上来就sudo apt install nvidia-driver-xxx结果装完发现版本不对或者压根没匹配上。安装之前先花两分钟确认三件事系统版本、显卡型号、当前是否已有驱动。# 查看Ubuntu版本 lsb_release -a # 查看显卡硬件型号 lspci | grep -i nvidia # 查看当前是否已有NVIDIA驱动 nvidia-smilspci | grep -i nvidia的输出类似这样01:00.0 VGA compatible controller: NVIDIA Corporation GA106 [GeForce RTX 3060 Lite Hash Rate] (rev a1)如果nvidia-smi提示command not found说明还没装驱动如果提示has failed because it couldnt communicate with the nvidia driver说明驱动装了但内核模块没加载成功后面第3章会专门讲这个报错的处理。1.2 驱动版本怎么选不是越新越好NVIDIA驱动版本号看起来很多535、545、550、560选错了很容易出问题。我的经验是直接看ubuntu-drivers devices这个命令的输出它会列出当前系统能用的驱动版本并给出推荐。ubuntu-drivers devices输出示例 /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 modalias : pci:v000010DEd00002504sv00001462sd0000C755bc03sc00i00 vendor : NVIDIA Corporation model : GA106 [GeForce RTX 3060 Lite Hash Rate] driver : nvidia-driver-470 - third-party free recommended driver : nvidia-driver-525 - third-party free recommended driver : nvidia-driver-535 - third-party free recommended driver : nvidia-driver-545 - third-party free recommended driver : nvidia-driver-550 - third-party free recommended driver : xserver-xorg-video-nouveau - distro free builtin选择原则就一条能用推荐的版本就不用最新的。推荐版本是Ubuntu维护者测试过的和当前内核兼容性最好。如果ubuntu-drivers devices没输出任何内容可以先sudo apt update再试一次。不同显卡系列有一个大致的安全区间显卡系列推荐驱动分支说明GTX 750 Ti / 900系列及更老470新驱动已经放弃老架构支持GTX 10系列 / RTX 20系列470或535535也兼容但470更稳RTX 30系列535或55030系用535完全没问题RTX 40系列550及以上要用到较新的CUDA特性时选新版本提示如果是生产环境跑训练任务驱动稳定压倒一切建议固定版本不要随手apt upgrade把驱动一起升了。我见过太多人因为一次系统更新导致驱动失效的案例后面会详细说。1.3 禁用nouveau不然后面全是坑nouveau是Linux内核自带的开源NVIDIA驱动它的问题是和NVIDIA官方驱动冲突。如果不禁用它装完官方驱动重启后大概率循环登录或黑屏。先检查nouveau是否已加载lsmod | grep nouveau如果有输出说明nouveau还在运行。需要创建一个黑名单文件sudo bash -c echo blacklist nouveau /etc/modprobe.d/blacklist-nvidia-nouveau.conf sudo bash -c echo options nouveau modeset0 /etc/modprobe.d/blacklist-nvidia-nouveau.conf然后更新内核镜像sudo update-initramfs -u这一步做完必须重启生效sudo reboot重启后再用lsmod | grep nouveau确认没有输出。如果还有检查黑名单文件是否写对或者是否还有其他地方加载了nouveau模块。2. 三种主流安装方法按需求选2.1 图形界面安装新手最稳Ubuntu自带工具如果你不想敲一堆命令Ubuntu自带了一个图形化的驱动管理工具路径在软件和更新 - 附加驱动。打开后系统会扫描可用的NVIDIA驱动列出类似这样的选项使用 NVIDIA driver metapackage from nvidia-driver-535 (proprietary)使用 NVIDIA driver metapackage from nvidia-driver-550 (proprietary)使用 X.Org X server -- Nouveau display driver (open-source)选中想要的那个驱动版本点击“应用更改”输入密码等它下载安装完重启即可。这个方法的优点是简单缺点是看不到详细日志出问题时不好排查。另外图形界面能选到的驱动版本取决于Ubuntu源不一定是最新的。如果驱动适配有问题后面还需要回到命令行排查。2.2 命令行apt安装我用最多最可控我自己最常用的其实是命令行方式一条命令装好全程可控出问题了日志也清晰。先更新软件源sudo apt update然后有两种选择。第一种是让系统自动安装推荐版本sudo ubuntu-drivers autoinstall第二种是指定版本安装比如装535sudo apt install -y nvidia-driver-535ubuntu-drivers autoinstall的好处是省心它会根据你显卡型号和内核自动匹配指定版本安装的好处是可控适合需要固定版本的生产环境。安装完成后必须重启sudo reboot重启后验证nvidia-smi正常输出会显示驱动版本、CUDA版本、显卡温度、显存占用等信息。2.3 官网.run文件安装特定场景才用apt方式对大多数人够用了但有两个场景必须用官网的.run安装包一是apt源里没有你要的驱动版本比如刚发布的显卡需要最新驱动二是离线安装后面第4章会说。先到NVIDIA官网下载对应显卡的驱动.run文件然后进入纯命令行模式。在Ubuntu桌面环境中按CtrlAltF3切换到TTY终端登录后用以下命令关闭图形界面sudo systemctl isolate multi-user.target注意如果用的是Ubuntu 20.04或22.04默认的GDM登录管理器直接停止显示管理器有时候不彻底用systemctl isolate multi-user.target是切换到无图形模式的标准做法。然后给.run文件加执行权限并运行chmod x NVIDIA-Linux-x86_64-550.xx.run sudo ./NVIDIA-Linux-x86_64-550.xx.run安装过程中会有几个交互式提问我的经验是Would you like to register the kernel module sources with DKMS?选YesDKMS会在内核升级后自动重新编译驱动模块这个很重要选了后面能省很多事。Would you like to run the nvidia-xconfig utility?选No大多数情况下不需要手动生成xorg.conf。其他问题默认回车即可。装完后回到图形模式sudo systemctl isolate graphical.target然后重启验证。提示用.run文件安装有个坑它会覆盖apt装的驱动文件如果以后想换回apt方式需要先卸载干净第4章会讲卸载方法。3. 安装后的验证和应急恢复3.1 三个命令确认驱动真的生效了重启完别急着跑代码先用三个命令确认驱动装好了nvidia-smi glxinfo | grep rendering lsmod | grep nvidia各命令的判定标准命令正常表现异常表现及含义nvidia-smi输出显卡型号、驱动版本、显存信息couldnt communicate内核模块加载失败glxinfogrep renderingyeslsmodgrep nvidia列出nvidia相关内核模块glxinfo可能没装先安装sudo apt install -y mesa-utils这三个命令全过说明驱动已经用上了。注意glxinfo的yes只代表当前显示走的是硬件加速不代表GPU计算CUDA一定可用计算能力要用nvidia-smi和后续跑CUDA程序来验证。3.2 装完黑屏/循环登录怎么办装完驱动重启结果卡在黑屏或者登录界面输入密码后又弹回登录界面这是最常见的翻车现场。原因主要有三个nouveau没禁用干净、内核模块编译失败、Secure Boot拦截了模块加载。第一种情况nouveau没禁干净。回到1.3节确认/etc/modprobe.d/blacklist-nvidia-nouveau.conf内容写对update-initramfs -u执行过重启后lsmod | grep nouveau无输出。第二种情况内核模块编译失败。如果驱动是apt装的可以查看dkms状态dkms status正常输出类似nvidia/535.154.05, 5.15.0-91-generic, x86_64: installed如果显示missing或者没有对应内核版本说明模块没编译成功。手动重新编译sudo dkms install -m nvidia -v 535.154.05版本号以你dkms status里看到的为准。第三种情况Secure Boot拦截。这个最隐蔽表面现象也是黑屏或循环登录。如果你的主板开启了Secure Boot且Ubuntu安装时没有注册MOK密钥NVIDIA驱动这类第三方内核模块会被拒之门外。处理方法是进入BIOS关闭Secure Boot或者在系统提示注册MOK时设置一个密码并完成签名启用流程。如果系统已经装完但一直是这个状态建议直接进BIOS关闭简单粗暴。紧急救援步骤如果当前系统进不了桌面可以在GRUB启动菜单选择“Advanced options for Ubuntu”进入恢复模式recovery mode选择“root”进入命令行然后在root shell里操作。如果恢复模式都进不去就在GRUB菜单按e编辑启动项在linux那一行的末尾加上nomodeset按CtrlX或F10启动。nomodeset让内核不做显卡模式切换能用基础显示进入系统但此时NVIDIA驱动不会加载仍然可以排查问题。3.3 nvidia-smi报couldnt communicate的排查思路这个报错是搜索引擎上出现率最高的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-smi这个工具找到了但它无法和内核里的NVIDIA驱动通信。换句话说驱动装了一部分模块没加载成功。排查路径如下第一步看模块是否存在。lsmod | grep nvidia如果没有输出直接看内核模块文件modinfo nvidia如果显示modinfo: ERROR: Module nvidia not found说明内核模块压根没装上问题出在DKMS编译环节。执行sudo dkms status sudo dkms install -m nvidia -v 版本号 --force sudo update-initramfs -u sudo reboot第二步看内核日志。如果模块存在但加载失败通过内核日志找原因sudo dmesg | grep -i nvidia journalctl -k | grep -i nvidia常见错误包括Unknown symbol内核版本和驱动模块不匹配通常是系统内核升级后DKMS没编译或者手动从官网装驱动时没选DKMS。Operation not permittedSecure Boot拦截上面3.2节提到的或者模块签名验证失败。Resource temporarily unavailable另一个进程占用了GPU设备比如显示服务器还在用nouveau或者集显输出模式冲突。第三步检查是否正确加载模块。手动加载试试sudo modprobe nvidia如果没有任何输出说明加载成功问题可能是启动时没自动加载。可以检查cat /etc/modules-load.d/modules.conf把nvidia加进去或者通过systemctl list-unit-files | grep nvidia确认是否有对应的systemd服务没启用。4. 高频翻车场景实录避坑合集4.1 内核升级后驱动失效这个场景太常见了。你装好了驱动用了一段时间某天sudo apt upgrade升级了内核重启后nvidia-smi报couldnt communicate。原因就是新内核和已编译的NVIDIA内核模块版本不匹配。内核模块是针对特定内核版本编译的内核一升级旧模块编译产物就失效了。如果装驱动时选了DKMS注册这个场景其实可以完全避免。DKMSDynamic Kernel Module Support会在系统检测到新内核时自动重新编译NVIDIA模块。检查DKMS是否正常工作dkms status如果看到类似nvidia/xxx, 5.15.0-xx-generic, x86_64: installed的记录说明模块已经自动编译好了。如果状态是missing或uninstalled手动重建sudo dkms autoinstall或者sudo dkms install -m nvidia -v 版本号 -k $(uname -r)提示如果是官网.run文件安装安装过程务必选Yes注册到DKMS否则每次内核升级后都要手动重装非常痛苦。另外一个好习惯是升级内核后先不要立刻重启先执行sudo dkms autoinstall确认模块编译成功再重启。这样能避免重启后发现自己进不了桌面还得切到TTY排查。4.2 笔记本双显卡的坑核显NVIDIA独显很多笔记本是Intel核显NVIDIA独显的组合热词里出现的“Intel HD Graphics 630”就是典型的核显型号。这种机器装NVIDIA驱动本身没问题但默认行为可能是独显不工作或者全部GPU工作但风扇狂转、功耗爆炸。Ubuntu下处理双显卡的机制叫PRIME由NVIDIA驱动提供。安装完驱动后查询当前使用的显卡prime-select query输出可能是nvidia或intel。切换显卡sudo prime-select nvidia sudo reboot切到NVIDIA后nvidia-smi能看到独显但注意此时可能所有显示输出都走独显耗电会增加。如果是日常办公切回Intel能省电sudo prime-select intel sudo reboot注意双显卡机器如果遇到开机黑屏除了3.2节的排查思路还要检查BIOS里是否有“Graphics Mode”之类的选项有些机器需要设为“Discrete Graphics”或者“Hybrid”不同厂商叫法不一样。实测下来戴尔和联想的机器都遇到过类似选项必须手动调好的情况。另外新版本的NVIDIA驱动535以上默认开启了内核级DRMDirect Rendering Manager支持部分场景下Wayland会话也能正常使用了。但如果你在登录界面选的是“Ubuntu on Xorg”然后切到Wayland偶尔会因为显卡切换问题导致无法登录建议日常就固定用Xorg会话。4.3 虚拟机里装Ubuntu需不需要装NVIDIA驱动这是个高频问题热词里也有“vmware虚拟机安装ubuntu”。先给结论普通虚拟机VMware/VirtualBox里安装Ubuntu不需要安装NVIDIA官方驱动。虚拟机的显卡是通过宿主机模拟出来的虚拟显卡VMware SVGA、VirtualBox VMSVGA等和物理NVIDIA GPU没有直接关系。你在这类虚拟机里装NVIDIA官方驱动不但没有用反而可能因为内核模块加载失败导致启动异常。如果你需要在虚拟机里使用GPU计算能力正确方向是GPU直通Passthrough这需要宿主机硬件支持Intel VT-d或AMD IOMMU并且要用VMware ESXi、Proxmox VE这类Hypervisor。但这里面坑更多IOMMU分组、vfio-pci绑卡、性能损耗不建议新手直接上手。如果只是在虚拟机里跑一些GPU无关的开发环境根本不需要装NVIDIA驱动用虚拟显卡就足够了。真需要GPU算力直接物理机装Ubuntu NVIDIA驱动是正道。4.4 卸载重来怎么清得干干净净有时候驱动怎么修都修不好不如卸载重来。不同安装方式卸载方法不一样。如果是apt安装的sudo apt purge nvidia-* -y sudo apt autoremove -y如果混装了官网.run文件先看.run文件是否还在在的话直接用它卸载sudo ./NVIDIA-Linux-x86_64-550.xx.run --uninstall如果.run文件已经删了只能手动清理把以下路径都删掉sudo rm /lib/modules/$(uname -r)/kernel/drivers/video/nvidia* sudo rm /usr/src/nvidia-* sudo rm /usr/lib/xorg/modules/drivers/nvidia* sudo rm /usr/lib/xorg/modules/extensions/libglxserver_nvidia.so sudo rm /etc/modprobe.d/nvidia*.conf sudo rm /etc/modprobe.d/blacklist-nvidia*.conf sudo update-initramfs -u完全卸载后如果需要恢复nouveau把1.3节创建的黑名单文件删掉sudo rm /etc/modprobe.d/blacklist-nvidia-nouveau.conf sudo update-initramfs -u sudo reboot提示重装前一定要把nvidia-*残留清干净不然新旧驱动混在一起会出现一些莫名其妙的报错比如libcuda.so版本不匹配、nvidia-smi能用但CUDA程序报错等。5. 离线安装与驱动之外的操作延伸5.1 离线环境怎么装驱动热词里有“ubuntu22.04离线安装nvidia显卡驱动”这在内网机器、无外网的生产环境很常见。离线安装的核心思路就是在有网络的机器上把需要的安装包装好拷贝到目标机器上安装。最省事的离线方案是用.run安装包。在有网络的机器上下载对应驱动比如wget https://cn.download.nvidia.com/XFree86/Linux-x86_64/550.xx/NVIDIA-Linux-x86_64-550.xx.run用U盘拷贝到目标机器然后按2.3节的方式安装。注意.run安装时可能有依赖问题比如缺少gcc、make、kernel-headers把这些包也在有网络的环境下提前下好sudo apt download gcc make dkms linux-headers-$(uname -r)拷贝到目标机器后用sudo dpkg -i *.deb安装。如果是apt源里的驱动可以用apt-get download nvidia-driver-535等命令把驱动包下载下来不过它依赖关系比较多建议直接装.run需要的内容就dl-open那几样可控性强。目标机器安装过程会出现缺少依赖的报错按提示逐个补齐即可。5.2 顺手把CUDA Toolkit的安装逻辑搞清楚驱动装好了nvidia-smi能跑这只是第一步。如果你要跑深度学习框架PyTorch、TensorFlow还需要安装CUDA Toolkit。很多人搞混一点nvidia-smi显示的CUDA版本是驱动支持的最大CUDA版本不代表系统里已经装了CUDA Toolkit。驱动是“门卫”CUDA Toolkit才是真正提供编译和运行库的东西。以驱动版本535为例它显示支持CUDA 12.2但系统里可以装CUDA 12.1、11.8等更低的版本只要不超过驱动支持的上限就可以。而PyTorch针对不同CUDA版本提供预编译包选择时要看PyTorch要求什么版本而不是无脑装最新。一个常用的做法是# 查看当前驱动支持的最高CUDA版本 nvidia-smi | grep CUDA Version # 按需安装CUDA Toolkit示例装12.1 wget https://developer.download.nvidia.com/compute/cuda/12.1.0/local_installers/cuda_12.1.0_530.30.02_linux.run sudo sh cuda_12.1.0_530.30.02_linux.run安装时注意不要勾选安装驱动只装Toolkit即可避免把刚配好的驱动覆盖掉。5.3 装完驱动后的常用操作中文输入法和开发环境热词里出现了“ubuntu中文输入法怎么设置”和“ubuntu安装搜狗输入法”这确实也是很多人装完系统装完驱动后紧接着要做的事两个一起说了。中文输入法在Ubuntu 20.04/22.04下的推荐方案是安装ibus-rime或使用搜狗输入法Linux版。如果系统自带的IBus输入法配置不听话可以试试sudo apt install -y ibus-rime然后注销重新登录在“设置 - 键盘 - 输入源”里添加“中州韵Rime”。搜狗输入法则是下载官网的deb包sudo apt install -y fcitx sudo dpkg -i sogoupinyin_xxx_amd64.deb sudo apt -f install -y安装完成后同样需要注销重登然后在“输入法配置”里把搜狗加进去。说实话我自己的经验是搜狗输入法在22.04的fcitx5环境下偶尔会有状态不同步的问题ibus-rime虽然配置费点功夫但胜在稳定而且词库足够。建议优先试ibus-rime不行再考虑搜狗。5.4 重启后如何确认系统记住了驱动配置这是最后一步也是很多人忽略的一步。驱动装好、重启正常后把以下信息记录在一个文本文件里方便日后排查uname -r # 内核版本 nvidia-smi | grep Driver Version # 驱动版本 dkms status # DKMS模块状态 prime-select query # 双显卡机器当前显卡每次都对照一下一旦nvidia-smi报错先用uname -r看内核是不是变了再dkms status看模块状态基本能定位80%的问题。我个人在实际操作中的体会是Ubuntu装NVIDIA驱动这件事80%的问题根源都是“版本不匹配”和“内核模块没加载成功”而这两类问题又都可以通过“安装前禁nouveau 安装时注册DKMS 升级内核后手动跑dkms autoinstall”这三板斧来预防。先把基础动作做好比掌握各种急救技巧更重要。另外建议装完驱动后顺手拍一张nvidia-smi的正常输出截图万一后面出问题至少有个对照。6. 最后的避坑提醒这几个操作千万别做驱动一旦稳定运行最怕的就是手贱乱动。几个常见翻车操作提醒一下不要用apt upgrade随手升级NVIDIA驱动。apt upgrade会把nvidia-driver-535之类包含在升级列表里但新版本可能没针对你当前内核做适配升级完重启就黑屏。固定版本打算长期用时用apt-mark hold nvidia-driver-535锁定版本。不要混装不同来源的驱动。apt装完再往上去覆盖装.run或者反过来混久了系统里会出现两套驱动文件互相打架出问题很难查。不要在运行生产任务时随便卸载重装驱动。驱动卸载会卸载CUDA相关的用户态库正在跑的进程会直接崩掉如果是服务器上的训练任务损失惨重。锁定驱动版本的命令sudo apt-mark hold nvidia-driver-535 sudo apt-mark hold libnvidia-common-535 sudo apt-mark hold libnvidia-compute-535 sudo apt-mark hold libnvidia-decode-535 sudo apt-mark hold libnvidia-encode-535 sudo apt-mark hold libnvidia-gl-535如果哪天想解除锁定用sudo apt-mark unhold nvidia-driver-535。另外如果你在安装过程中遇到过failed to load module glxserver_nvidia这个报错不用慌这通常是因为图形界面还开着就去执行了.run安装或者nouveau残留导致GLX模块加载冲突。解决方式是回到纯命令行模式把nouveau禁干净再重新装一遍驱动。如果你用它驱动已经工作正常的机器突然蹦出这个报错一般是Xorg的NVIDIA GLX模块路径不对重装驱动即可恢复。这次整理的完整流程从安装前确认硬件到版本选择、禁用nouveau、三种安装方式再到后面验证、排障、卸载重装和离线场景基本覆盖了我实战中遇到的90%情况。照着这套流程走只要没碰到硬件本身的问题都能顺利装上并稳定跑起来。
返回列表