显卡驱动这件事,说难不难,说简单也真不简单。尤其是Arch Linux用户,装驱动走错了路,轻则桌面起不来,重则开机直接黑屏只能chroot进去抢救。我这个在Arch上折腾了多年的老用户,踩过的坑加起来能绕台式机一圈。今天把这几年攒下的经验全部摊开写清楚,从选驱动类型到实操命令,再到多系统引导注意事项和深度学习环境避雷指南,一篇帮你把Arch Linux的GPU驱动彻底搞定。
1. 动手之前先搞清楚:你的显卡到底需要什么驱动
1.1 硬件识别是第一步,别上来就装包
很多人拿到Arch的第一件事就是pacman -S nvidia,全程不带犹豫。但问题来了,如果你是一台只有核显的笔记本,或者是一块AMD老显卡,装NVIDIA驱动不仅没用,还可能直接把系统搞挂。
先花一分钟摸清家底。我每次装完系统第一件事永远是跑这条命令:
bash复制lspci -k | grep -A 1 -E "VGA|3D"
输出结果会告诉你显卡的准确型号和当前使用的内核驱动模块。比如我的一台工作机上输出是这样的:
code复制01:00.0 VGA compatible controller: NVIDIA Corporation GA106 [GeForce RTX 3060 Lite Hash Rate] (rev a1)
Subsystem: Micro-Star International Co., Ltd. Device 3a0b
Kernel driver in use: nouveau
看到Kernel driver in use: nouveau就说明现在系统正在用NVIDIA的开源驱动nouveau。如果你的发行版是默认带桌面环境的Arch ISO安装器装的,桌面能跑起来多半靠的就是nouveau或者AMD的开源驱动。
另外强烈建议再用lspci -v看一下显存大小和总线信息,特别是多显卡用户(比如NVIDIA独显加Intel核显,或者A卡加N卡混插),后续配置PRIME Offload或者双卡切换的时候这些信息能救命。
1.2 三大主流选择:开源、闭源、还是软件渲染
搞清楚硬件之后,就要决定用哪条驱动路线了。Arch Linux生态下的GPU驱动方案基本分三类,我一张表给你列清楚:
| 驱动方案 | 适用显卡 | 性能表现 | 推荐场景 | 维护难度 |
|---|---|---|---|---|
| nouveau(NVIDIA开源驱动) | NVIDIA全系 | 较弱,功耗控制差 | 临时救急、纯桌面使用 | 低 |
| NVIDIA官方闭源驱动 | NVIDIA全系 | 强,完整CUDA支持 | 游戏、深度学习、CUDA开发 | 中 |
| AMDGPU(AMD开源驱动) | AMD GCN及以上 | 强,性能接近闭源 | 日常、游戏、ROCm计算 | 低 |
| Mesa软件渲染(llvmpipe) | 任何显卡 | 极弱 | 无显卡环境、应急排查 | 低 |
先说结论:我的选择是NVIDIA显卡一律上闭源驱动,AMD显卡直接用内核自带的AMDGPU模块外加mesa用户态,Intel核显什么都不用装。这个组合我在Arch上用了五年,稳定性没出过大问题。
为什么NVIDIA显卡不推荐nouveau?原因很现实,NVIDIA官方从来没有给nouveau开放完整的硬件文档,导致nouveau的功耗管理和性能调度始终跟不上。最典型的问题是nouveau下显卡风扇转速策略几乎是摆设,核心温度在低负载时也能飙到七八十度。你可以试试开机后只开一个终端执行sensors命令看温度,用nouveau驱动时待机温度能比闭源驱动高二十度,这不是夸张,是常态。
AMD显卡的情况恰好相反,AMD官方把文档放得比较开,内核的amdgpu驱动加上mesa的radv、radeonsi用户态驱动,性能基本能追上闭源方案。费用为零,功耗控制也正常,没理由不上。ROCm深度学习栈现在也主要走AMDGPU这条路,做AI推理和微调都够用。
1.3 集成显卡与独显的取舍
笔记本和高性能台式机往往会遇到核显和独显并存的情况。Arch下最省心的处理方式是:桌面和日常应用交给核显,需要算力时用独显,这就是PRIME Offload方案。
以N卡加Intel核显为例,用闭源驱动时安装nvidia-prime包后,你只需要在运行3D应用时加一句话:
bash复制prime-run glxinfo | grep "OpenGL renderer"
prime-run会帮你在后台完成独显切换到NVML上下文,比传统bumblebee方案稳定得多。我实测过同样的浏览器硬解视频,核显软解和独显硬解CPU占用率能差三十个百分点,所以日常轻负载任务让核显跑反而省心。
AMD家的方案是amd-vulkan-prefixes或者直接用DRI_PRIME=1环境变量,效果一样。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 驱动安装的正经姿势
2.1 NVIDIA闭源驱动安装全流程
确定好方案后,安装就变得很直接。Arch社区维护的闭源驱动包有几个分支,我列一下对应关系:
nvidia: 对应当前最新的稳定版(适用于较新显卡)nvidia-lts: 对应linux-lts内核版本,适合重度依赖LTS内核的用户nvidia-dkms: DKMS版本,自动适配你系统里所有已安装的内核,多内核切换用户的必选项nvidia-470xx-dkms、nvidia-390xx-dkms: 老卡专用版本,只有这些分支还支持旧架构的GPU
我的习惯是优先选择nvidia-dkms。理由很简单,Arch滚动的内核版本更新很频繁,如果用非DKMS版本,每次内核大版本升级你都要等官方同步维护,中间空窗期里图形界面极有可能起不来。DKMS会在内核升级后自动重新编译驱动模块,整个过程无人值守,体验好很多。
安装命令:
bash复制sudo pacman -S nvidia-dkms nvidia-utils lib32-nvidia-utils nvidia-settings
nvidia-utils提供运行时库和nvidia-smi工具,lib32-nvidia-utils是32位兼容库,跑Steam的Windows兼容层游戏时必备,nvidia-settings是图形化控制面板。
如果你是装在UEFI环境且开启了Secure Boot,那就得多一步——给驱动模块签名。我的做法是下载shim-signed和mokutil,然后手动签发:
bash复制sudo pacman -S shim-signed mokutil
sudo mokutil --import /path/to/your/MOK.der
重启后按屏幕提示在蓝色界面里确认import操作即可。如果不开Secure Boot,这步可以跳过。另外还有一点,装完闭源驱动一定要把nouveau拉黑,不拉黑的话两个驱动会争抢设备,表现为开机闪屏、xorg日志报错Failed to load module "nvidia"。
创建这个文件:
bash复制sudo vim /etc/modprobe.d/blacklist-nouveau.conf
内容就两行:
code复制blacklist nouveau
options nouveau modeset=0
然后重新生成initramfs:
bash复制sudo mkinitcpio -P
2.2 mkinitcpio hooks配置里的大坑
很多人装完NVIDIA驱动重启就黑屏,多半不是驱动本身的问题,而是没有在mkinitcpio的hooks里加上nvidia模块。
编辑这个文件:
bash复制sudo vim /etc/mkinitcpio.conf
找到MODULES=(...)这一行,把nvidia加进去:
code复制MODULES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm)
然后重新生成initramfs:
bash复制sudo mkinitcpio -P
为什么必须加这几个模块?因为这些是NVIDIA驱动提供的内核模块,它们的作用是接管内核的DRM显示管理。不加nvidia_drm的话,Xorg和Wayland启动时可能无法通过内核模式设置(KMS)初始化显卡,自然就黑屏了。
如果你使用Plymouth或需要开机图形化过渡画面,还需要在/etc/default/grub的GRUB_CMDLINE_LINUX_DEFAULT中追加:
code复制nvidia-drm.modeset=1 nvidia-drm.fbdev=1
然后执行sudo grub-mkconfig -o /boot/grub/grub.cfg让GRUB重新生成配置。fbdev=1参数是近期NVIDIA驱动新增的帧缓冲设备支持,主要用于优化TTY终端的显示效果,尤其是在Wayland会话下能让登录前和登录后的切换更顺畅。
2.3 AMD显卡的做法——什么都不用做?
如果你的是AMD的GCN或RDNA架构显卡,那么驱动这块反而最省事:内核自带amdgpu模块,用户态依赖mesa。你只需要确认装了基础包:
bash复制sudo pacman -S mesa lib32-mesa vulkan-radeon lib32-vulkan-radeon
如果要做OpenCL加速(比如用Blender渲染或者做一些异构计算实验),再装rocm-opencl-runtime和rocm-hip-sdk系列。
确认一下amdgpu是否已加载:
bash复制lsmod | grep amdgpu
有输出就说明内核识别到了。没有的话,检查是否在dmesg里有unknown chipset之类的报错,老显卡可能需要加amdgpu.cik_support=1 amdgpu.si_support=1启动参数。
2.4 Intel核显的补充说明
Intel核显是x86平台上兼容性最好的方案,基本上内核启动后就能用。但如果你的输出接口在主板上一片空白,只有核显有显示接口,而桌面环境分辨率不正常,先检查xf86-video-intel是不是装了。坦白说这个包在新内核上反而容易和modesetting驱动冲突,我建议直接把xf86-video-intel卸载,让Xorg走自带的modesetting就好。
3. 多系统引导中驱动配置的剪不断理还乱
3.1 双系统下NVIDIA驱动的特殊处理
同时装了Windows和Arch的用户,重启切换系统时最怕的其实是gpu crash dump triggered这个错误。这不是Linux端的锅,而是Windows快速启动(Fast Startup)把显卡固件状态带进了休眠文件,Linux这边加载驱动时检测到异常状态,直接触发了重置流程。
解决思路有两步。第一步是到Windows的电源选项里把快速启动关掉:
code复制控制面板 -> 电源选项 -> 选择电源按钮的功能 -> 更改当前不可用的设置 -> 取消勾选启用快速启动
第二步是在GRUB启动项里加入acpi_osi=Linux参数,让ACPI固件在Linux环境下走一套更干净的初始化路径。修改同样在/etc/default/grub,然后重新生成GRUB配置。
另外Windows和Arch双系统还有一个坑:NVIDIA驱动的GSP固件缓存目录在两套系统下并不互通。如果你发现从Windows切回Arch后,第一次启动的nvidia-smi输出会卡住或者报错,建议先手动清一下驱动缓存再启动服务:
bash复制sudo rm -rf /var/cache/nvidia-gsp/*
sudo systemctl restart nvidia-powerd
这个操作不会影响什么核心数据,但能让切换系统后的第一次图形会话干净很多。
3.2 GRUB引导顺序与显卡参数传递
多系统引导有个很烦人的现象:GRUB引导菜单里Windows会被识别成Windows Boot Manager,但如果你改了GRUB的主题或字体,Windows项的分辨率会异常。这其实也是显卡驱动初始化顺序导致的。解决办法是在GRUB_GFXMODE里明确指定分辨率,并避免在GRUB阶段加载高分辨率主题。
我自己的/etc/default/grub里配置是:
code复制GRUB_GFXMODE=1920x1080
GRUB_GFXPAYLOAD_LINUX=keep
这行配置的作用是让GRUB在引导阶段就用1080p的分辨率加载,再把模式继承给即将启动的Linux内核。如果显卡不支持这个分辨率,GRUB会自动回退到系统固件提供的可用模式,一般不会有太大问题。
3.3 针对一些诡异启动问题的排查
有人反映Arch安装在双系统环境下,开机直接卡在Loading Linux linux...,等几秒后就重启了。这大概率是内核启动参数里少了A暂不相关的不确定项,但对NVIDIA用户来说,一个被广泛验证的原因是amdgpu模块和nvidia模块同时加载后产生的中断冲突。如果你的机器是A卡N卡混插,建议在/etc/mkinitcpio.conf的MODULES里明确指定启动顺序,把主显卡对应的模块放在最前面:
code复制MODULES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm)
同时注意/etc/modprobe.d/里不要出现对drm_kms_helper模块的重复配置,减少干扰面。
4. 驱动装完怎么验证、怎么发挥全部性能
4.1 确认驱动真的在工作
重启进系统后,我习惯按顺序执行几条命令:
bash复制nvidia-smi
glxinfo | grep "renderer string"
lsmod | grep nvidia
nvidia-smi能正常打印显卡型号、驱动版本、显存和温度,就说明GPU内核驱动和用户态工具都接上了。glxinfo里的renderer字符串如果是NVIDIA的型号名称,说明OpenGL用户态库也工作正常。
AMD这边对应的是:
bash复制vulkaninfo | grep deviceName
glxinfo | grep "renderer string"
如果在输出里看到llvmpipe,那说明用户态驱动没装上,渲染后端退化到了纯CPU软件渲染,性能会惨不忍睹。这种时候回头检查mesa和vulkan-radeon是否装齐,准没错。
4.2 CUDA和PyTorch环境的搭建
如果你是为了跑深度学习买的高端显卡,那么驱动装完只是万里长征第一步。CUDA和PyTorch的环境配置才是重头戏。
以PyTorch为例,Arch的官方仓库里没有pytorch的二进制包,你通常会用conda或者pip来装。给CUDA用户的建议是装驱动时不管你用哪个版本,CUDA Toolkit都跟着驱动的版本走,不需要严格对齐到驱动的小版本号。
验证CUDA是否可用:
bash复制nvidia-smi | grep CUDA
python -c "import torch; print(torch.cuda.is_available())"
如果返回True,恭喜你,环境OK。如果返回False,多半是PyTorch的CUDA运行时和驱动不匹配。Arch上经常出现的坑是:pip安装的pytorch默认带了CUDA 12.x运行时,而系统里的NVIDIA驱动小版本太低,无法运行CUDA 12的二进制。
解决办法很简单,升级驱动到够用的版本:
bash复制sudo pacman -S nvidia-dkms
sudo pacman -Syu
nvidia-utils版本和驱动模块版本是绑定的,升级后nvidia-smi里的CUDA Version会跟着最新稳定走,基本就没问题了。
训练场景下还可以顺手装个nvtop做GPU实时监控:
bash复制sudo pacman -S nvtop
看温度和显存占用比nvidia-smi方便得多。
4.3 性能榨干级配置
驱动装好只是让显卡能动,真正把它跑满还要做几项微调。
第一项是电源模式。NVIDIA显卡默认状态下电源管理倾向于节能,在桌面空载时核心频率压得很低,这是正常现象。但跑深度学习任务时你肯定希望核心和显存频率锁在高位。可以用这条命令永久设置性能模式:
bash复制sudo nvidia-smi -pm 1
-pm 1开启持久化模式后,显存时钟会保持在高频,不再频繁跳变。注意这会导致空载功耗上升,笔记本用户三思而后行,台式机则无脑开就行。
第二项是GPU频率锁定。做实验需要可复现性能数据时,锁频比动态调频靠谱得多。但锁定动作本身会覆盖动态管理,长时间高负载会让风扇策略失效,所以我只建议在固定跑分或调优阶段使用:
bash复制sudo nvidia-smi -lgc 1500,1500
恢复自动调节:
bash复制sudo nvidia-smi -rgc
第三项是关于gpu crash dump triggered之后的恢复。如果你遇到过崩溃,dump目录里会有不少日志文件,这些文件会占用磁盘空间。清理方式:
bash复制sudo rm -rf /var/crash/*
除非你要给NVIDIA提bug,否则这些dump文件没有任何保留价值。
4.4 Ollama和本地大模型推理的注意事项
如果你是用来跑本地大模型推理(比如Ollama),Arch下环境其实很好搭。装好NVIDIA驱动后,Ollama会自动检测到CUDA可用的GPU。你可以通过环境变量强制指定使用哪块显卡:
bash复制CUDA_VISIBLE_DEVICES=0 ollama serve
查看你的GPU是否被模型占用:
bash复制nvidia-smi
这里有个容易忽略的点:Ollama默认会从HuggingFace拉模型权重,而这些权重文件很大,如果你不开代理,下载过程会非常痛苦。另一个值得注意的问题是,Ollama虽然能在驱动上跑,但不代表你的系统满足所有依赖。比如在运行quantized模型时,可能缺少libgomp,这个库在Arch上由gcc-libs提供,确认一下如果没装就补上:
bash复制sudo pacman -S gcc-libs
5. 常见问题与排查技巧实录
5.1 黑屏和白屏的应急处理
最常见也最吓人的问题是装完驱动重启黑屏。这里要分两种情况。
第一种是你的系统还能通过Ctrl+Alt+F2切到TTY终端。那你还能抢救一下,切到TTY后查看日志:
bash复制journalctl -b -1 | grep -i nvidia
sudo dmesg | grep -i nvidia
根据报错信息决定回退驱动版本还是修补配置。我的经验是,如果日志里出现nvrm_file_operations之类的符号找不到,多半是内核头文件版本和DKMS模块编译时的版本不一致,重新安装linux-headers并重建镜像就好:
bash复制sudo pacman -S linux-headers
sudo mkinitcpio -P
第二种情况是连TTY都进不去。这时候件需要一个live USB环境,chroot进原系统,然后根据情况把驱动包换成开源版或者彻底删掉:
bash复制sudo mount /dev/你的根分区 /mnt
sudo arch-chroot /mnt
sudo pacman -R nvidia-dkms nvidia-utils
然后再运行mkinitcpio -P并重新生成GRUB配置。进系统后再重新装回闭源驱动,这次记得先装linux-headers再装nvidia-dkms。
5.2 花屏和撕裂的修复方案
如果你用的是NVIDIA闭源驱动但看到画面撕裂或局部花屏,尤其是用Firefox或Chromium滚动网页时特别明显,这多半和VSync及合成器设置有关。
对Xorg用户,可以在/etc/X11/xorg.conf.d/20-nvidia.conf里加:
code复制Section "Device"
Identifier "Device0"
Driver "nvidia"
VendorName "NVIDIA Corporation"
Option "MetaModes" "nvidia-auto-select +0+0 { ForceFullCompositionPipeline = On }"
Option "AllowIndirectGLXProtocol" "off"
EndSection
ForceFullCompositionPipeline = On这行是重点,它让NVIDIA驱动强制开启全屏合成管线,几乎所有画面撕裂问题都能被它解决。代价是极微小的延迟增加,但对日常使用毫无感知。
Wayland用户则几乎没有这个烦恼,因为Wayland合成器本身强制VSync,画面撕裂天然被消灭。
5.3 待机唤醒后显卡不工作的排查
这个问题在NVIDIA笔记本用户里特别常见。合盖睡眠再唤醒,屏幕亮了但nvidia-smi报错,说Unable to determine the device handle for GPU 0000:01:00.0: Unknown Error。
经验做法是在/etc/systemd/logind.conf里调整suspend类型,让系统醒来后重新初始化整个PCIe设备:
code复制HandleLidSwitch=suspend-then-hibernate
需要说明的是,这不是完美修复,只是降低了发生概率。如果你的笔记本正好是NVIDIA Optimus架构,我建议多关注一下nvidia-powerd服务是否正常运行:
bash复制sudo systemctl status nvidia-powerd
这个服务负责动态电源管理,如果它挂了,睡眠唤醒后的GPU状态多半会出问题。顺手把它设成开机自启:
bash复制sudo systemctl enable --now nvidia-powerd
5.4 常见问题速查表
我把这些年遇到的高频问题整理成了一张表,方便你对照排查:
| 问题现象 | 可能原因 | 快速处置 |
|---|---|---|
| 开机黑屏/紫屏 | nouveau未禁或nvidia模块未进initramfs | 回到TTY执行mkinitcpio -P,确认MODULES含nvidia系列 |
| nvidia-smi报错No devices | GSP固件缓存损坏或驱动版本不匹配 | 清缓存重启,或重装nvidia-dkms |
| PyTorch检测不到CUDA | pip版pytorch的CUDA版本与驱动不兼容 | 升级nvidia-utils,重装pytorch |
| 运行游戏或训练时风扇狂转 | 默认温控策略过于保守 | nvidia-smi -pm 1后配合第三方风扇曲线 |
| 花屏且伴随大量dmesg报错 | Xorg合成管线未开启 | 加ForceFullCompositionPipeline,或换Wayland会话 |
| 双系统从Windows回来就卡住 | Windows快速启动导致固件状态异常 | 关闭快速启动,加acpi_osi=Linux启动参数 |
| 休眠唤醒后GPU无法调用 | 电源管理服务未启用 | 打开nvidia-powerd,换suspend-then-hibernate |
| 画面模糊+多显示器分辨率异常 | GRUB gfxmode不匹配 | 设置GRUB_GFXMODE,配置fbdev=1参数 |
6. 驱动更新与滚动升级的保命技巧
Arch滚动更新的最大痛点就是“某次升级后桌面就起不来”。虽说NVIDIA驱动的官方包更新时间往往比内核更新晚那么一两天,但为了减少意外,我给自己定了几条铁律。
第一条铁律:升级前先看news。Arch的官网地址栏附近有个RSS/News区,每次升级前花十秒钟扫一眼,如果新闻里有关显卡驱动或内核的特别说明,就先等一等再动手。
第二条铁律:永远保留一个可用内核。我会同时安装linux和linux-lts两个内核包,配合DKMS版本的NVIDIA驱动。当新版内核升级后出问题,GRUB里直接选LTS内核启动,日常使用完全不受影响。这是Arch社区最普遍也最有效的容灾手段。
第三条铁律:升级驱动后回退方法要烂熟于心。如果你发现升级后显卡驱动不干活了,最简单的回退方式是让pacman把旧版本装回来:
bash复制sudo pacman -S nvidia-dkms linux-headers
如果downgrade到旧版驱动也需要,可以用downgrade这个AUR工具。但坦白说我在Arch上用过这么多版本,最近两年的NVIDIA驱动很少有必须回退的情况,更多的是自己配置姿势不对引起的连锁反应。
最后再分享一个小技巧。我的习惯是每周给系统做一次快照,工具用timeshift或者snapper都行。特别是升级显卡驱动前,一个几十秒的快照能让你在翻车后两分钟内回到可用状态,比任何排查技巧都管用。说白了,Arch这个发行版给你足够大的自由,但也要求你有足够强的“翻车后站起来”的能力。驱动配置这一关过了,后面的路就顺了——至少在我们显卡用户这个圈子里,见过的坑永远比没见过的多,但每一个坑趟过去,你都对系统的理解又深了一层。
