首页 / 资讯中心 / 文章详情

Linux下Nvidia驱动与CUDA安装全攻略:从环境准备到版本管理

Linux下Nvidia驱动与CUDA安装全攻略:从环境准备到版本管理 ★ FEATURED ARTICLE
刚接触Linux的朋友十个里有八个都栽在Nvidia驱动和CUDA安装这关上。明明照着教程一步一步敲结果要么黑屏、要么循环登录、要么nvidia-smi直接报错最后只能重装系统非常打击信心。这事我自己前前后后折腾过不下几十次从Ubuntu 14.04一路用到现在台式机、服务器、笔记本都装过。今天把我踩过的所有坑、试过的所有路径、以及最终沉淀下来的一套最稳的流程一次性整理给你。这篇文章适合所有想在Linux上跑深度学习、搞GPU计算、或者单纯想用N卡渲染的人不管你是刚入门的小白还是已经跟驱动搏斗过几轮的老哥照着做都能少走很多弯路。先说结论驱动和CUDA想要装得干净、装得不留后患核心就两件事——选对装法和管好版本。下面我把整个流程从思路到细节全部拆开讲。1. 动手前必须想明白的几件事1.1 驱动和CUDA不是一回事但必须配得上很多新手最容易混淆的就是Nvidia驱动和CUDA之间的关系。简单说驱动是硬件和系统之间的翻译官CUDA是干活用的工具包。你装CUDA不是为了看那个版本号而是为了里面带的nvcc编译器、CUDA运行库、以及cuDNN等配套库。驱动负责让系统认识GPUCUDA负责让你写的代码能在GPU上跑起来。它们之间有个硬约束CUDA版本有一个最低驱动版本要求。比如CUDA 12.4要求驱动版本不低于550.54.14CUDA 11.8要求不低于520.61.05。反过来驱动版本越新通常向下兼容的CUDA版本就越多。你如果先装了一个很老的驱动再去装新版CUDA跑起来大概率会报CUDA driver version is insufficient之类的错。所以我个人的习惯是驱动尽量装新一点的稳定版CUDA按项目需求选但要确保满足最低驱动要求。1.2 三种安装路径选错就是给自己挖坑在Linux上装Nvidia驱动市面上流行的路子大概有三条通过发行版软件源安装比如Ubuntu的apt install nvidia-driver-xxx。优点是省事缺点是版本往往落后于官网而且有时候会跟系统自带的开源驱动nouveau抢位置踩过坑的都懂。通过Ubuntu自带的附加驱动图形界面安装。这个适合电脑上有桌面环境、又不想敲命令的人。它会自动检测硬件和可用驱动版本选好之后点应用就行但实际上该踩的坑一个也不会少尤其是内核更新之后驱动失效的问题。从Nvidia官网下载.run文件手动安装。这看起来最麻烦但其实流程最透明、版本最可控出了问题也最容易定位。我自己主力推荐这条路。后面我会以官网.run安装为主把每一步拆细因为只要这条路走通了其他所有方式你都能看懂问题出在哪。1.3 先搞清楚自己的显卡型号和系统环境不管选哪条路第一步永远是确认硬件。用lspci | grep -i nvidia可以查看显卡型号用uname -r查内核版本用cat /etc/os-release查看发行版版本。lspci | grep -i nvidia uname -r cat /etc/os-release别小看这几个命令。我遇到过太多人问为什么我的驱动装不上结果一看显卡是GT 710这种老古董系统却装的是Ubuntu 24.04Nvidia官方驱动已经停止支持了还有人拿笔记本双显卡IntelNvidia用这个流程直接黑屏因为没有处理混合显卡的问题。确认硬件型号之后去Nvidia官网的驱动下载页面查一下这个型号的最新支持版本不要闭着眼睛下最新版老卡用新驱动反而可能直接不支持。2. 环境准备别急着装坑都埋在前面2.1 老老实实禁用nouveau开源驱动这是整个流程里最容易被跳过、但最关键的一步。Linux内核自带一个开源的Nvidia驱动叫nouveau系统里没有独立Nvidia驱动的时候它自动接管显卡。但nouveau的性能只有官方驱动的几分之一而且会和官方驱动的内核模块直接冲突。如果你不先禁用nouveau装官方驱动的时候大概率报错或者装了之后根本加载不了。禁用方法很简单。编辑/etc/modprobe.d/blacklist-nouveau.confsudo bash -c echo blacklist nouveau /etc/modprobe.d/blacklist-nouveau.conf sudo bash -c echo options nouveau modeset0 /etc/modprobe.d/blacklist-nouveau.conf然后更新initramfs让配置生效sudo update-initramfs -u做完这步之后建议重启一次。重启完执行lsmod | grep nouveau没有任何输出就说明禁用了。如果还有输出说明没禁干净你得检查一下是不是有别的模块管理工具比如某些发行版用的modprobe.d目录里还有其他配置文件把它拉起来了。注意如果你用的是带图形界面的系统禁用nouveau之后到安装官方驱动之前画面分辨率可能会变差这是正常现象不用担心。2.2 把编译环境装齐避免中途报错Nvidia官方驱动在安装时需要编译内核模块这意味着你的系统里得有完整的编译工具链和当前内核对应的头文件。缺任何一个安装程序都会在编译那一步停下来非常烦人。sudo apt update sudo apt install -y build-essential dkms linux-headers-$(uname -r)build-essential包含了gcc、make这些基础工具linux-headers-$(uname -r)是当前内核的头文件编译模块必需dkms则是个好东西它能让内核更新的时候自动重新编译Nvidia驱动模块避免一升级内核驱动就挂掉的尴尬。顺便说一句很多人装完驱动之后不敢升级内核就是因为当初没装dkms。装了之后内核升级时驱动模块会自动适配新内核省心很多。这个习惯我从第一次被内核更新搞崩驱动之后就养成了强烈建议你也养成。2.3 Secure Boot是个隐形拦路虎这个坑藏得最深。现在很多主板出厂默认开启UEFI安全启动Secure Boot而Nvidia驱动模块因为没有签名在Secure Boot开启的状态下会被系统拒绝加载。表现就是你会发现驱动明明装好了nvidia-smi却照样报错或者重启后直接给你甩一个MOK之类的提示。解决办法有两个进BIOS关掉Secure Boot。这是最简单粗暴的办法。对于个人用的电脑关掉没什么实际风险。给模块签名并注册MOK。如果你因为某些原因不能关Secure Boot那么在安装驱动的时候Nvidia的安装程序会询问你是否注册一个Machine Owner KeyMOK按提示设置一个密码重启之后在蓝屏界面选择Enroll MOK输入密码确认即可。我个人建议普通用户直接关机进BIOS关Secure Boot省事还能顺便排除一个变量。3. 正式安装Nvidia驱动runfile路线全流程3.1 先卸载系统里残留的Nvidia相关软件很多人装驱动失败是因为系统里已经存在旧版本的Nvidia驱动或者关联软件但没有清理干净。新老驱动打架最后谁也不干活。所以无论你是第一次装还是重装我建议先执行一遍清理sudo apt purge -y nvidia-* libnvidia-* cuda-* sudo apt autoremove -y注意apt purge nvidia-*这个通配符可能匹配不到某些包如果你之前用.run方式装过驱动最好再执行sudo nvidia-uninstall如果提示没有这个命令说明之前不是用runfile装的跳过就行。这一套做完之后再检查一下lsmod | grep nvidia确保没有任何Nvidia内核模块还在加载。有的话就sudo modprobe -r把它们逐个卸载实在卸不掉就重启再试。3.2 官网下载runfile并停止图形界面服务去Nvidia驱动下载官方页面按你的显卡型号和系统架构64位Linux搜索下载最新的稳定版驱动。文件名大概是NVIDIA-Linux-x86_64-550.xxx.xx.run这样的格式。安装runfile之前必须先把图形服务停掉否则安装程序会卡在X server is running这一步。先按CtrlAltF3有的机器是F2到F6多试几个切换到纯命令行终端然后登录你的用户执行sudo systemctl stop gdm3 # Ubuntu 20.04/22.04用gdm3更早的版本可能是lightdm有的系统没有systemd用的是service命令或者init.d脚本那就用相应的方式停掉显示管理器。如果你的机器上跑的连桌面环境都没有那就不存在这一步直接往下走。3.3 运行安装程序注意关键参数给.run文件添加执行权限并运行chmod x NVIDIA-Linux-x86_64-550.xxx.xx.run sudo ./NVIDIA-Linux-x86_64-550.xxx.xx.run --no-cc-version-check --silent我不想把参数解释得太复杂就列几条最重要的--no-cc-version-check跳过gcc版本检查。很多系统预装的gcc年龄比驱动要求的年轻不跳过会直接拒绝安装。--silent静默安装全程不需要交互。适合你已经明确知道要装什么的情况。不加参数直接运行的话安装器会问你一长串问题要不要装32位兼容库要不要跑nvidia-xconfig我的建议是32位兼容库看需要跑游戏和Wine才需要nvidia-xconfig选No其他默认就行。安装结束后执行sudo nvidia-xconfig这条命令会生成/etc/X11/xorg.conf确保系统启动的时候能正确加载Nvidia驱动。如果你用的是无桌面环境的纯服务器这一步可做可不做。3.4 重启验证nvidia-smi的初体验装完之后重启sudo reboot重启回来之后打开终端跑这个命令nvidia-smi正常情况下你应该能看到一张表格上面有显卡型号、驱动版本、显存占用情况等。如果看到表格恭喜你驱动这一步算是过了。如果报错nvidia-smi has failed because it couldnt communicate with the nvidia driver那就说明驱动模块没有加载成功这个报错实在太常见了我在后面专门写一节排查。4. CUDA Toolkit的安装与配置4.1 下载CUDA看清楚再勾选驱动装好之后CUDA就相对简单了。去Nvidia的CUDA Toolkit下载页面选择你的操作系统、发行版和架构它会生成对应的安装命令。这里有个细节需要注意安装方式选runfile (local)而不是deb包。原因很简单deb包会把Nvidia驱动也一起装上容易跟你刚才精心装好的驱动打架而runfile方式可以选择不装驱动只装CUDA本体互不干扰。下载完执行sudo sh cuda_12.4.0_550.54.14_linux.run注意看文件名cuda_12.4.0_550.54.14_linux.run里的550.54.14就是这个CUDA版本要求的最低驱动版本号。运行之后会闪现一个协议说明按q跳过然后进入安装选项界面务必去掉Driver那一项的选中状态只保留CUDA Toolkit和CUDA Samples示例代码。这一点非常关键我之前就是因为没取消Driver直接把之前装的驱动覆盖了结果版本被降级又花了大半天才搞回来。4.2 配置环境变量让系统找到CUDACUDA默认安装到/usr/local/cuda这是一个软链接真实指向/usr/local/cuda-12.4这样的具体版本目录。这样设计的好处是你装多个CUDA版本时可以通过切换软链接来切换默认版本。接下来配置环境变量。编辑~/.bashrcexport PATH/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH/usr/local/cuda/lib64:$LD_LIBRARY_PATH保存后执行source ~/.bashrc然后验证nvcc --version看到输出里有Cuda compilation tools, release 12.4, V12.4.xx就说明CUDA装好了。4.3 开发环境验证编译一个示例程序光有版本号还不算完最好实际编译运行一个示例程序。CUDA安装包自带了Samples路径在/usr/local/cuda/samples。先让它编译一遍cd /usr/local/cuda/samples sudo make -j$(nproc)这个编译过程会持续几分钟期间你可以去喝杯水。编译完成后找一个最经典的示例跑一下cd /usr/local/cuda/samples/bin/x86_64/linux/release ./deviceQuery看到结尾出现Result PASS就大功告成。如果deviceQuery能通过说明你的CUDA开发环境完全可用可以开始跑深度学习框架或者写自己的GPU程序了。4.4 多版本CUDA共存与切换实际做项目的时候难免会遇到一个项目要CUDA 11.8另一个要CUDA 12.1的情况。这时候不需要反复卸载安装直接把两个版本都装上就行。装第二个版本时同样用runfile、同样不选Driver它会装到/usr/local/cuda-11.8这样的独立目录。然后你需要手动控制/usr/local/cuda这个软链接指向哪个版本sudo rm -f /usr/local/cuda sudo ln -s /usr/local/cuda-11.8 /usr/local/cuda切换完记得重新source ~/.bashrc然后nvcc --version确认当前生效的版本。用这个办法切版本比重装省事一万倍。5. 常见问题排查与避坑实录5.1 nvidia-smi通信失败的真正原因这个报错出现的频率极高错误信息是NVIDIA-SMI has failed because it couldnt communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.这句话的意思很直白——用户态的命令行工具找到了但内核里的驱动模块没起来。排查顺序应该是先看模块加载状态lsmod | grep nvidia如果什么都没有说明模块没加载。手动加载试试sudo modprobe nvidia如果提示modprobe: ERROR: could not insert nvidia: No such device说明系统根本没识别到GPU可能是nouveau没禁干净或者Secure Boot拦住了模块。去查dmesg | grep -i nvidia看有没有具体报错。如果modprobe能成功但重启后又失效那多半是dkms没配好。重新安装dkms并重建模块sudo dkms install -m nvidia -v 550.xxx.xx如果你当初安装驱动时没装dkms建议重装一次驱动这次带上dkms。5.2 CUDA runfile报gzip压缩数据错误有相当一部分人下载CUDA之后运行时遇到./cuda_12.4.0_550.54.14_linux.run: 1: ./cuda_12.4.0_550.54.14_linux.run: gzip: stdin: invalid compressed>sudo nvidia-xconfig sudo cp /usr/share/X11/xorg.conf.d/10-nvidia.conf /etc/X11/xorg.conf.d/ 2/dev/null sudo reboot如果还不行就检查/usr/lib/xorg/modules/extensions/目录下有没有libglxserver_nvidia.so这个文件。没有的话说明驱动没装完整重装一次驱动。5.4 重启后驱动失效的内核更新问题内核升级之后驱动失效这是apt安装驱动方式最容易遇到的问题。如果你用的是.run方式安装且没装dkms那你只能在每次内核更新后手动重装驱动。解决思路有两个要么就是上面说的安装时加dkms让驱动模块跟随内核自动重建要么就是锁定内核版本不轻易升级。我个人比较推荐前者因为锁定内核版本虽然省事但会让系统停留在旧内核安全性有隐患而且新硬件支持也跟不上。5.5 常见问题速查表问题现象可能原因解决方案nvidia-smi通信失败模块未加载、nouveau冲突、Secure Boot拦截检查modprobe、确认nouveau已禁用、关闭Secure Boot或注册MOKgzip压缩数据错误下载文件损坏重新下载并校验MD5GLX模块加载失败Xorg配置问题、驱动文件缺失运行nvidia-xconfig重新生成配置循环登录进不了桌面驱动与系统不兼容切到命令行重装驱动或退回上一个驱动版本内核更新后驱动失效缺少dkms支持重装驱动并安装dkmsCUDA装完nvcc找不到环境变量没配置检查PATH是否包含/usr/local/cuda/bin6. 写在最后的几点实在建议这套流程我前前后后用了五六年从Ubuntu 18.04到24.04从RTX 2060到RTX 4090从单卡到四卡服务器基本没有出过岔子。但有几个习惯我觉得值得再强调一下。一个是在安装任何Nvidia相关组件之前都先确认一下版本之间的兼容关系。驱动版本、CUDA版本、PyTorch/TensorFlow的CUDA要求三者之间是有对应关系的。动手之前花两分钟查一下能避免后面一大堆莫名其妙的问题。另一个是关于备份。如果你系统里有重要的数据或者环境配置动显卡驱动之前做一个快照或者备份代价很小但能在出问题时救命。操作内核模块这种事再熟练的人也有翻车的时候。最后再分享一个小技巧装驱动的时候把整个流程的终端输出保存下来重定向到日志文件里。出问题的时候拿日志对照着排查比对着屏幕上的报错信息干想高效得多。sudo ./NVIDIA-Linux-x86_64-550.xxx.xx.run --no-cc-version-check 21 | tee nvidia-install.log这样一来nvidia-install.log里会记录每一步的关键信息。内核模块编译阶段如果有什么warning或者error全都能看到排查起来有据可查。这篇文章写到的这些坑基本都是我在真实环境里一个一个踩出来的。Linux下装Nvidia驱动和CUDA这事儿吧说难也难说容易也容易——思路理顺了、顺序对了剩下的就是照着走而已。
阅读完成 · 觉得有帮助?
咨询建站