ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

Ubuntu 18.04双显卡笔记本NVIDIA驱动循环登录问题排查与修复指南

Ubuntu 18.04双显卡笔记本NVIDIA驱动循环登录问题排查与修复指南

1. 双显卡笔记本装完驱动就循环登录,问题到底出在哪

如果你手上有一台带核显加独立显卡的笔记本,兴冲冲装完 Ubuntu 18.04,接着按网上教程装 NVIDIA 驱动,重启之后卡在登录界面——输入密码,屏幕一黑,又弹回登录界面,如此反复——那你不是一个人。这个现象在双显卡机器上出现的概率高得离谱,尤其是那些出厂默认开启核显输出、独显按需切换的机型。

我前后在三四台不同品牌的双显卡笔记本上踩过这个坑,每次的表现都略有差异:有的是装完驱动直接黑屏,有的是登录后桌面一闪就退回,还有的是外接显示器能亮但内屏死活进不去。折腾多了才明白,循环登录只是表象,真正的病根在于驱动模块加载顺序、显示管理器与显卡输出通道之间的错配。

这篇文章面向的是这样一类人:你有一台核显加 NVIDIA 独显的笔记本,想在这台机器上跑 Ubuntu 18.04,需要用到独显做计算或者图形加速,但被循环登录、黑屏、驱动装不上这些问题卡住了。我会把整个排查链路、每一步背后的原理、以及我实际验证过的操作步骤完整讲清楚。不管你是刚接触 Linux 的新手,还是装过几次驱动但总在双显卡机器上翻车的老手,都能从里面找到能直接抄的配置和判断方法。

先说一个反直觉的结论:循环登录往往不是驱动没装好,而是驱动装“太全”了。很多人习惯性地把 NVIDIA 驱动、CUDA、cuDNN 一股脑全装上,结果系统在启动时不知道该用核显还是独显来驱动显示管理器,两个驱动抢同一个显示输出,登录会话刚建立就崩溃,于是退回登录界面。理解这一点,后面的所有操作才有方向。

2. 双显卡机器上驱动加载的底层逻辑

2.1 核显和独显在 Linux 下是怎么分工的

要搞懂循环登录,得先明白双显卡机器在 Linux 下的显示输出是怎么走的。绝大多数笔记本的屏幕物理上是接在核显上的,独显负责渲染,渲染完的画面通过一个叫 PRIME 的机制“搬运”到核显再输出到屏幕。这个设计是为了省电——日常办公用核显,需要性能时才唤醒独显。

问题就出在这个“搬运”环节。NVIDIA 的闭源驱动和开源的 nouveau 驱动对 PRIME 的支持方式不一样,而 Ubuntu 18.04 默认装的是 nouveau。当你手动装上 NVIDIA 闭源驱动后,如果配置不当,系统可能让独显直接去驱动显示管理器,但屏幕又物理接在核显上,两边对不上,显示管理器启动失败,于是循环登录。

我实测下来,判断当前是哪张卡在驱动显示,最直接的办法是在能进系统的时候(比如用 recovery 模式或者 tty)跑一句:

lspci -k | grep -A 2 -E "(VGA|3D)"

输出里会显示每张显卡当前绑定的内核驱动。如果 NVIDIA 那张卡绑的是nvidia,核显绑的是i915,说明驱动都加载了;如果 NVIDIA 绑的是nouveau或者干脆没绑,那就是驱动没生效。这个命令是我每次排查的第一步,比瞎猜快得多。

2.2 循环登录的本质:显示管理器启动失败后的重试

登录界面本身是一个叫显示管理器的程序(Ubuntu 18.04 默认是 GDM3)。你输入密码后,GDM3 会尝试启动一个图形会话。如果这个会话在初始化显卡时失败,GDM3 不会报错给你看,而是默默重启会话,于是你又看到登录界面。这就是循环登录的真相。

那为什么显卡初始化会失败?常见原因有三个:一是 NVIDIA 驱动模块没正确编译进内核,二是驱动模块加载了但和核显的 PRIME 配置冲突,三是 Secure Boot 拦截了未签名的驱动模块。这三个原因对应的现象和排查方法完全不同,后面我会逐个拆。

提示:循环登录时不要急着重装系统。先按 Ctrl+Alt+F2 切到 tty 终端,用你的账号密码登录进去,很多排查工作在这里就能做。如果 tty 也进不去,那才需要考虑 recovery 模式。

2.3 为什么 Ubuntu 18.04 特别容易出这个问题

