ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Ubuntu安装NVIDIA驱动卡logo?救援与正确安装指南

Ubuntu安装NVIDIA驱动卡logo?救援与正确安装指南 装NVIDIA驱动这事儿我见过太多人栽在同一道坎上了按教程一步步来下载了官网的.run文件执行安装屏幕闪几下重启结果直接卡在Ubuntu logo界面鼠标还能动但登录界面就是死活出不来。CtrlAltF2想切个终端也完全没反应。这种时候很多人第一反应是系统是不是废了其实系统好好的只是显卡驱动栈出了问题。这篇文章我先把这个装个驱动为什么能把系统装崩的底层原因说清楚再给你三条把系统捞回来的救援路线和三条装NVIDIA驱动的正确姿势最后整理一份高频故障速查表。无论你是刚装了双系统想给RTX显卡装驱动还是深度学习机器上要跑Carla 0.9.15、PyTorch环境这套流程都适用。Ubuntu 20.04到24.04全系通用其他发行版命令略有差异但思路完全一样。1. 卡在logo背后nouveau、官方驱动、initramfs三者的纠葛1.1 卡住那一刻系统到底在干什么先看开机流程BIOS/UEFI - GRUB - 内核 - initramfs - systemd - 显示管理器gdm/lightdm/sddm- 登录界面。卡在logo本质上是systemd在等显示管理器启动而显示管理器起不来开机流程卡在了这一步。显示管理器起不来绝大多数情况是X服务或者Wayland合成器尝试加载显卡驱动模块时失败。这种失败有两种一种是内核加载了不完整的NVIDIA模块模块初始化时报错另一种是模块文件存在但和当前内核版本不匹配或者依赖的固件缺失。无论哪种图形栈都会挂显示管理器自然起不来。很多人容易忽略一个关键点开机时能看到logo和鼠标光标说明内核已经起来了系统文件系统也是好的只是图形栈挂了。所以别慌系统大概率没有真正损坏也值得抢救。1.2 nouveau和NVIDIA官方驱动为什么能装崩系统这个问题得从nouveau说起。nouveau是Linux内核自带的NVIDIA显卡开源驱动社区通过逆向工程维护功能凑合能看性能很差但对大多数不玩图形的人来说够用了。问题是NVIDIA官方驱动和nouveau是互斥的两者用不同的方式控制显卡硬件一旦同时加载轻则花屏、闪屏重则直接卡死。所以NVIDIA官方驱动的安装脚本会自动写一个blacklist-nouveau.conf文件把nouveau拉黑并且重新生成initramfs确保重启后nouveau不会被加载。这个设计本身没问题问题出在安装失败这个环节。我帮人排查过好几次最多的情况是安装脚本在编译内核模块的步骤失败了——因为系统缺少对应的内核头文件或者gcc版本不匹配。但脚本的执行是有顺序的它可能已经写好了nouveau的黑名单甚至已经卸载了系统里旧版NVIDIA驱动然后才在编译环节报错退出。于是你得到一台旧驱动没了、新驱动没装上、nouveau又被拉黑的机器显卡等于没有驱动。在这种情况下显示管理器尝试启动找不到任何可用的显卡驱动就反复重试界面就卡死在logo。还有一个隐蔽的因素是initramfs。initramfs是启动阶段加载到内存里的小型根文件系统里面存放了内核早期启动需要的模块包括显卡驱动。手动装.run驱动时NVIDIA模块装到了/lib/modules/$(uname -r)/updates/dkms目录下但initramfs默认不会自动包含它除非重新执行update-initramfs。很多人改完黑名单直接重启发现nouveau照旧被加载就是因为initramfs里还保留着旧模块。这个机制搞不明白后面排查会很痛苦。2. 先把系统救回来三种救援路线详解2.1 第一优先级切tty和看内核日志开机卡logo后先别急着强制关机试着按CtrlAltF2有些机器是F3到F6。如果能进入纯文本终端恭喜你的系统核心还活着只是显示管理器挂了。登录后第一时间看日志判断挂死原因。dmesg | grep -i -E nv|nouveau|error|fail | tail -50重点看有没有类似这样的输出NVRM: failed to initializenouveau: failed to load或者error关键字。这些直接告诉你驱动加载失败的具体模块。再看显示管理器日志journalctl -u gdm -b --no-pager | tail -50如果gdm服务状态一直是activatingstart直到超时大概率就是显卡驱动初始化卡住。确认原因后按第三章的步骤把nouveau彻底禁用、把坏驱动卸载干净再执行update-initramfs -u然后重启。2.2 Recovery Mode root shell无需密码的救援通道如果tty切不进去那就强制重启按电源键不放等关机后再开机。在BIOS logo消失、进入GRUB菜单的瞬间按住左Shift键传统BIOS模式或者连续按Esc键UEFI模式进GRUB菜单。选择Advanced options for Ubuntu然后选一个带(recovery mode)的内核。等菜单出现后选择root进入root shell。注意此时根文件系统是以只读方式挂载的需要先执行mount -o remount,rw /然后你就可以自由操作了。如果你之前是用apt装的驱动先清理apt purge nvidia-* apt autoremove如果你之前是用官网.run文件装的需要手动清理残留rm -rf /usr/lib/nvidia rm -f /usr/lib/x86_64-linux-gnu/libnvidia*清理完执行update-initramfs -u然后reboot。这一步的目的是把坏的、不完整的驱动全部清走让系统先回到能进桌面的状态再谈重新安装。2.3 GRUB加nomodeset用软件渲染把系统拽起来有时候Recovery模式也进不去或者进去后命令根本跑不动比如双显卡机器在救援模式下花屏。还有一个通用技巧开机进GRUB菜单后选中正常启动的内核按e进入编辑模式。找到以linux开头的那一行通常是倒数第二行在这一行的末尾加上nomodeset nouveau.modeset0然后按F10或CtrlX启动。nomodeset的意思是禁止内核加载显卡的KMS内核模式设置模块显卡会退回BIOS提供的简单帧缓冲显示管理器一般能起来但图形性能很差只有2D渲染而且很卡。这是故意为之因为你的目标是先救活系统不是打游戏。如果加了nomodeset还是黑屏可以把参数改成systemd.unitmulti-user.target这样开机直接进命令行模式完全绕过图形栈。进系统后处理方式同前。注意nomodeset是救援手段不是解决方案。驱动修好之后一定要把/etc/default/grub里新增的参数删掉执行update-grub恢复正常的KMS启动否则NVIDIA驱动不会被加载官方驱动也依赖KMS框架你装完会发现还是黑屏。2.4 终极兜底Live USB chroot修复如果上面三招都无效别绝望还有Live USB兜底。找另一个U盘用Ubuntu官方镜像做启动盘就是你当初装系统的那个U盘也行启动时选择Try Ubuntu进入Live桌面环境。然后在Live系统里把硬盘上的原系统挂载进来用chroot进入原系统修复。命令如下sudo blkid # 确认根分区和EFI分区的设备名比如 /dev/nvme0n1p2 是根分区/dev/nvme0n1p1 是EFI分区 sudo mount /dev/nvme0n1p2 /mnt sudo mount /dev/nvme0n1p1 /mnt/boot/efi sudo mount --bind /dev /mnt/dev sudo mount --bind /proc /mnt/proc sudo mount --bind /sys /mnt/sys sudo chroot /mntchroot进去之后你就在原系统的根目录环境里了可以正常执行apt、update-initramfs这些命令。做完修复输入exit退出chroot然后依次umount卸载挂载拔掉U盘重启。chroot本身不危险它只是在Live系统里借用原系统的环境。真正危险的是在chroot里乱删乱改所以清理NVIDIA相关包之前先看清楚包名和路径别顺手把系统组件一起删了。3. 按下nouveau干净彻底的禁用姿势3.1 黑名单文件怎么写才对先把正确的写文件方式贴出来sudo bash -c cat /etc/modprobe.d/blacklist-nouveau.conf EOF blacklist nouveau options nouveau modeset0 EOF第一行blacklist nouveau让modprobe在加载模块时跳过nouveau第二行options nouveau modeset0是双保险意思是就算模块被加载了也不让nouveau接管显卡显示输出。这里解释一下modeset它是nouveau对显示模式设置的控制不开启KMSnouveau基本就不干活了减少和NVIDIA驱动的冲突。网上很多教程只写了第一行没写第二行。这在绝大多数情况下够用但在某些内核版本上nouveau模块仍然会被其他驱动依赖间接加载第二行能帮你兜底。3.2 update-initramfs -u 为什么省不得写完黑名单文件必须重建initramfssudo update-initramfs -u这一步是重中之重我见过太多人踩这个坑写好了blacklist文件直接reboot结果开机还是卡logo。原因前面说过initramfs里存的是启动早期阶段的模块快照光改/etc/modprobe.d/下面的文件只能影响系统启动后的模块加载而initramfs在早期加载阶段就直接把nouveau装进去了。update-initramfs -u就是把黑名单规则重新打包进initramfs让禁用从开机第一秒就生效。如果你是用apt装NVIDIA驱动这个动作其实会自动完成不需要手动做。但如果你在救援阶段手动改过系统重启前一定要记得跑一次。3.3 怎么确认nouveau真的没了重启后打开终端验证两件事。第一件nouveau消失lsmod | grep nouveau没有任何输出才干净。如果还有输出说明blacklist没生效或者initramfs没更新到位回头检查3.1和3.2两步。第二件确认NVIDIA模块存在lsmod | grep nvidia正常会输出nvidia、nvidia_drm、nvidia_modeset、nvidia_uvm这几个模块。如果只有nvidia没有其他几个可能是驱动没装完整或者当前没有调用GPU不是严重问题nvidia-smi能跑起来就行。另外提醒一下如果你在2.3节加了nomodeset参数在确认驱动装好后编辑/etc/default/grub找到GRUB_CMDLINE_LINUX_DEFAULT那一行把nomodeset和nouveau.modeset0删掉然后执行sudo update-grub。否则NVIDIA驱动永远无法正常初始化。4. NVIDIA驱动一次装成功的三条路线4.1 官方源安装90%的人该首选绝大多数用户我建议直接用Ubuntu官方源里的驱动包安装。这是所有路线里最稳的整个过程不需要手动改黑名单不需要手动编译也不会覆盖系统的OpenGL库。先看系统识别到的显卡和推荐驱动sudo apt update sudo apt install ubuntu-drivers-common ubuntu-drivers devices这个命令会列出机器上所有显卡和可用的驱动包其中带recommended标记的就是Ubuntu根据你的GPU型号识别出来的推荐版本。直接安装推荐版本sudo apt install nvidia-driver-535版本号以ubuntu-drivers devices的输出为准不同显卡推荐的版本可能不一样不必强求535。装完重启执行nvidia-smi验证。这条路为什么稳因为它走的全是apt的依赖管理安装脚本自动完成nouveau黑名单和initramfs重建而且用的是dkms机制管理内核模块。dkms的意思是将来你apt upgrade升级内核内核模块会自动重新编译不会出现内核一升级NVIDIA驱动就失效的经典问题。4.2 PPA版本追求新驱动特性时选它如果你刚买的新显卡官方源里还没有对应的驱动版本或者你确实需要某个较新的驱动特性可以加graphics-drivers PPAsudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update sudo apt install nvidia-driver-550这个PPA是Ubuntu社区维护的NVIDIA驱动源更新速度比官方源快很多新显卡发布后很快就能支持。优点是版本新缺点是可能遇到一些新驱动特有的小问题。对于追求稳定跑深度学习训练的人来说还是官方源更省心除非你的显卡实在太新、官方源装不上。装完同样要重启然后nvidia-smi验证。4.3 官网run文件什么时候用、怎么装才安全}Carla 0.9.15这类自动驾驶仿真软件或者某些CUDA版本对驱动版本有硬性要求时官方源可能不满足不得不去NVIDIA官网下载Linux驱动运行文件以.run结尾。这条路自由度最高坑也最深但按下面这个顺序做基本不会出问题。第一步装好编译工具链和内核头文件sudo apt install build-essential linux-headers-$(uname -r)这一步没有商量余地。run文件安装过程中要在本地编译NVIDIA内核模块没有对应的内核头文件编译必失败。很多人的安装就是栽在这步没有提前装headers装到一半报错退出然后系统就处于一个半坏状态。第二步卸载旧版驱动。如果之前用apt装过执行sudo apt purge nvidia-* sudo apt autoremove如果之前用run文件装过先反安装sudo sh NVIDIA-Linux-x86_64-XXX.run --uninstall第三步确认nouveau黑名单已生效按第三章流程然后停止图形界面sudo systemctl stop gdm这一步很关键run驱动要求X server不能运行否则会拒绝安装或覆盖正在使用的文件。有些人少了这步run文件报了No X server相关的错其实不是错误是它的安全机制在起作用。第四步正式安装sudo sh NVIDIA-Linux-x86_64-550.120.run --no-x-check --no-opengl-files --dkms参数说明--no-x-check跳过X server运行检测因为我们手动停了gdm--no-opengl-files不覆盖系统的OpenGL库文件。这个参数非常重要很多桌面黑屏、崩坏都是因为run文件把系统原有的libGL库替换成了NVIDIA版本和桌面环境的Mesa库冲突--dkms把内核模块交给dkms管理。没有这个参数内核升级后驱动大概率失效又得重装。第五步重启验证。如果nvidia-smi正常说明驱动装好了。装完顺手把下载的.run文件移到自己的目录里管理好别扔在~/Downloads里和一堆其他安装包混在一起。4.4 验证驱动是否真的工作很多人以为执行了安装脚本、屏幕上出现Installation complete就万事大吉了其实验证这步不能省。先看基本信息nvidia-smi正常输出会显示驱动版本、CUDA版本、GPU型号、显存占用和当前温度。如果报No devices were found或者Command nvidia-smi not found说明驱动没装好或者模块没加载。再看OpenGL渲染走的是不是NVIDIAsudo apt install mesa-utils glxinfo | grep OpenGL renderer如果输出是NVIDIA Corporation某某型号说明图形栈正常走加速。如果输出llvmpipe说明用的是CPU软件渲染NVIDIA驱动没接管GPU需要回头检查模块加载情况。5. 高频问题排查与避坑心得5.1 高频故障速查表现象最可能原因处理思路开机卡在logoNVIDIA模块加载失败或nouveau冲突救援模式禁用nouveau、卸载坏驱动、用apt重装登录后黑屏只剩鼠标光标OpenGL库被run文件覆盖重装桌面环境的Mes库或apt重装驱动输入密码后无限循环登录驱动与内核版本不匹配检查dkms状态重建initramfs重装对应版本内核升级后驱动失效没用dkms模块未自动重建安装nvidia-dkms或安装时指定--dkmsnvidia-smi报错modprobe ERRORSecure Boot拦截了模块签名关Secure Boot或用MOK工具签名双显卡笔记本只有核显工作NVIDIA显卡未启用用prime-select切换到nvidia模式装了.run驱动后进不了图形界面忘了加--no-opengl-files或没停gdm恢复shellapt重新安装官方源驱动表格里的最后一项我特别说一下。很多人用.run装驱动装完重启发现图形界面起不来十有八九是没加--no-opengl-files导致系统的OpenGL库被覆盖桌面环境起不来。这时候别慌CtrlAltF2切ttyapt重装官方源的nvidia-driver-xxx或者重装libgl1-mesa-dri、libglx-mesa0这些包多半就能救回来。5.2 内核头文件不匹配新手最容易踩的大坑.run安装过程中报Unable to find the kernel source tree for the currently running kernel或者编译时提示找不到目录基本就是内核头文件缺失。原因其实很简单你的系统里可能有好几个内核版本当前跑的是旧的内核但旧内核的头文件包已经被apt自动清理了。解决办法是先看你当前跑的版本uname -r然后看系统里装了哪些头文件包dpkg -l | grep linux-headers如果跑的是5.15.0-91-generic但只装了5.15.0-89的头文件那就要装当前版本的sudo apt install linux-headers-$(uname -r)装完再执行run安装编译就不会报错了。这个坑在新装系统、apt upgrade后特别容易踩因为重启前apt可能已经把旧内核清理掉一部分。5.3 Secure Boot签名BIOS安全启动和第三方驱动很多预装Windows的机器默认开启Secure Boot。Ubuntu本身能启动但第三方内核模块——包括NVIDIA驱动——需要通过签名校验才能加载。如果BIOS开着Secure Boot驱动模块加载时会被内核拒绝症状是驱动明明装了lsmod里没有nvidiadmesg日志里出现Lockdown: insmod is disabled或者module verification failed。两条解决路线最简单直接的办法是进BIOS关掉Secure Boot。对纯Linux用户来说关闭它没有任何副作用绝大多数发行版也不需要它。如果你想保留Secure Boot比如有些双系统用户担心Windows某些功能受影响用MOKMachine Owner Key工具给NVIDIA模块签名。用apt安装驱动时如果系统提示你设置MOK密码说明走的就是这个流程。注意记住你设置的密码重启后会进入蓝色界面选择Enroll MOK输入密码确认重启生效。如果你装驱动时全程没看到MOK提示但Secure Boot又开着那大概率是Ubuntu的shim启动链阻止了NVIDIA模块签名你现在装了也白装先关掉Secure Boot再重装。5.4 关于nvidia app下载的驱动在哪个文件夹最近总有人问NVIDIA官方客户端下载的驱动到底存在哪了。分两种情况Windows上的新版NVIDIA App下载驱动后默认保存位置通常在C:\Program Files\NVIDIA Corporation\Downloader或者C:\Users\你的用户名\Downloads。用户经常下载完找不到文件可以去这两个地方翻。Ubuntu上从官网浏览器下载的.run驱动默认会落在~/Downloads。如果你下载了多个版本的驱动分不清哪个是最新的用这个命令看一眼ls -lh ~/Downloads/*.run看文件修改时间和大小最新的就是你要装的。另外提醒一句官网下载页有Linux和Windows两个类别请确保选对了Linux再点下载不然下载完发现是个.exe当然装不上。这种尴尬我见过不止一次。还有一个相关的问题下载好的.run文件安装完成后如果你不需要保留直接删掉就行它不会影响已安装的驱动。有些人以为驱动是靠这个.run文件运行的把它删了驱动就没了其实完全是两回事.run只是个安装包。5.5 双显卡笔记本的额外注意点如果你用的是带核显和独显的双显卡笔记本比如Intel核显 NVIDIA独显安装完NVIDIA驱动后可能需要手动切换显卡工作模式。Ubuntu下用prime-select命令sudo prime-select nvidia切到nvidia模式后需要重启才能生效。如果你日常办公用核显跑深度学习或仿真时才需要用独显也可以选择prime-select on-demand模式之后用__NV_PRIME_RENDER_OFFLOAD1 __GLX_VENDOR_LIBRARY_NAMEnvidia前缀运行特定程序让它单独用独显渲染。这个细节在跑Carla这类大型仿真软件时很实用不然你会发现仿真程序虽然能启动但GPU占用率永远是0%。关于NVIDIA驱动我的个人体会是能用apt装的真的别折腾run文件。如果因为特殊需求必须用run记住四个条件缺一不可——内核头文件、禁用nouveau、停止显示管理器、加上--dkms任何一个漏掉都会把你送回卡logo的页面。最后分享一个经验之谈修好之后每次内核升级前先看一眼/var/log/apt/history.log里有没有新的linux-image包。如果升级了新内核重启后用nvidia-smi验证一次再进桌面。装了dkms的话这步基本可以不用管但多看一眼能让你少经历一次开机卡logo的崩溃。装驱动这件事耐心和顺序比什么都重要。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进