Ubuntu安装NVIDIA驱动:避开循环登录的PPA实战与内核对齐
简介在Ubuntu系统中配置深度学习、CUDA开发、视频剪辑或游戏环境时驱动安装往往是第一道坎尤其是进行CUDA运算或深度学习训练时驱动版本直接影响效率与稳定性。这份PDF指南面向刚接触Linux的新手也适合有一定经验但想快速完成显卡驱动安装的用户文档以GTX970M为例从获取显卡型号、到官网查询匹配驱动并进行版本比较——解释为什么宁可选择384稳定版也不用当时最新的390随后给出更新软件源、搜索可用驱动、安装指定版本等终端命令覆盖Ubuntu 16.04和17.10环境。遇到报错时文档指导先卸载旧驱动、禁用nouveau开源驱动安装完成后还提供命令行与图形界面两种验证方法可有效规避循环登录、安装失败等常见坑。全包仅1个PDF489KB内容精炼目前已有18858人学习适合需要立即照着操作并快速上手的用户。1. 为什么Ubuntu安装nvidia显卡驱动总卡在“循环登录”这次我选了条简单路子先说结论在Ubuntu上装nvidia显卡驱动这件事单论命令十分钟能跑完但网上大多数教程把“装最新版”当成默认动作于是流程就变成了“装完重启 → 卡登录界面 → 翻车”。这篇笔记围绕一块GTX970M的老笔记本实测走的是PPA方式安装nvidia驱动全家桶落地的版本不是最新的390而是更稳的384。整个过程对Ubuntu 16.04和17.10都适用新手可以直接跟命令熟手可以重点关注两次版本筛选和安装前后的内核对齐。这套方法装完不会出现循环登录前提是别跳过第四章里的三个前置检查。2. 装驱动前的摸底显卡型号、驱动版本和内核版本怎么对齐2.1 终端命令获取真实显卡型号别只靠机身贴纸教程原文提到“我的显卡型号是在电脑上的一个贴纸上”这个细节在不少老笔记本上确实成立GTX970M这种移动端型号经常直接印在A面、D面或者电池仓上。但别把贴纸当唯一依据二手整机、换过主板、翻新机贴纸和实际硬件大概率对不上。更可靠的办法是直接在终端里用命令确认。lspci | grep -i vga lspci | grep -i nvidia第一条命令把系统里所有VGA兼容控制器列出来能看到显卡厂商和显存信息第二条用nvidia关键词过滤确认这台机器到底是纯独显还是“核显独显”的双显卡方案。如果是双显卡后面验证驱动时要用到PRIME相关的手动切换。输出通常长这样01:00.0 VGA compatible controller: NVIDIA Corporation GM204M [GeForce GTX 970M] (rev a1)这里01:00.0是PCI总线地址rev a1是硬件修订版本。记下这个总线地址的用途在排查阶段——如果驱动加载过程卡死有时需要在引导参数里加pcirealloc而总线地址就是定位参数的依据。2.2 从厂商检索页拉可用版本列表先记三个数字拿到GTX970M这个型号后去显卡厂商的driver search page输入型号系统会给出当前推荐的最新版本390。但教程这里做了一个很关键的动作又跑到geforce drivers页面查询同一型号支持的所有驱动版本结果是390、384、375三个系列都在列表里。这个版本筛选值得展开讲。三个版本系列的差异在驱动优化方向上非常明显版本系列偏向场景实际表现390.x新卡新特性灰度修的是近两代卡的问题老卡偶发功耗上报异常384.x稳定分支老卡兼容性好CUDA/OpenGL日常工作稳定375.x更老分支老内核、老桌面环境的兜底选项版本号越大不等于越适合。NVIDIA的驱动优化基本是跟着新卡走的GTX970M属于已经发布很久的移动端型号新驱动主要修复的是新架构上的问题落到老卡上反而出现过温度读数偏高、风扇策略不积极的案例。这也是为什么教程放弃390转投384——多数人需要的不是最新特性而是一个不折腾、能跑CUDA和OpenGL的环境。查询时还要注意一个坑同一张显卡在Ubuntu和Windows下官方建议的版本号往往不一样驱动包完全分开不要拿Windows渠道查到的版本号到Linux命令里硬装。2.3 内核版本先行驱动模块和kernel headers必须对齐原教程把“更新源”当作安装前置步骤但没有提内核对齐。实际经验是NVIDIA的驱动包含内核模块安装时DKMS会把模块源码针对当前内核重新编译一次。如果系统里没有对应的linux-headers编译步骤会报错或卡在下载内核头文件。uname -r dpkg -l | grep linux-headers-$(uname -r)第一条命令打印当前内核版本比如4.13.0-36-generic第二条命令检查这个内核对应的头文件包是否已安装。如果dpkg没有任何输出说明headers缺失需要先补上sudo apt-get install linux-headers-$(uname -r)参数说明$(uname -r)是命令替换自动带入上一步查到的内核版本号避免手输版本出错。这一步做完再进入第三章的安装流程DKMS编译就不会因为缺头文件半路退出。3. 用PPA方式安装nvidia驱动完整命令串与每个命令的用途3.1 先update再upgrade这个顺序别倒过来在Ubuntu上装nvidia驱动最常见的翻车源头是系统里残留了大量半新不旧的依赖。先update再upgrade顺序不能反update是从apt源拉取最新的软件包索引upgrade是基于这个索引就地升级已安装的软件包。如果机器在旧内核上跑了大半年upgrade还会把内核和内核头文件统一到同一版本这直接关系到最后DKMS能不能顺利编译。注意upgrade结束后如果提示内核有更新最好先重启一次再继续装驱动。否则驱动模块会被编译到旧内核上重启进新内核后nvidia-smi大概率提示找不到设备。3.2 查询可用的nvidia安装包再决定装哪个版本原文在这一步给了两条判断路径先直接尝试安装nvidia-384如果报错再回头更新源。但更稳妥的做法是先查后装把“能不能装”变成看得见的结果。apt-cache search nvidia-* | grep -E 384|390这条命令在apt缓存里搜索所有nvidia相关软件包并用grep -E过滤出含384或390的包名。它解决的是“版本号存在但apt源里没有”的问题尤其是某些第三方源覆盖配置后官方源里的nvidia-384会被替换掉。输出里能看到类似nvidia-384、nvidia-384-dev、nvidia-384-uvm的一串包名这些是安装nvidia-384时会被自动拉起的依赖组件。3.3 安装nvidia-384主命令与安装过程会发生什么sudo apt-get install nvidia-384这一条是全文最核心的命令。它实际会做三件事第一下载nvidia-384相关的一整套驱动包第二通过DKMS把内核模块编译到当前内核上第三在黑名单机制里写入nvidia相关模块的加载配置。安装过程中如果看到dkms: building module之类的输出说明内核模块编译正在执行这个阶段不能中断终端进程。整个过程根据网络和机器性能大约需要3到10分钟。如果这条命令提示E: Unable to locate package nvidia-384基本可以判定是源列表里没有这个包回到第二章的内核检查并把apt-get update重新执行一遍。安装结束时系统会提示“需要重启才能生效”。此时不要急着重启先做一次快速复查确认/lib/modules/$(uname -r)/updates/dkms目录下生成了nvidia相关模块文件ls /lib/modules/$(uname -r)/updates/dkms | grep nvidia有输出说明模块编译产物已落盘接下来重启才有意义。这一步是我个人习惯里最容易被新手跳过的一环省掉它后面出了问题排查成本会高很多。4. Ubuntu安装nvidia显卡驱动常见问题循环登录、nouveau与依赖冲突4.1 重启后卡在登录界面输入密码又跳回登录页现象驱动安装完成后重启能进登录界面但输入正确密码后屏幕闪一下又回到登录页循环往复。原因NVIDIA驱动模块没有正确加载图形界面退回了低分辨率模式或LLVMpipe软件渲染。最常见的原因是安装驱动前没有把nouveau这个开源驱动模块拉黑两个驱动抢同一个设备。解决在/etc/modprobe.d/下新建配置文件把nouveau加入黑名单并更新initramfsecho blacklist nouveau | sudo tee /etc/modprobe.d/blacklist-nouveau.conf echo options nouveau modeset0 | sudo tee -a /etc/modprobe.d/blacklist-nouveau.conf sudo update-initramfs -u命令含义前两行把nouveau列入黑名单且禁用其modeset最后一行重新生成initramfs让黑名单在下次启动时生效。注意要在安装驱动前执行这套操作。4.2 apt报错E: Unable to locate package nvidia-384现象执行sudo apt-get install nvidia-384时终端直接返回E: Unable to locate package。原因包的索引里没有nvidia-384。常见于刚装完系统没有执行apt-get update或者系统的软件源被第三方源覆盖官方源被替换掉了。解决先执行sudo apt-get update然后用apt-cache search nvidia-*确认包是否存在。如果仍然搜不到检查/etc/apt/sources.list里的源地址是否包含main restricted universe multiverse四个组件。4.3 重启后nvidia-smi提示No devices were found现象驱动安装无报错但终端执行nvidia-smi出现No devices were found。原因驱动实际编译的内核版本和当前启动的内核版本不一致典型场景是安装驱动前刚升级过内核但没有重启。解决重启进入新内核再执行dkms status查看模块编译记录。如果模块列表里没有nvidia执行sudo dkms install -m nvidia -v 384手动补编译。这里的-m指定模块名-v指定版本号必须和驱动包版本一致。4.4 安装过程中切换终端导致安装中断现象DKMS编译阶段终端无响应误以为死机直接关闭终端窗口或强制重启再开机后驱动处于半装半不装状态。原因DKMS编译nvidia内核模块是一个耗时过程进程被终端信号终止后模块文件残留但不完整。解决重新执行sudo apt-get install nvidia-384 --reinstall让apt把已存在的残留模块覆盖掉。重新安装前不用手动清理apt会处理覆盖逻辑。4.5 双显卡笔记本启动后外接显示器黑屏现象笔记本自带屏幕正常但通过HDMI或DP外接显示器黑屏xrandr里看不到外接显示器。原因默认情况下外接输出走的是NVIDIA独显而若干老版本驱动没有正确初始化热插拔检测。解决临时方案是重启后在外接显示器开机状态下进入系统看是否能被识别长期方案是切换显示输出模式到独显直连或者在BIOS里把显卡模式设为Discrete。注意不同主板品牌对这个选项的命名差异很大有的叫“Switchable Graphics”有的叫“Hybrid Mode”。5. 验证驱动是否真的装好了两种不看花眼的测试方式5.1 nvidia-smi输出里哪几列才是“成功”信号重启后进入系统终端执行nvidia-smi如果驱动装好不会出现command not found而是一张类似下表的结构化信息----------------------------------------------------------------------------- | NVIDIA-SMI 384.130 Driver Version: 384.130 CUDA Version: 9.0 | ---------------------------------------------------------------------------值得关注的是三块内容Driver Version和安装的驱动系列是否对应CUDA Version是否为预期版本GPU-Util显示0%是正常的说明系统没有图形负载而不是驱动故障。如果GPU-Util恒定99%且没有跑任何负载多半是显卡被某些历史进程占用了可以用fuser -v /dev/nvidia*查看占用者这是排查思路里比较常用的一招。5.2 NVIDIA X Server Settings图形界面验证执行nvidia-settings弹出的窗口能正常显示显卡型号、驱动版本、显示器信息说明用户态驱动链路完整。这里有个容易被忽略的细节如果窗口右上角显示“PRIME Profiles”选项说明系统识别到了双显卡方案此时还能顺手确认当前使用的是nvidia还是intel输出。如果图形界面打开时报Failed to load module之类的错误先别怀疑安装失败多数情况下是X服务配置里没有加载nvidia的display driver模块。检查/etc/X11/xorg.conf是否存在不存在就用sudo nvidia-xconfig生成一份。5.3 跑一个真实计算任务验证CUDA链路图形界面能看到不代表算力链路可靠尤其是准备用这台机器做深度学习或渲染的话还要让显卡真正跑一次计算任务。nvidia-smi -q -d COMPUTE这条命令输出当前GPU的计算模式、运行中的计算进程列表。如果CUDA相关组件正常Compute Mode默认是Default且能列出进程名和对应显存占用。到这里GTX970M在Ubuntu下的安装链路就完整闭环了系统识别设备驱动加载成功用户态接口可用。6. 进阶技巧把安装过程压成一条可复用命令的思路装过几次Ubuntu的nvidia驱动后我养成了一个习惯每次重装系统前先把整个流程压成一个脚本片段省得再一步步敲命令。#!/bin/bash # 复用前确认当前系统已连接网络 if ! lspci | grep -qi nvidia; then echo 没有检测到nvidia设备脚本退出 exit 1 fi sudo apt-get update sudo apt-get install -y linux-headers-$(uname -r) echo blacklist nouveau | sudo tee /etc/modprobe.d/blacklist-nouveau.conf echo options nouveau modeset0 | sudo tee -a /etc/modprobe.d/blacklist-nouveau.conf sudo update-initramfs -u sudo apt-get install -y nvidia-384 ls /lib/modules/$(uname -r)/updates/dkms | grep nvidia echo 模块编译产物已确认这段脚本的思路是先确认硬件存在再补内核头文件黑名单nouveau最后安装驱动并验证模块产物。grep -qi中的-q是静默匹配-i忽略大小写脚本里每个阶段失败都会中断方便定位。从那以后我每次装完系统都会强制把这个脚本跑一遍再进重启环节。驱动安装这种操作最怕的就是靠记忆零散敲命令漏掉任何一条前置检查都会变成重启后的未知故障。希望这篇笔记能帮你少走一段弯路。本文还有配套的精品资源点击获取