Ubuntu 18.04 用的是 4.15 内核,这个版本对新一代 NVIDIA 显卡和 PRIME 的支持还在完善中。加上 18.04 的软件源里 NVIDIA 驱动版本偏旧,很多人会去官网下.run文件手动装,而.run安装方式最容易和系统自带的 nouveau 冲突。相比之下,用apt从官方源装驱动,虽然版本旧一点,但和系统的集成度高得多,出问题的概率小很多。

我的建议很明确:能用 apt 装就别用 .run。除非你有特殊需求必须用某个特定版本的驱动,否则 apt 源里的版本足够日常使用,而且升级、卸载都干净。这一点在后面选型章节还会细说。

3. 装驱动前的准备工作:这几步不做后面必翻车

3.1 确认显卡型号和当前驱动状态

动手之前先把家底摸清楚。跑这两条命令:

lspci | grep -E "(VGA|3D)" ubuntu-drivers devices

第一条列出你的显卡硬件,第二条会告诉你系统推荐装哪个版本的 NVIDIA 驱动。ubuntu-drivers devices这个工具在 18.04 上是自带的,它会根据你的显卡型号给出推荐版本,比如nvidia-driver-390或者nvidia-driver-470。记下这个推荐版本号,后面装驱动就用它。

我遇到过有人显卡是较新的型号,但 18.04 源里只有旧驱动,装完各种问题。这种情况要么升级系统,要么去 NVIDIA 官网查这个型号支持的最低驱动版本,再决定怎么办。别硬装不匹配的版本,那是给自己找麻烦。

3.2 关闭 Secure Boot 还是给驱动签名

Secure Boot 是 UEFI 的一个安全机制,它会拦截没有签名的内核模块。NVIDIA 的闭源驱动模块默认没有签名,所以 Secure Boot 开着的时候,驱动模块加载会被拒绝,表现就是装完驱动重启后显卡没生效,甚至循环登录。

两个选择:一是进 BIOS 关掉 Secure Boot,简单粗暴;二是给驱动模块签名,保留 Secure Boot。我一般推荐关掉,因为签名流程在 18.04 上比较繁琐,而且对大多数个人用户来说 Secure Boot 带来的安全收益有限。关掉的方法因机器而异,一般在 BIOS 的 Security 或 Boot 选项卡里,找到 Secure Boot 设为 Disabled。

注意:关 Secure Boot 之前确认你的系统不是必须依赖它启动的。有些机器开了 Secure Boot 才能正常引导,关掉后反而进不去系统。这种情况就得走签名路线,或者保持 Secure Boot 开启但用 MOK 机制注册密钥。

3.3 禁用 nouveau 驱动的正确姿势

nouveau 是 NVIDIA 显卡的开源驱动,Ubuntu 默认用它。装闭源驱动前必须禁用它,否则两个驱动会打架。禁用方法是创建一个配置文件:

sudo bash -c "echo 'blacklist nouveau' >> /etc/modprobe.d/blacklist-nvidia-nouveau.conf" sudo bash -c "echo 'options nouveau modeset=0' >> /etc/modprobe.d/blacklist-nvidia-nouveau.conf" sudo update-initramfs -u

第一行把 nouveau 加入黑名单,第二行关闭它的 modeset 功能,第三行更新 initramfs 让配置生效。做完这三步必须重启,重启后用lsmod | grep nouveau确认没有输出,才说明 nouveau 真的被禁用了。

这里有个坑:有些人只做了 blacklist 没做update-initramfs,结果重启后 nouveau 还在。因为 initramfs 是启动时加载的临时文件系统,不更新它,黑名单配置不会在启动早期生效。这个细节很多教程都不提,但恰恰是导致失败的高频原因。

4. 驱动安装的三种路线与选型理由

4.1 apt 源安装:最稳但版本受限

这是我最推荐的路线,尤其对双显卡机器。命令很简单:

sudo apt update sudo apt install nvidia-driver-470

把 470 换成ubuntu-drivers devices推荐的那个版本号。装完重启,大概率就能正常进系统。apt 安装的好处是驱动和系统的集成已经做好了,包括 DKMS 自动编译模块、PRIME 配置、显示管理器适配,这些都不用你操心。

缺点是版本可能偏旧。18.04 的源里比较新的是 470 系列,如果你需要更新的特性(比如某些新显卡的支持),就得走别的路线。但对绝大多数场景,470 够用了。

4.2 官方 .run 文件安装:灵活但坑多

