24 - 显卡驱动配置
显卡驱动是 Linux 桌面体验的基石。正确配置显卡驱动不仅影响桌面渲染性能,还直接决定了游戏、视频播放、3D 建模等应用的可用性。Arch Linux 提供了灵活的显卡驱动选择,本章将详细介绍 Intel、AMD、NVIDIA 三大平台的驱动安装与调优。
24.1 Linux 图形栈概述
Linux 图形系统由多个层次组成,理解这些层次有助于排查问题。
24.1.1 图形栈架构
┌─────────────────────────────────────────────┐
│ 应用程序(Firefox、游戏等) │
├─────────────────────────────────────────────┤
│ 图形 API(OpenGL / Vulkan) │
├─────────────────────────────────────────────┤
│ 用户空间驱动(Mesa / NVIDIA 闭源) │
├─────────────────────────────────────────────┤
│ 显示服务器(Xorg / Wayland Compositor) │
├─────────────────────────────────────────────┤
│ DRM/KMS(内核模块) │
├─────────────────────────────────────────────┤
│ GPU 硬件 │
└─────────────────────────────────────────────┘
24.1.2 关键组件说明
| 组件 | 说明 |
|---|---|
| DRM(Direct Rendering Manager) | 内核子系统,管理 GPU 资源和内存 |
| KMS(Kernel Mode Setting) | 内核级显示模式设置,控制分辨率和刷新率 |
| Mesa | 开源用户空间图形库,提供 OpenGL/Vulkan 实现 |
| Vulkan | 新一代低开销图形 API |
| Xorg | 传统 X Window 显示服务器 |
| Wayland | 新一代显示协议,更简洁高效 |
| libdrm | 用户空间访问 DRM 的库 |
| GBM(Generic Buffer Manager) | 图形缓冲区管理,Wayland 合成器常用 |
24.1.3 OpenGL vs Vulkan
# 查看当前 OpenGL 信息
glxinfo | grep "OpenGL"
# 查看 Vulkan 支持
vulkaninfo --summary24.2 识别显卡硬件
在安装驱动前,首先需要识别系统中的显卡硬件。
24.2.1 使用 lspci
# 列出所有 VGA 和 3D 控制器
lspci -k | grep -A 3 -E "(VGA|3D)"
# 输出示例:
# 00:02.0 VGA compatible controller: Intel Corporation UHD Graphics 630
# Subsystem: Dell UHD Graphics 630
# Kernel driver in use: i915
# Kernel modules: i915
# 01:00.0 3D controller: NVIDIA Corporation TU117M [GeForce GTX 1650 Mobile]
# Subsystem: Dell TU117M [GeForce GTX 1650 Mobile]
# Kernel driver in use: nvidia
# Kernel modules: nouveau, nvidia24.2.2 使用 lshw
# 需要 root 权限
sudo lshw -C display
# 更详细的信息
sudo lshw -C display -short24.2.3 其他工具
# 使用 hwinfo
sudo pacman -S hwinfo
hwinfo --gfxcard
# 使用 inxi(需要安装)
sudo pacman -S inxi
inxi -G
# 查看当前使用的内核模块
lsmod | grep -E "(i915|amdgpu|nvidia|nouveau|radeon)"
# 查看 DRM 信息
ls /sys/class/drm/
cat /sys/class/drm/card0/device/vendor24.3 Intel 显卡驱动
Intel 集成显卡在 Linux 上的支持最为完善,主要使用开源驱动。
24.3.1 i915 内核模块
i915 是 Intel 集显的内核驱动模块,从 HD Graphics 到最新的 Arc 系列均由此驱动支持(Arc 较新型号使用 xe 模块)。
# 确认 i915 已加载
lsmod | grep i915
# 查看 i915 模块参数
modinfo i915 | grep parm
# 查看当前参数值
systool -m i915 -av 2>/dev/null | head -5024.3.2 用户空间驱动安装
# 安装 Mesa(OpenGL 和 Vulkan 支持)
sudo pacman -S mesa lib32-mesa
# 安装 Vulkan 驱动(Intel ANV)
sudo pacman -S vulkan-intel lib32-vulkan-intel
# 安装 VA-API 硬件视频解码
# Gen 8+ (Broadwell 及更新) 使用 intel-media-driver
sudo pacman -S intel-media-driver
# Gen 7 及更早使用 libva-intel-driver
sudo pacman -S libva-intel-driver
# 安装 OpenCL 支持
sudo pacman -S intel-compute-runtime # Gen 8+
# 或
sudo pacman -S beignet # Gen 7 及更早24.3.3 常用内核参数
在 /etc/default/grub 的 GRUB_CMDLINE_LINUX_DEFAULT 中添加:
# 启用 GuC/HuC 固件(Skylake+,提升性能)
i915.enable_guc=2
# 启用帧缓冲压缩(节省带宽)
i915.enable_fbc=1
# 启用 PSR(Panel Self Refresh,笔记本省电)
i915.enable_psr=1
# 启用 DC 电源状态(省电)
i915.enable_dc=2
# 强制使用特定 GSC 固件
# i915.force_probe=<PCI_ID> # 用于较新的尚未默认支持的型号修改后重新生成 GRUB 配置:
sudo grub-mkconfig -o /boot/grub/grub.cfg24.3.4 Xorg 配置
Intel 集显通常不需要额外的 Xorg 配置,但可以创建配置文件进行优化:
# /etc/X11/xorg.conf.d/20-intel.confSection "Device"
Identifier "Intel Graphics"
Driver "modesetting"
Option "AccelMethod" "glamor"
Option "DRI" "3"
Option "TearFree" "true"
EndSection注意:Arch Wiki 推荐使用
modesetting驱动(xorg 默认)而非xf86-video-intel,后者已不再积极维护。
24.3.5 性能调优
# 查看 GPU 频率信息
cat /sys/class/drm/card0/gt_cur_freq_mhz
cat /sys/class/drm/card0/gt_max_freq_mhz
cat /sys/class/drm/card0/gt_min_freq_mhz
# 临时设置最小频率(提升性能,增加功耗)
echo 1100 | sudo tee /sys/class/drm/card0/gt_min_freq_mhz
# 使用 intel_gpu_top 监控 GPU 使用率
sudo pacman -S intel-gpu-tools
sudo intel_gpu_top24.4 AMD 显卡驱动
AMD 显卡在 Linux 上拥有出色的开源驱动支持。
24.4.1 amdgpu 内核模块
amdgpu 驱动支持 GCN 1.0 及更新的 AMD 显卡(HD 7000 系列及以后)。
# 确认 amdgpu 已加载
lsmod | grep amdgpu
# 查看 amdgpu 模块信息
modinfo amdgpu | grep parm | head -20
# 确认固件已加载
dmesg | grep amdgpu | head -2024.4.2 用户空间驱动安装
# 安装 Mesa(OpenGL 和 Vulkan RADV 驱动)
sudo pacman -S mesa lib32-mesa
# 安装 Vulkan 驱动(RADV,Mesa 实现)
sudo pacman -S vulkan-radeon lib32-vulkan-radeon
# 或使用 AMD 官方 AMDVLK(可选,一般 RADV 更好)
# sudo pacman -S amdvlk lib32-amdvlk
# 安装 VA-API 硬件视频解码
sudo pacman -S libva-mesa-driver lib32-libva-mesa-driver
# 安装 VDPAU 支持
sudo pacman -S mesa-vdpau lib32-mesa-vdpau
# 安装 OpenCL 支持
sudo pacman -S rocm-opencl-runtime # GFX8+
# 或
sudo pacman -S opencl-clover-mesa # 旧卡24.4.3 旧卡 radeon 驱动
GCN 1.0 之前的显卡(HD 2000 ~ HD 6000 系列)使用 radeon 内核模块:
# 确认 radeon 已加载
lsmod | grep radeon
# radeon 驱动对应的用户空间组件
sudo pacman -S mesa lib32-mesa
sudo pacman -S xf86-video-ati # Xorg DDX 驱动
# 启用 radeon 电源管理
echo "radeon.dpm=1" # 添加到内核参数24.4.4 内核参数配置
# /etc/default/grub GRUB_CMDLINE_LINUX_DEFAULT 中添加:
# 启用 OverDrive 超频功能(解锁所有电源管理功能)
amdgpu.ppfeaturemask=0xffffffff
# 强制使用 amdgpu 驱动(针对 GCN 1.0/1.1 可能默认用 radeon 的卡)
radeon.cik_support=0 amdgpu.cik_support=1 # GCN 1.1 (Sea Islands)
radeon.si_support=0 amdgpu.si_support=1 # GCN 1.0 (Southern Islands)
# DC(Display Core)支持
amdgpu.dc=1
# 启用 GPU 恢复
amdgpu.gpu_recovery=124.4.5 性能调优与 OverDrive 超频
# 启用 ppfeaturemask 后,可以调整 GPU 参数
# 查看可用的电源配置文件
cat /sys/class/drm/card0/device/power_dpm_force_performance_level
# 设置性能模式
echo "high" | sudo tee /sys/class/drm/card0/device/power_dpm_force_performance_level
# 查看当前频率和电压表
cat /sys/class/drm/card0/device/pp_od_clk_voltage
# 手动超频示例(需要 ppfeaturemask=0xffffffff)
# 设置 GPU 最高频率为 1600MHz
echo "s 1 1600" | sudo tee /sys/class/drm/card0/device/pp_od_clk_voltage
# 设置显存最高频率为 900MHz
echo "m 1 900" | sudo tee /sys/class/drm/card0/device/pp_od_clk_voltage
# 提交更改
echo "c" | sudo tee /sys/class/drm/card0/device/pp_od_clk_voltage
# 监控 GPU 状态
watch -n 1 cat /sys/class/drm/card0/device/gpu_busy_percent
cat /sys/class/drm/card0/device/hwmon/hwmon*/temp1_input # 温度(毫摄氏度)
cat /sys/class/drm/card0/device/hwmon/hwmon*/fan1_input # 风扇转速
# 使用 radeontop 监控(需安装)
sudo pacman -S radeontop
radeontop24.4.6 使用 corectrl 进行图形化调优
# 安装 corectrl(AUR)
yay -S corectrl
# 添加 polkit 规则以免密码启动
# /etc/polkit-1/rules.d/90-corectrl.rulespolkit.addRule(function(action, subject) {
if ((action.id == "org.corectrl.helper.init" ||
action.id == "org.corectrl.helperkiller.init") &&
subject.local == true &&
subject.active == true &&
subject.isInGroup("wheel")) {
return polkit.Result.YES;
}
});24.5 NVIDIA 显卡驱动
NVIDIA 在 Linux 上的驱动情况较为复杂,闭源驱动性能最佳但配置繁琐。
24.5.1 闭源驱动安装
# 确认 GPU 型号
lspci | grep -i nvidia
# 根据显卡选择驱动包:
# GeForce 900 系列及以上(Maxwell+)
sudo pacman -S nvidia nvidia-utils lib32-nvidia-utils
# 使用 DKMS 版本(推荐,自动为新内核编译模块)
sudo pacman -S nvidia-dkms nvidia-utils lib32-nvidia-utils
# 旧卡驱动(AUR)
# Kepler 系列 (600/700):nvidia-470xx-dkms
# Fermi 系列 (400/500):nvidia-390xx-dkms24.5.2 nvidia vs nvidia-dkms
| 特性 | nvidia | nvidia-dkms |
|---|---|---|
| 编译方式 | 预编译,仅支持当前 linux 内核 | DKMS 动态编译,支持任意内核 |
| 自定义内核支持 | 不支持 | 支持 linux-zen、linux-lts 等 |
| 内核升级 | 自动更新 | 自动为新内核编译 |
| 依赖 | linux-headers 不需要 | 需要对应的 linux-headers |
| 推荐场景 | 仅使用官方 linux 内核 | 使用多内核或自定义内核 |
# 安装 DKMS 版本的完整步骤
sudo pacman -S nvidia-dkms nvidia-utils lib32-nvidia-utils nvidia-settings
# 确保安装了内核头文件
sudo pacman -S linux-headers
# 或对应其他内核
sudo pacman -S linux-zen-headers
sudo pacman -S linux-lts-headers24.5.3 禁用 nouveau
安装闭源驱动后需要禁用开源 nouveau 驱动:
# 通常 nvidia 包会自动处理,但可以手动确认
# /etc/modprobe.d/nvidia.confblacklist nouveau
options nouveau modeset=0
# 重新生成 initramfs
sudo mkinitcpio -P24.5.4 内核参数与 DRM 模式设置
# /etc/default/grub 中添加
# 启用 NVIDIA DRM KMS(Wayland 必须,Xorg 也推荐)
nvidia-drm.modeset=1
# 启用帧缓冲控制台支持(可选,使 TTY 分辨率正确)
nvidia-drm.fbdev=1将 NVIDIA 模块加入 initramfs(早期加载):
# /etc/mkinitcpio.conf
# MODULES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm)# 添加 pacman hook 在驱动更新时自动重建 initramfs
# /etc/pacman.d/hooks/nvidia.hook[Trigger]
Operation=Install
Operation=Upgrade
Operation=Remove
Type=Package
Target=nvidia
Target=nvidia-dkms
Target=linux
Target=linux-headers
Target=linux-lts
Target=linux-lts-headers
[Action]
Description=Updating NVIDIA module in initcpio
Depends=mkinitcpio
When=PostTransaction
NeedsTargets
Exec=/bin/sh -c 'while read -r trg; do case $trg in linux*) exit 0; esac; done; /usr/bin/mkinitcpio -P'24.5.5 Xorg 配置
# 自动生成 Xorg 配置
sudo nvidia-xconfig
# 或手动创建
# /etc/X11/xorg.conf.d/20-nvidia.confSection "Device"
Identifier "NVIDIA"
Driver "nvidia"
VendorName "NVIDIA Corporation"
Option "NoLogo" "true"
Option "Coolbits" "28"
Option "TripleBuffer" "true"
Option "AllowIndirectGLXProtocol" "off"
EndSection24.5.6 Wayland 支持
NVIDIA 对 Wayland 的支持经过了漫长的演进:
# 确保启用了 DRM KMS
nvidia-drm.modeset=1
# 环境变量(添加到 /etc/environment 或 shell 配置)
GBM_BACKEND=nvidia-drm
__GLX_VENDOR_LIBRARY_NAME=nvidia
# GNOME Wayland(通常开箱即用)
# KDE Plasma Wayland 需要额外设置
KWIN_DRM_USE_EGL_STREAMS=0
# Sway/wlroots 合成器
WLR_NO_HARDWARE_CURSORS=1| 合成器 | NVIDIA Wayland 支持状态 |
|---|---|
| GNOME (Mutter) | 良好,开箱即用 |
| KDE Plasma (KWin) | 良好,6.0 起基本完善 |
| Sway (wlroots) | 实验性,需要额外配置 |
| Hyprland | 良好,但偶有问题 |
24.5.7 nvidia-settings
# 启动图形设置工具
nvidia-settings
# 命令行查询 GPU 信息
nvidia-settings -q all | head -50
# 设置风扇速度(需要 Coolbits 启用)
nvidia-settings -a "[gpu:0]/GPUFanControlState=1"
nvidia-settings -a "[fan:0]/GPUTargetFanSpeed=70"
# 查询 GPU 温度
nvidia-settings -q GPUCoreTemp
# nvidia-smi 监控工具
nvidia-smi
watch -n 1 nvidia-smi
# 查看详细的 GPU 信息
nvidia-smi -q24.5.8 PRIME 双显卡切换
笔记本常配有 Intel/AMD 集显 + NVIDIA 独显的组合:
# PRIME Offloading(推荐方式)
# 默认使用集显,按需启用独显
# 使用独显运行特定程序
__NV_PRIME_RENDER_OFFLOAD=1 __VK_LAYER_NV_optimus=NVIDIA_only \
__GLX_VENDOR_LIBRARY_NAME=nvidia application
# 创建便捷别名
# ~/.bashrc
alias prime-run='__NV_PRIME_RENDER_OFFLOAD=1 __VK_LAYER_NV_optimus=NVIDIA_only __GLX_VENDOR_LIBRARY_NAME=nvidia'
# 使用示例
prime-run glxinfo | grep "OpenGL renderer"
prime-run vulkaninfo --summary# 使用 envycontrol 管理(推荐)
yay -S envycontrol
# 切换到集显模式(关闭独显,省电)
sudo envycontrol -s integrated
# 切换到混合模式(PRIME offloading)
sudo envycontrol -s hybrid
# 切换到独显模式
sudo envycontrol -s nvidia
# 查看当前模式
envycontrol --query
# 切换后需要重启
sudo reboot24.5.9 电源管理
# 动态电源管理(RTX 2000+ Turing 及以上)
# /etc/udev/rules.d/80-nvidia-pm.rules# Enable runtime PM for NVIDIA VGA/3D controller
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030000", ATTR{power/control}="auto"
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030200", ATTR{power/control}="auto"
# Remove NVIDIA USB xHCI Host Controller
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c0330", ATTR{remove}="1"
# Remove NVIDIA USB Type-C UCSI devices
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c8000", ATTR{remove}="1"
# Remove NVIDIA Audio devices
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x040300", ATTR{remove}="1"# /etc/modprobe.d/nvidia-power.conf
options nvidia NVreg_DynamicPowerManagement=0x02
# 启用 PCI-Express Runtime D3(RTX 推荐)
# /etc/modprobe.d/nvidia.conf
options nvidia NVreg_DynamicPowerManagement=0x02
options nvidia NVreg_EnableS0ixPowerManagement=124.5.10 CUDA 和 OpenCL
# 安装 CUDA 工具包
sudo pacman -S cuda cuda-tools
# 安装 OpenCL
sudo pacman -S opencl-nvidia
# 验证 CUDA
nvcc --version
nvidia-smi
# 编译 CUDA 示例
cat > /tmp/hello_cuda.cu << 'EOF'
#include <stdio.h>
__global__ void hello() {
printf("Hello from GPU thread %d\n", threadIdx.x);
}
int main() {
hello<<<1, 5>>>();
cudaDeviceSynchronize();
return 0;
}
EOF
nvcc /tmp/hello_cuda.cu -o /tmp/hello_cuda
/tmp/hello_cuda
# 查看 OpenCL 设备
sudo pacman -S clinfo
clinfo24.5.11 常见问题
黑屏问题:
# 如果安装驱动后黑屏,进入 TTY(Ctrl+Alt+F2)
# 1. 检查 nouveau 是否被正确禁用
lsmod | grep nouveau
# 2. 检查 nvidia 模块是否加载
lsmod | grep nvidia
# 3. 查看 Xorg 日志
cat /var/log/Xorg.0.log | grep -E "(EE|WW)"
# 4. 查看内核日志
journalctl -b -p err
# 5. 重新安装驱动
sudo pacman -S nvidia-dkms nvidia-utils
sudo mkinitcpio -P画面撕裂:
# Xorg 方案:启用 ForceFullCompositionPipeline
nvidia-settings --assign CurrentMetaMode="nvidia-auto-select +0+0 { ForceFullCompositionPipeline = On }"
# 持久化到 Xorg 配置
# /etc/X11/xorg.conf.d/20-nvidia.conf 中添加
# Option "MetaModes" "nvidia-auto-select +0+0 {ForceFullCompositionPipeline=On}"休眠/挂起问题:
# 启用 NVIDIA 挂起/恢复服务
sudo systemctl enable nvidia-suspend.service
sudo systemctl enable nvidia-hibernate.service
sudo systemctl enable nvidia-resume.service
# /etc/modprobe.d/nvidia-power.conf
options nvidia NVreg_PreserveVideoMemoryAllocations=1
options nvidia NVreg_TemporaryFilePath=/var/tmp24.6 开源 nouveau 驱动
nouveau 是 NVIDIA 显卡的开源驱动,性能远不及闭源驱动,但免配置。
# nouveau 随内核自带,通常不需要额外安装
# 安装 Mesa 即可
sudo pacman -S mesa lib32-mesa
# nouveau 的局限性
# - 无法重新调整 GPU 频率(性能受限于启动频率)
# - 不支持 Vulkan(NVK 正在开发中)
# - 不支持 CUDA
# - 不支持最新型号(需要签名固件)
# NVK(新的 Vulkan 驱动,Mesa 实现,仍在开发中)
# 支持 Turing (RTX 20) 及以上
sudo pacman -S vulkan-nouveau # 如果可用24.7 双显卡配置
24.7.1 PRIME Offloading
# Intel + NVIDIA
# 查看可用的 GPU 渲染设备
xrandr --listproviders
# DRI_PRIME 环境变量(AMD/Intel 集显 + 独显)
DRI_PRIME=1 glxinfo | grep "OpenGL renderer"
# NVIDIA PRIME Render Offload
__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia glxinfo | grep "OpenGL renderer"24.7.2 使用 optimus-manager(AUR,仅 Xorg)
yay -S optimus-manager optimus-manager-qt
# 启用服务
sudo systemctl enable optimus-manager
# 切换 GPU
optimus-manager --switch nvidia
optimus-manager --switch integrated
optimus-manager --switch hybrid
# 查看当前模式
optimus-manager --status24.7.3 使用 supergfxctl(ASUS 笔记本)
yay -S supergfxctl
sudo systemctl enable supergfxd
# 切换显卡模式
supergfxctl -m Integrated
supergfxctl -m Hybrid
supergfxctl -m Dedicated24.8 硬件视频加速
24.8.1 VA-API
# 安装 VA-API 支持
# Intel
sudo pacman -S intel-media-driver # Broadwell+
sudo pacman -S libva-intel-driver # 旧型号
# AMD
sudo pacman -S libva-mesa-driver
# NVIDIA(闭源)
# nvidia-utils 自带 NVDEC 支持
# 验证 VA-API
sudo pacman -S libva-utils
vainfo24.8.2 VDPAU
# AMD
sudo pacman -S mesa-vdpau
# NVIDIA
# nvidia-utils 自带 VDPAU
# 验证 VDPAU
sudo pacman -S vdpauinfo
vdpauinfo
# 将 VDPAU 桥接到 VA-API
sudo pacman -S libva-vdpau-driver
export VDPAU_DRIVER=va_gl24.8.3 在播放器中启用
# mpv 配置 (~/.config/mpv/mpv.conf)
hwdec=auto
vo=gpu-next
gpu-api=vulkan
# Firefox
# about:config 中设置:
# media.ffmpeg.vaapi.enabled = true
# gfx.webrender.all = true
# Chromium / Chrome
# 启动参数添加:
# --enable-features=VaapiVideoDecodeLinuxGL,VaapiVideoEncoder24.9 Vulkan 配置
# 安装 Vulkan 加载器
sudo pacman -S vulkan-icd-loader lib32-vulkan-icd-loader
# 安装对应驱动的 Vulkan ICD
# Intel
sudo pacman -S vulkan-intel lib32-vulkan-intel
# AMD(RADV,推荐)
sudo pacman -S vulkan-radeon lib32-vulkan-radeon
# NVIDIA(闭源驱动自带)
# 安装 Vulkan 开发工具
sudo pacman -S vulkan-tools vulkan-validation-layers
# 验证
vulkaninfo --summary
# 多 GPU 选择(通过环境变量)
# 指定使用的 Vulkan ICD
VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/nvidia_icd.json application
VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/radeon_icd.x86_64.json application
# 查看所有已安装的 ICD 文件
ls /usr/share/vulkan/icd.d/24.10 游戏性能优化
24.10.1 GameMode
# 安装 GameMode
sudo pacman -S gamemode lib32-gamemode
# 使用
gamemoderun ./your-game
# Steam 启动选项
# gamemoderun %command%
# 配置文件 (~/.config/gamemode.ini)[general]
renice=10
ioprio=0
[gpu]
apply_gpu_optimisations=accept-responsibility
gpu_device=0
amd_performance_level=high
nv_powermizer_mode=1
[custom]
start=notify-send "GameMode started"
end=notify-send "GameMode stopped"24.10.2 MangoHud
# 安装 MangoHud(性能监控叠加层)
sudo pacman -S mangohud lib32-mangohud
# 使用
mangohud application
# 或设置环境变量
MANGOHUD=1 application
# Steam 启动选项
# mangohud %command%
# 配置文件 (~/.config/MangoHud/MangoHud.conf)fps_limit=0
vsync=0
gl_vsync=0
gpu_stats
gpu_temp
gpu_core_clock
gpu_mem_clock
gpu_power
cpu_stats
cpu_temp
ram
vram
fps
frametime
frame_timing
position=top-left
font_size=20
background_alpha=0.424.10.3 Steam Proton
# 安装 Steam
sudo pacman -S steam
# 安装 Proton 依赖
sudo pacman -S lib32-mesa lib32-vulkan-icd-loader
# Intel: lib32-vulkan-intel
# AMD: lib32-vulkan-radeon
# NVIDIA: lib32-nvidia-utils
# 全局启用 Proton
# Steam -> 设置 -> 兼容性 -> 启用所有其他产品的 Steam Play
# 使用 ProtonGE(社区增强版)
yay -S proton-ge-custom-bin
# 使用 protonup-qt 管理 Proton 版本
yay -S protonup-qt24.11 常见故障排查
24.11.1 排查流程
# 1. 检查内核日志
dmesg | grep -iE "(drm|gpu|nvidia|amdgpu|i915|error|fail)"
# 2. 检查 Xorg 日志
cat /var/log/Xorg.0.log | grep -E "(EE|WW)"
# 3. 检查 Wayland 合成器日志
journalctl --user -u sway -b # Sway 示例
# 4. 检查 Mesa 信息
MESA_DEBUG=1 glxinfo 2>&1 | head -20
# 5. 检查 Vulkan
vulkaninfo 2>&1 | head -30
# 6. 检查已加载的驱动模块
lsmod | grep -E "(drm|gpu|nvidia|amdgpu|i915|radeon|nouveau)"
# 7. 检查 DRI 渲染节点
ls -la /dev/dri/
# 8. 确认 OpenGL 渲染器
glxinfo | grep "OpenGL renderer"24.11.2 常见问题速查表
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 启动黑屏 | 驱动未加载 / 冲突 | 检查 lsmod,禁用冲突驱动 |
| 分辨率不正确 | KMS 未正确配置 | 添加 video=1920x1080 内核参数 |
| 画面撕裂 | 未启用 VSync | 启用合成器 VSync 或 TearFree |
| GPU 直通失败 | IOMMU 未启用 | 添加 intel_iommu=on 或 amd_iommu=on |
| Wayland 黑屏 | GBM 后端问题 | 检查环境变量和 DRM 设置 |
| 视频播放卡顿 | 未启用硬件解码 | 检查 vainfo 输出并配置播放器 |
| 风扇噪音大 | 电源管理未优化 | 配置动态电源管理 |
| 多显示器问题 | 输出端口配置错误 | 使用 xrandr 或 wlr-randr |
| Vulkan 不可用 | ICD 文件缺失 | 安装对应的 vulkan-* 包 |
| 游戏性能差 | 使用了错误的 GPU | 检查 DRI_PRIME 或 PRIME 配置 |
24.13 NVIDIA Legacy 驱动迁移指南
NVIDIA 定期将旧架构 GPU 移出主线驱动,转入 Legacy 分支。Arch Linux 作为滚动发行版,主线 nvidia 包会较早跟进,导致 Maxwell/Pascal/Volta 等旧卡用户需要主动迁移到 Legacy 驱动。
24.13.1 GPU 世代与 Legacy 驱动对应表
| GPU 架构 | 代表型号 | Legacy 驱动版本 | 包名(AUR) |
|---|---|---|---|
| Kepler (2012) | GTX 600/700 系列 | 470.xx | nvidia-470xx-dkms |
| Maxwell (2014) | GTX 900 系列 | 580.xx | nvidia-580xx-dkms |
| Pascal (2016) | GTX 10xx, MX230, MX250 | 580.xx | nvidia-580xx-dkms |
| Volta (2017) | TITAN V, Quadro GV100 | 580.xx | nvidia-580xx-dkms |
| Turing+ (2018+) | RTX 20xx+ | 主线(最新) | nvidia-dkms(官方) |
24.13.2 判断是否需要 Legacy 驱动
# 查看 GPU 型号
lspci -k | grep -A 2 -E "(VGA|3D)"
# 查看内核日志是否提示 Legacy
dmesg | grep -i "supported through"
# 如果输出类似:
# NVRM: supported through the NVIDIA 580.xx Legacy drivers.
# 则说明你的卡已被移入 Legacy 分支24.13.3 迁移步骤
Step 1 — 卸载官方 nvidia 包
pacman -Qs nvidia # 查看已安装的 nvidia 包
sudo pacman -Rdd nvidia nvidia-dkms nvidia-utils lib32-nvidia-utils nvidia-settingsStep 2 — 清理 DKMS 残留
sudo dkms remove nvidia/$(dkms status nvidia | head -1 | awk '{print $2}' | tr -d ',') --all 2>/dev/null
sudo rm -rf /usr/src/nvidia-*Step 3 — 从 AUR 安装 Legacy 驱动
根据你的 GPU 架构选择对应的包:
# Kepler (GTX 600/700)
yay -S nvidia-470xx-dkms nvidia-470xx-utils lib32-nvidia-470xx-utils
# Maxwell / Pascal / Volta (GTX 900/10xx, MX230 等)
yay -S nvidia-580xx-dkms nvidia-580xx-utils lib32-nvidia-580xx-utilsStep 4 — 重启并验证
reboot
nvidia-smi24.13.4 处理 .run 安装器残留文件
如果之前使用 NVIDIA 官网的 .run 文件手动安装过驱动,这些文件不在 pacman 数据库内,会导致安装 AUR 包时报文件冲突:
错误:无法提交处理 (有冲突的文件)
nvidia-580xx-utils: 文件系统中已存在 /usr/bin/nvidia-smi
方案 A:删除冲突文件(推荐)
# 批量删除常见的 .run 残留
sudo find /usr/bin /usr/lib /usr/lib32 /usr/share/glvnd /usr/share/nvidia \
/usr/share/man/man1 /usr/lib/xorg/modules/drivers /usr/lib/vdpau \
/usr/lib32/vdpau /usr/lib/gbm /usr/lib32/gbm /usr/lib/nvidia \
/usr/lib/systemd/system /usr/lib/systemd/system-sleep \
-name '*nvidia*' -o -name '*cuda*' -o -name '*nvoptix*' \
-o -name '*EGL_nvidia*' -o -name '*GLX_nvidia*' \
-o -name '*GLES*_nvidia*' -o -name '*nvidia-drm*' 2>/dev/null | sudo xargs rm -f
# 删除 .run 安装器创建的自定义子目录
sudo rm -rf /usr/lib/nvidia/wine /usr/share/nvidia/files.d方案 B:强制覆盖(更省事)
yay -S --overwrite '*' nvidia-580xx-dkms nvidia-580xx-utils lib32-nvidia-580xx-utils24.14 驱动故障排查与恢复
滚动发行的本质决定:每次
pacman -Syu后驱动都可能出问题。本节将常见的故障场景按发生频率排序,提供标准化的恢复流程。
24.14.1 滚动更新后驱动失效 — 完整排查流程
驱动失效
│
├─ journalctl -b -p err | grep -i nvidia
│ ↓
│ 报 "No NVIDIA GPU found" / "requires 580.xx Legacy"?
│ ↓ ↓
│ 是 → 你的卡已进入 Legacy,需迁移到 nvidia-580xx-dkms(见 24.13)
│ 否 → 继续
│
├─ dmesg | grep "NVRM"
│ ↓
│ 有错误信息?
│ ↓
│ 记录关键错误
│
├─ lsmod | grep nvidia
│ ↓
│ 模块未加载?
│ ↓
├─ dkms status | grep nvidia
│ ↓
│ DKMS 显示 installed?
│ ┌── 否 → sudo dkms install nvidia/版本号 -k $(uname -r)
│ └── 是 → journalctl -b 查看是否有模块加载失败
│
├─ nvidia-smi
│ ↓
│ CUDA 版本、驱动版本正常?
│ ↓
└─ 完成
24.14.2 DKMS 编译失败
DKMS 为当前内核自动编译 nvidia 内核模块。如果编译失败,后续所有环节都会出问题。
症状:
dkms status
# nvidia/580.173.02, 7.1.5-zen1-2-zen, x86_64: added(不是 installed)排查步骤:
# 1. 查看编译日志
less /var/lib/dkms/nvidia/*/build/make.log
# 常见错误:
# - "fatal error: linux/xxx.h: No such file or directory" → 缺少 kernel-headers
# - "'strncpy' is deprecated" → 新版内核移除了 strncpy,需要手动补丁
# - "Bad return status" → 查看日志上方具体错误
# 2. 确保 kernel-headers 已安装(必须与当前内核版本匹配)
pacman -Qs linux-zen-headers # 如果你用的是 linux-zen 内核
pacman -Qs linux-headers # 如果你用的是官方 linux 内核
# 3. 手动触发 DKMS 编译
sudo dkms install nvidia/580.173.02 -k $(uname -r)不同内核对应的 headers 包:
| 内核 | headers 包 |
|---|---|
linux | linux-headers |
linux-zen | linux-zen-headers |
linux-lts | linux-lts-headers |
linux-hardened | linux-hardened-headers |
24.14.3 共享库损坏导致 pacman 崩溃
这是最严重的情况——pacman 本身无法运行,因为它所依赖的系统库(如 ICU)在升级过程中被意外删除或版本不匹配。
症状:
pacman --version
# pacman: error while loading shared libraries: libicudata.so.78:
# cannot open shared object file: No such file or directory原因:ICU 库从 78 升级到 79 时,旧版 .so.78 被删除,但新版 pacman 被重建前需要 ICU 78 来运行。
恢复步骤(不需要 pacman、不需要 bsdtar):
# 1. 确认缺失的库
ldd /usr/bin/pacman | grep "not found"
# libicudata.so.78 => not found
# libicuuc.so.78 => not found
# 2. 从 pacman 缓存中恢复 ICU 库
# 使用 unzstd + tar(这俩工具不依赖 ICU,可以正常工作)
ls /var/cache/pacman/pkg/icu-78*.pkg.tar.zst
# 如果有缓存文件:
unzstd /var/cache/pacman/pkg/icu-78.3-1-x86_64.pkg.tar.zst -o /tmp/icu.tar
sudo tar -xpf /tmp/icu.tar -C / usr/lib/
# 3. 验证
pacman --version
# 4. 锁定 ICU 版本,防止再次被意外升级滚掉
# 在 /etc/pacman.conf 的 [options] 段(不是 [archlinuxcn] 等仓库段)添加:
# IgnorePkg = icu如果 pacman 缓存也被清空了:
需要从另一台同版本 Arch 机器复制,或从 archlinux.org/packages 手动下载 ICU 包的 URL,用 curl 或 wget 下载后解压。
# 从镜像下载 icu 包(需联网)
curl -o /tmp/icu.pkg.tar.zst https://mirror.archlinux.de/.../icu-78.3-1-x86_64.pkg.tar.zst
unzstd /tmp/icu.pkg.tar.zst -o /tmp/icu.tar
sudo tar -xpf /tmp/icu.tar -C / usr/lib/24.14.4 其他依赖工具也被 ICU 破坏时的替代方案
某些工具(bsdtar、libarchive)也依赖 ICU,在 ICU 损坏时同样不可用。此时可用不依赖 ICU 的静态工具链:
| 原本的工具 | 替代方案 |
|---|---|
bsdtar | tar(GNU tar 不依赖 ICU) |
unzstd | zstd -d(zstd 不依赖 ICU) |
pacman | 恢复 ICU 后恢复正常 |
# 检查哪些工具能正常工作
ldd /usr/bin/tar | grep icu # 空输出 = 不依赖 ICU
ldd /usr/bin/unzstd | grep icu # 空输出 = 不依赖 ICU
ldd /usr/bin/zstd | grep icu # 空输出 = 不依赖 ICU
ldd /usr/bin/cp | grep icu # 空输出 = 不依赖 ICU
ldd /usr/bin/bsdtar | grep icu # 依赖 ICU,不可用24.14.5 initramfs 重建失败
如果驱动安装后 initramfs 重建失败,启动时会黑屏或 fallback 到无驱动模式:
# 手动重建 initramfs
sudo mkinitcpio -P
# 如果当前内核的 initramfs 损坏,使用备份内核启动
# 在 GRUB 高级选项中选择旧内核
# 检查哪些内核有 initramfs
ls /boot/initramfs-*.img
ls /boot/EFI/Linux/*.efi # 统一内核镜像24.15 滚动更新维护建议
# /etc/pacman.conf — 正确的 IgnorePkg 写法(必须在 [options] 段)
[options]
# ...
IgnorePkg = icu# 定期检查 AUR Legacy 驱动是否有更新
yay -Syua | grep nvidia-580xx
# 保持 kernel-headers 安装(DKMS 编译的必要条件)
sudo pacman -S --needed linux-zen-headers
# 大版本升级前的预防性备份(保留 pacman 缓存)
sudo pacman -Scc # 谨慎使用,会清空缓存
# 推荐保留至少一个版本的包缓存:
# /etc/pacman.conf 中 KeepBuilt = 3应急工具箱速查
| 问题 | 一句话解决 |
|---|---|
| DKMS 编译失败 | sudo dkms install nvidia/版本 -k $(uname -r) |
| .run 文件冲突 | yay -S --overwrite '*' nvidia-580xx-dkms |
| initramfs 损坏 | sudo mkinitcpio -P |
| libicudata.so 丢失 | unzstd + tar 从缓存手动恢复(见 24.14.3) |
| nouveau 冲突 | 确认 /etc/modprobe.d/ 中有 blacklist nouveau |
| 驱动更新后黑屏 | 进 TTY → journalctl -b -p err → 根据错误处理 |