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 --summary

24.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, nvidia

24.2.2 使用 lshw

# 需要 root 权限
sudo lshw -C display
 
# 更详细的信息
sudo lshw -C display -short

24.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/vendor

24.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 -50

24.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/grubGRUB_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.cfg

24.3.4 Xorg 配置

Intel 集显通常不需要额外的 Xorg 配置,但可以创建配置文件进行优化:

# /etc/X11/xorg.conf.d/20-intel.conf
Section "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_top

24.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 -20

24.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=1

24.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
radeontop

24.4.6 使用 corectrl 进行图形化调优

# 安装 corectrl(AUR)
yay -S corectrl
 
# 添加 polkit 规则以免密码启动
# /etc/polkit-1/rules.d/90-corectrl.rules
polkit.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-dkms

24.5.2 nvidia vs nvidia-dkms

特性nvidianvidia-dkms
编译方式预编译,仅支持当前 linux 内核DKMS 动态编译,支持任意内核
自定义内核支持不支持支持 linux-zenlinux-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-headers

24.5.3 禁用 nouveau

安装闭源驱动后需要禁用开源 nouveau 驱动:

# 通常 nvidia 包会自动处理,但可以手动确认
# /etc/modprobe.d/nvidia.conf
blacklist nouveau
options nouveau modeset=0
# 重新生成 initramfs
sudo mkinitcpio -P

24.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.conf
Section "Device"
 Identifier "NVIDIA"
 Driver "nvidia"
 VendorName "NVIDIA Corporation"
 Option "NoLogo" "true"
 Option "Coolbits" "28"
 Option "TripleBuffer" "true"
 Option "AllowIndirectGLXProtocol" "off"
EndSection

24.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 -q

24.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 reboot

24.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=1

24.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
clinfo

24.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/tmp

24.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 --status

24.7.3 使用 supergfxctl(ASUS 笔记本)

yay -S supergfxctl
sudo systemctl enable supergfxd
 
# 切换显卡模式
supergfxctl -m Integrated
supergfxctl -m Hybrid
supergfxctl -m Dedicated

24.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
vainfo

24.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_gl

24.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,VaapiVideoEncoder

24.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.4

24.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-qt

24.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=onamd_iommu=on
Wayland 黑屏GBM 后端问题检查环境变量和 DRM 设置
视频播放卡顿未启用硬件解码检查 vainfo 输出并配置播放器
风扇噪音大电源管理未优化配置动态电源管理
多显示器问题输出端口配置错误使用 xrandrwlr-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.xxnvidia-470xx-dkms
Maxwell (2014)GTX 900 系列580.xxnvidia-580xx-dkms
Pascal (2016)GTX 10xx, MX230, MX250580.xxnvidia-580xx-dkms
Volta (2017)TITAN V, Quadro GV100580.xxnvidia-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-settings

Step 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-utils

Step 4 — 重启并验证

reboot
nvidia-smi

24.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-utils

24.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 包
linuxlinux-headers
linux-zenlinux-zen-headers
linux-ltslinux-lts-headers
linux-hardenedlinux-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,用 curlwget 下载后解压。

# 从镜像下载 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 破坏时的替代方案

某些工具(bsdtarlibarchive)也依赖 ICU,在 ICU 损坏时同样不可用。此时可用不依赖 ICU 的静态工具链:

原本的工具替代方案
bsdtartar(GNU tar 不依赖 ICU)
unzstdzstd -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 → 根据错误处理