去 NVIDIA 官网下载对应型号的.run文件,然后:

sudo telinit 3 sudo sh NVIDIA-Linux-x86_64-xxx.run

telinit 3是切换到文本模式,因为.run安装器不能在图形界面运行。安装过程中它会问你要不要装 32 位兼容库、要不要更新 X 配置,这些选项选错就容易出问题。

.run安装最大的坑是它不会自动处理 DKMS,内核升级后驱动可能失效;而且卸载不干净会残留文件,下次装 apt 版本时冲突。我个人的经验是,除非 apt 源里实在没有你需要的版本,否则别碰.run。

4.3 混合方案:apt 装主驱动加手动补丁

还有一种折中方案:用 apt 装驱动,但手动调整 PRIME 配置或者补装某些组件。比如 apt 装的驱动默认可能没启用 PRIME 同步,你可以手动配置。这个方案适合对系统比较熟、知道自己要什么的人。新手不建议一上来就走这条路,容易把自己绕进去。

三种路线的对比如下:

安装方式优点缺点适用场景
apt 源集成度高、升级方便、卸载干净版本偏旧绝大多数双显卡笔记本
.run 文件版本灵活、可选最新易冲突、升级麻烦apt 源无所需版本时
混合方案兼顾稳定与定制配置复杂有特定需求的老手

5. 循环登录的完整排查链路

5.1 第一步:确认能不能进 tty

循环登录发生后,第一件事是按 Ctrl+Alt+F2 到 F6 中的任意一个,尝试切到文本终端。如果能进去并登录成功,说明系统本身没坏,只是图形会话起不来,问题范围缩小到显卡驱动和显示管理器。如果 tty 也进不去,那可能是驱动把内核搞崩了,需要进 recovery 模式或者用 Live USB 修复。

进 tty 后先看日志:

cat /var/log/Xorg.0.log | grep -i error journalctl -b | grep -i nvidia

Xorg 日志里的错误能直接告诉你 X 服务为什么起不来,常见的有“Failed to initialize the NVIDIA kernel module”或者“No devices detected”。journalctl 里能看到驱动模块加载的详细过程,包括失败原因。

5.2 第二步:检查驱动模块是否真的加载了

在 tty 里跑:

lsmod | grep nvidia nvidia-smi

如果lsmod没有任何 nvidia 相关输出,说明驱动模块根本没加载。原因可能是 Secure Boot 拦截、模块没编译成功、或者被 nouveau 占着。如果lsmod有输出但nvidia-smi报错,说明模块加载了但和硬件通信有问题,通常是版本不匹配。

我遇到过一次,lsmod显示 nvidia 模块在,但nvidia-smi报“No devices were found”。查了半天发现是 BIOS 里独显被设成了“节能模式”,系统根本没给独显供电。进 BIOS 改成“高性能”或者“自动”就好了。这种硬件层面的设置很容易被忽略。

5.3 第三步:看显示管理器到底在报什么错

GDM3 的日志在/var/log/gdm3/或者用journalctl -u gdm3看。重点找会话启动失败的那几行。如果看到和 GLX、EGL 相关的错误,基本可以确定是显卡驱动和显示管理器的接口对不上。

这时候可以临时换个显示管理器试试,比如装个 lightdm:

sudo apt install lightdm sudo dpkg-reconfigure lightdm

如果换成 lightdm 后能进桌面,说明问题出在 GDM3 和 NVIDIA 驱动的兼容性上。这个判断方法很实用,能帮你快速定位是驱动问题还是显示管理器问题。

5.4 第四步:PRIME 配置是否指向了正确的输出

双显卡机器上,PRIME 的配置决定了画面从哪张卡输出。检查/etc/X11/xorg.conf或者/usr/share/X11/xorg.conf.d/下的配置文件,看有没有把 NVIDIA 设成了主输出。如果屏幕物理接在核显上,但配置让独显做主输出,就会黑屏或循环登录。

正确的做法通常是让核显负责输出,独显负责渲染。可以用xrandr --setprovideroutputsource来设置,或者在 X 配置里明确指定。这个配置在不同机器上差异较大,需要结合具体硬件调。

6. 我实际验证过的修复方案

6.1 方案一:彻底清理后重装 apt 驱动

这是最通用、成功率最高的方案。步骤如下:

sudo apt purge nvidia-* sudo apt autoremove sudo apt install nvidia-driver-470 sudo reboot

关键是第一步要 purge 干净,把之前装的所有 NVIDIA 相关包都删掉,包括.run安装残留的库文件。purge 完重启一次,确认系统用 nouveau 能正常进桌面,再装新驱动。这个“先回到干净状态”的思路很重要,很多人直接在乱糟糟的环境上重装,问题依旧。

6.2 方案二:手动指定 PRIME 输出源

如果驱动装好了但循环登录依旧,试试手动配置 PRIME。在 tty 里创建/etc/X11/xorg.conf.d/10-nvidia-prime.conf:

Section "OutputClass" Identifier "nvidia" MatchDriver "nvidia-drm" Driver "nvidia" Option "PrimaryGPU" "no" EndSection

PrimaryGPU设为no是告诉系统别让独显做主输出,交给核显。这个配置在我测试的几台机器上都有效,尤其是那些屏幕接核显的机型。

6.3 方案三:内核参数里加 nomodeset 应急

如果连 tty 都进不去,可以在 GRUB 启动菜单里按e编辑启动项,在linux那行末尾加nomodeset,然后 Ctrl+X 启动。nomodeset会禁用内核的显卡模式设置,让系统用最基本的显示方式启动,通常能进桌面。进去之后再慢慢修驱动。

nomodeset是应急手段,不是长久之计,因为它会禁用显卡加速。但作为救援入口,它非常有用。修好驱动后记得把这个参数去掉。

6.4 方案四:换用开源驱动或软件渲染兜底

如果折腾半天独显驱动就是搞不定,而你的工作又不需要独显性能,可以干脆用 nouveau 或者软件渲染。删掉 NVIDIA 驱动,让系统回到 nouveau,虽然性能差,但至少能用。对于只是写代码、跑跑轻量任务的场景,这个选择完全合理。

7. 装完之后必须做的验证和收尾

7.1 确认独显真的在工作

装完驱动重启进桌面后,跑:

nvidia-smi glxinfo | grep "OpenGL renderer"

nvidia-smi能列出显卡信息就说明驱动正常。glxinfo看当前 OpenGL 渲染器是哪张卡,如果是 NVIDIA 说明独显在参与渲染。这两个命令是我每次装完驱动的验收标准,缺一不可。

7.2 处理内核升级后的驱动失效

用 apt 装的驱动走 DKMS,内核升级后会自动重新编译模块,一般不用管。但如果你用的是.run装的,内核一升级驱动就失效,得手动重装。这就是我反复强调优先用 apt 的原因之一。

7.3 备份一份能用的配置

驱动调通之后,把/etc/X11/xorg.conf.d/下的配置、/etc/modprobe.d/里的黑名单文件都备份一份。下次系统出问题或者重装,直接恢复这些配置能省大量时间。我自己的习惯是把这些文件放到一个专门的目录,配上说明文档,换机器时直接拷过去。

8. 几个容易忽略的细节和我的经验之谈

第一个细节是外接显示器的影响。有些双显卡机器接着外接显示器时,显示输出的拓扑会变,导致原本能用的配置失效。如果你循环登录发生在接了外显之后,先拔掉外显再试。这个我踩过,查了半天驱动,结果是外显的锅。

第二个细节是BIOS 里的显卡模式。不少笔记本 BIOS 里有“独显直连”和“混合输出”的选项。独显直连模式下,屏幕直接接独显,这时候 PRIME 配置的逻辑完全不同。搞清楚你的机器是哪种模式,配置才能对。这个选项的名字因厂商而异,有的叫“Graphics Mode”,有的叫“Display Mode”。

第三个细节是驱动版本和 CUDA 版本的对应关系。如果你装驱动是为了跑 CUDA,那驱动版本不能随便选,得和你要用的 CUDA 版本匹配。比如 CUDA 11.x 需要 450 以上的驱动。这个对应表在 NVIDIA 官方文档里有,装之前查一下,免得装完发现 CUDA 跑不起来又得重装。

第四个细节是日志里的时间戳。排查循环登录时,日志里会有大量历史记录,用journalctl -b只看本次启动的日志,能过滤掉干扰信息。这个技巧能让你在几百行日志里快速找到关键错误。

最后说个我自己的体会:双显卡机器装驱动,耐心比技术重要。每次只改一个变量,改完重启验证,记录下每次的结果。最怕的是一次改一堆配置,出了问题不知道是哪个引起的。我现在的习惯是准备一个笔记本,每步操作和结果都记下来,翻车了能快速回退。这套方法看起来笨,但在我折腾过的所有机器上,它都是最快到达终点的路径。

RELATED READING

延伸阅读

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