27 - 硬件驱动大全与视频多媒体

Linux 的硬件驱动生态经过多年发展已经相当成熟,大部分硬件可以开箱即用。本章将系统性地介绍 Arch Linux 下各类硬件驱动的安装、配置与故障排除,同时深入讲解视频硬件加速与多媒体优化,帮助你充分发挥硬件性能。


27.1 Linux 驱动模型概述

Linux 驱动由三大核心组件协同工作:内核模块udevfirmware

27.1.1 内核模块

内核模块(Kernel Module)是可动态加载的驱动程序,扩展名为 .ko,存放于 /lib/modules/$(uname -r)/ 目录下。

# 查看当前已加载的模块
lsmod
 
# 查看模块详细信息
modinfo i915
 
# 手动加载模块
sudo modprobe btusb
 
# 手动卸载模块
sudo modprobe -r btusb
 
# 列出模块依赖
modprobe --show-depends i915

开机自动加载模块:

# 创建配置文件
echo "btusb" | sudo tee /etc/modules-load.d/btusb.conf

屏蔽(黑名单)模块:

# 创建黑名单配置
echo "blacklist nouveau" | sudo tee /etc/modprobe.d/blacklist-nouveau.conf

27.1.2 udev 设备管理

udev 是 Linux 的设备管理器,负责在设备插入时自动加载驱动并创建设备节点。

# 监控设备事件
udevadm monitor
 
# 查看设备属性
udevadm info -a /dev/sda
 
# 重新加载 udev 规则
sudo udevadm control --reload-rules
sudo udevadm trigger

自定义 udev 规则示例(/etc/udev/rules.d/99-custom.rules):

# 为特定 USB 设备设置权限
SUBSYSTEM=="usb", ATTR{idVendor}=="1234", ATTR{idProduct}=="5678", MODE="0666", GROUP="plugdev"

27.1.3 Firmware(固件)

许多硬件需要额外的固件文件才能工作,固件存放于 /lib/firmware/ 目录。

# 安装 Linux 固件包
sudo pacman -S linux-firmware
 
# 额外固件(部分硬件需要)
sudo pacman -S linux-firmware-whence
 
# 查看内核请求的固件
dmesg | grep -i firmware

27.2 触摸板驱动

Arch Linux 使用 libinput 作为默认输入驱动。

27.2.1 安装与基本配置

# 安装 libinput(通常已预装)
sudo pacman -S libinput xf86-input-libinput
 
# 列出输入设备
libinput list-devices
 
# 测试触摸板事件
sudo libinput debug-events --device /dev/input/event5

创建 Xorg 配置文件 /etc/X11/xorg.conf.d/30-touchpad.conf

Section "InputClass"
 Identifier "touchpad"
 Driver "libinput"
 MatchIsTouchpad "on"
 Option "Tapping" "on"
 Option "TappingDrag" "on"
 Option "NaturalScrolling" "true"
 Option "ClickMethod" "clickfinger"
 Option "DisableWhileTyping" "true"
 Option "ScrollMethod" "twofinger"
 Option "AccelSpeed" "0.3"
EndSection

27.2.2 手势设置

# 安装手势管理工具
sudo pacman -S libinput-gestures
 
# 或使用更现代的 fusuma(AUR)
yay -S fusuma

libinput-gestures 配置文件 ~/.config/libinput-gestures.conf

gesture swipe up 3 xdotool key super
gesture swipe down 3 xdotool key super+d
gesture swipe left 3 xdotool key alt+Right
gesture swipe right 3 xdotool key alt+Left
gesture pinch in 2 xdotool key ctrl+minus
gesture pinch out 2 xdotool key ctrl+plus
# 启动手势服务
libinput-gestures-setup start
libinput-gestures-setup autostart

27.2.3 Wayland 下的触摸板

在 Wayland 环境下,触摸板配置通过桌面环境的设置工具完成。对于 Sway:

# ~/.config/sway/config
input type:touchpad {
 tap enabled
 natural_scroll enabled
 dwt enabled
 accel_profile adaptive
 pointer_accel 0.3
}

27.3 打印机驱动

27.3.1 CUPS 安装与配置

# 安装 CUPS 及相关组件
sudo pacman -S cups cups-pdf ghostscript
 
# 启动 CUPS 服务
sudo systemctl enable --now cups
 
# Web 管理界面
# 浏览器访问 http://localhost:631

27.3.2 驱动安装

# 通用打印机驱动
sudo pacman -S gutenprint foomatic-db foomatic-db-engine
 
# HP 打印机
sudo pacman -S hplip
hp-setup -i # 交互式设置
 
# Brother 打印机(AUR)
yay -S brother-mfc-l2710dw
 
# Epson 打印机
sudo pacman -S epson-inkjet-printer-escpr

27.3.3 命令行打印

# 查看可用打印机
lpstat -p -d
 
# 打印文件
lp -d printer_name document.pdf
 
# 查看打印队列
lpq
 
# 取消打印任务
cancel job_id

27.3.4 网络打印机发现

# 安装 Avahi 用于自动发现
sudo pacman -S avahi nss-mdns
sudo systemctl enable --now avahi-daemon
 
# 编辑 /etc/nsswitch.conf,在 hosts 行添加 mdns_minimal [NOTFOUND=return]

27.4 摄像头驱动

27.4.1 UVC 与 V4L2

大多数 USB 摄像头遵循 UVC(USB Video Class)标准,Linux 内核原生支持。

# 检查摄像头是否被识别
lsusb | grep -i cam
v4l2-ctl --list-devices
 
# 安装 v4l 工具
sudo pacman -S v4l-utils
 
# 查看摄像头支持的格式
v4l2-ctl --list-formats-ext -d /dev/video0
 
# 查看/设置摄像头参数
v4l2-ctl -d /dev/video0 --all
v4l2-ctl -d /dev/video0 --set-ctrl brightness=128
v4l2-ctl -d /dev/video0 --set-ctrl exposure_auto=1

27.4.2 测试摄像头

# 使用 mpv 测试
mpv av://v4l2:/dev/video0
 
# 使用 ffplay 测试
ffplay /dev/video0
 
# 使用 cheese(GNOME 摄像头应用)
sudo pacman -S cheese

27.4.3 虚拟摄像头

# 安装 v4l2loopback
sudo pacman -S v4l2loopback-dkms
 
# 加载虚拟摄像头模块
sudo modprobe v4l2loopback video_nr=10 card_label="VirtualCam"
 
# 用 ffmpeg 向虚拟摄像头推送内容
ffmpeg -re -i video.mp4 -f v4l2 -vcodec rawvideo -pix_fmt yuv420p /dev/video10

27.5 视频硬件加速

视频硬件加速是利用 GPU 的专用解码/编码单元来处理视频,大幅降低 CPU 占用。

27.5.1 VA-API vs VDPAU

特性VA-APIVDPAU
全称Video Acceleration APIVideo Decode and Presentation API for Unix
开发者Intel(后转交 freedesktop)NVIDIA
主要支持Intel / AMD GPUNVIDIA GPU
Wayland 支持完善有限
现代趋势推荐逐渐淘汰
编码支持支持不支持

27.5.2 各显卡硬件解码配置

Intel 显卡:

# 较新的 Intel GPU(Broadwell 及以后)
sudo pacman -S intel-media-driver
 
# 较旧的 Intel GPU(GMA 4500 到 Coffee Lake)
sudo pacman -S libva-intel-driver
 
# 验证
vainfo
Intel 世代推荐驱动支持的编解码
GMA 4500 - Haswelllibva-intel-driverH.264
Broadwell - Ice Lakeintel-media-driverH.264, H.265, VP9
Tiger Lake+intel-media-driverH.264, H.265, VP9, AV1

AMD 显卡:

# AMD GPU 使用 Mesa 的 VA-API 支持
sudo pacman -S libva-mesa-driver mesa-vdpau
 
# 验证
vainfo
vdpauinfo

NVIDIA 显卡:

# 专有驱动(VDPAU 原生支持)
sudo pacman -S nvidia nvidia-utils
 
# VA-API 兼容层
sudo pacman -S libva-nvidia-driver
 
# 验证
vdpauinfo
vainfo
 
# 设置环境变量(使用 NVIDIA VA-API)
export LIBVA_DRIVER_NAME=nvidia
export NVD_BACKEND=direct

27.5.3 mpv 硬件加速配置

编辑 ~/.config/mpv/mpv.conf

# Intel / AMD(VA-API)
hwdec=vaapi
vo=gpu-next
gpu-api=vulkan
gpu-context=waylandvk
 
# NVIDIA(推荐使用 nvdec)
hwdec=nvdec
vo=gpu-next
gpu-api=vulkan
 
# 自动选择最佳硬件解码
hwdec=auto-safe

验证硬件加速是否生效:

# 播放视频时按 Shift+I 查看统计信息
mpv --hwdec=vaapi video.mkv
# 查看 VO 和 hwdec 状态

27.5.4 VLC 硬件加速配置

工具 → 偏好设置 → 输入/编解码器:
 硬件加速解码 → VA-API 视频解码器

命令行方式:

# VA-API
vlc --avcodec-hw=vaapi video.mkv
 
# VDPAU
vlc --avcodec-hw=vdpau video.mkv

27.5.5 浏览器硬件加速

Chromium / Chrome:

# 启动参数
chromium --enable-features=VaapiVideoDecodeLinuxGL,VaapiVideoEncoder,VaapiVideoDecoder
 
# 或写入配置文件 ~/.config/chromium-flags.conf
--enable-features=VaapiVideoDecodeLinuxGL,VaapiVideoDecoder,VaapiVideoEncoder
--disable-features=UseChromeOSDirectVideoDecoder
--enable-gpu-rasterization
--enable-zero-copy
--ignore-gpu-blocklist

chrome://gpu 页面验证硬件加速状态。

Firefox:

about:config 中设置:

配置项
media.ffmpeg.vaapi.enabledtrue
media.hardware-video-decoding.enabledtrue
gfx.webrender.alltrue
widget.dmabuf.force-enabledtrue(Wayland)
# 启动 Firefox 时设置环境变量
MOZ_ENABLE_WAYLAND=1 MOZ_DRM_DEVICE=/dev/dri/renderD128 firefox

27.5.6 验证硬件加速

# 安装 intel-gpu-tools(Intel)
sudo pacman -S intel-gpu-tools
sudo intel_gpu_top # 播放视频时查看 Video 引擎是否活跃
 
# AMD GPU
sudo cat /sys/kernel/debug/dri/0/amdgpu_pm_info
 
# NVIDIA
nvidia-smi # 查看 GPU 使用率
 
# 通用方式:播放视频时查看 CPU 使用率
# 硬件加速正常时 CPU 占用应明显降低

27.6 USB 设备管理

27.6.1 基本工具

# 列出 USB 设备
lsusb
lsusb -t # 树状显示
lsusb -v -d 1234:5678 # 详细信息
 
# 安装 usbutils
sudo pacman -S usbutils
 
# USB 设备文件系统
ls /sys/bus/usb/devices/

27.6.2 USB 电源管理

# 查看 USB 设备电源状态
cat /sys/bus/usb/devices/1-1/power/control
 
# 禁用特定 USB 端口的自动挂起
echo "on" | sudo tee /sys/bus/usb/devices/1-1/power/control

udev 规则禁止特定设备自动挂起:

# /etc/udev/rules.d/50-usb-power.rules
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="1234", ATTR{power/control}="on"

27.6.3 USB 权限管理

# 为普通用户添加 USB 设备访问权限(如 Android 调试)
# /etc/udev/rules.d/51-android.rules
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="adbusers"

27.7 存储设备驱动

27.7.1 NVMe

# 安装 NVMe 管理工具
sudo pacman -S nvme-cli
 
# 列出 NVMe 设备
sudo nvme list
 
# 查看 SMART 信息
sudo nvme smart-log /dev/nvme0
 
# 查看固件版本
sudo nvme id-ctrl /dev/nvme0
 
# 固件更新
sudo nvme fw-download /dev/nvme0 --fw=firmware.bin
sudo nvme fw-activate /dev/nvme0 --slot=1 --action=1

27.7.2 SATA

# 查看 SATA 设备信息
sudo hdparm -I /dev/sda
 
# SMART 健康检查
sudo pacman -S smartmontools
sudo smartctl -a /dev/sda
sudo smartctl -t short /dev/sda # 短时自检

27.7.3 USB 存储

# USB 存储设备通常自动挂载
# 手动挂载
sudo mount /dev/sdb1 /mnt/usb
 
# 使用 udisksctl 免 root 挂载
udisksctl mount -b /dev/sdb1
udisksctl unmount -b /dev/sdb1
udisksctl power-off -b /dev/sdb
 
# 安装自动挂载工具
sudo pacman -S udiskie
udiskie & # 后台运行

27.8 输入设备

27.8.1 键盘背光

# 查看背光设备
ls /sys/class/leds/ | grep kbd
 
# 调节键盘背光
echo 2 | sudo tee /sys/class/leds/tpacpi::kbd_backlight/brightness
 
# 使用 brightnessctl
sudo pacman -S brightnessctl
brightnessctl --device='tpacpi::kbd_backlight' set 2
brightnessctl --device='tpacpi::kbd_backlight' info

27.8.2 特殊按键映射

# 查看按键事件
sudo pacman -S evtest
sudo evtest
 
# 使用 xmodmap 重映射(Xorg)
xmodmap -e "keycode 135 = Menu"
 
# 使用 keyd 进行系统级按键映射
yay -S keyd
sudo systemctl enable --now keyd

keyd 配置 /etc/keyd/default.conf

[ids]
*
 
[main]
capslock = overload(control, esc)
rightalt = layer(nav)
 
[nav]
h = left
j = down
k = up
l = right

27.8.3 游戏手柄

# 安装手柄驱动
sudo pacman -S xboxdrv # Xbox 手柄
sudo pacman -S game-devices-udev # AUR 中的通用游戏设备 udev 规则
 
# 测试手柄
jstest /dev/input/js0
 
# 查看手柄信息
evtest /dev/input/event*

27.9 传感器驱动

27.9.1 lm_sensors 配置

# 安装
sudo pacman -S lm_sensors
 
# 自动检测传感器(交互式,对每个问题按 Enter 或 yes)
sudo sensors-detect
 
# 查看传感器数据
sensors
 
# 持续监控
watch -n 1 sensors

输出示例:

coretemp-isa-0000
Adapter: ISA adapter
Package id 0: +55.0°C (high = +100.0°C, crit = +100.0°C)
Core 0: +52.0°C (high = +100.0°C, crit = +100.0°C)
Core 1: +54.0°C (high = +100.0°C, crit = +100.0°C)

27.9.2 fancontrol 风扇控制

# 生成风扇控制配置
sudo pwmconfig
 
# 启动风扇控制服务
sudo systemctl enable --now fancontrol

配置文件 /etc/fancontrol 示例:

INTERVAL=10
DEVPATH=hwmon0=devices/platform/coretemp.0
DEVNAME=hwmon0=coretemp
FCTEMPS=hwmon0/pwm1=hwmon0/temp1_input
FCFANS=hwmon0/pwm1=hwmon0/fan1_input
MINTEMP=hwmon0/pwm1=40
MAXTEMP=hwmon0/pwm1=75
MINSTART=hwmon0/pwm1=50
MINSTOP=hwmon0/pwm1=30
MINPWM=hwmon0/pwm1=0
MAXPWM=hwmon0/pwm1=255

27.9.3 光线传感器

# 安装 iio-sensor-proxy
sudo pacman -S iio-sensor-proxy
 
# 监控光线传感器
monitor-sensor
 
# 检查传感器设备
ls /sys/bus/iio/devices/

27.10 电源管理驱动

27.10.1 TLP

TLP 是最流行的 Linux 电源管理工具,专为笔记本优化。

# 安装
sudo pacman -S tlp tlp-rdw
 
# 启动服务
sudo systemctl enable --now tlp
sudo systemctl enable --now NetworkManager-dispatcher # TLP Radio Device Wizard
 
# 禁用冲突服务
sudo systemctl mask systemd-rfkill.service systemd-rfkill.socket
 
# 查看状态
sudo tlp-stat -s
 
# 查看电池信息
sudo tlp-stat -b
 
# 查看完整报告
sudo tlp-stat

TLP 配置 /etc/tlp.conf 常用选项:

TLP_DEFAULT_MODE=BAT
CPU_SCALING_GOVERNOR_ON_AC=performance
CPU_SCALING_GOVERNOR_ON_BAT=powersave
CPU_ENERGY_PERF_POLICY_ON_AC=performance
CPU_ENERGY_PERF_POLICY_ON_BAT=power
CPU_BOOST_ON_AC=1
CPU_BOOST_ON_BAT=0
WIFI_PWR_ON_BAT=on
USB_AUTOSUSPEND=1
RUNTIME_PM_ON_AC=on
RUNTIME_PM_ON_BAT=auto
START_CHARGE_THRESH_BAT0=75
STOP_CHARGE_THRESH_BAT0=80

27.10.2 auto-cpufreq

# 安装(AUR)
yay -S auto-cpufreq
 
# 启动服务
sudo systemctl enable --now auto-cpufreq
 
# 实时监控
sudo auto-cpufreq --monitor
 
# 查看状态
auto-cpufreq --stats

27.10.3 thermald

# 安装
sudo pacman -S thermald
 
# 启动服务
sudo systemctl enable --now thermald
 
# 查看配置
cat /etc/thermald/thermal-conf.xml

注意:TLP 与 auto-cpufreq 不应同时使用,二者功能有冲突。选择其一即可。


27.11 无线网卡驱动

27.11.1 Intel WiFi

Intel 无线网卡通常开箱即用,驱动包含在 linux-firmware 中。

# 确认固件已安装
sudo pacman -S linux-firmware
 
# 查看无线网卡信息
lspci -k | grep -A 3 -i network
 
# Intel WiFi 模块通常为 iwlwifi
lsmod | grep iwl
dmesg | grep iwl

常见问题与解决:

# 如果 WiFi 6E(6 GHz)频段不可用
# 检查区域设置
iw reg get
sudo iw reg set CN # 设置国家代码
 
# 固件加载失败
dmesg | grep -i "firmware"
# 可能需要安装更新的固件包

27.11.2 Broadcom 无线网卡

# 确认型号
lspci -k | grep -A 3 -i broadcom
 
# 开源驱动(推荐,大部分型号)
sudo pacman -S broadcom-wl-dkms
 
# 如果开源驱动不工作,尝试闭源驱动
# 注意:需要先屏蔽冲突模块
echo -e "blacklist b43\nblacklist ssb\nblacklist bcma" | sudo tee /etc/modprobe.d/broadcom-wl.conf
 
# 重新加载
sudo modprobe wl
芯片型号推荐驱动
BCM4313broadcom-wl-dkms
BCM4331broadcom-wl-dkms
BCM43142broadcom-wl-dkms
BCM4360broadcom-wl-dkms
BCM43602b43(内核自带)

27.11.3 Realtek 无线网卡

# 查看型号
lsusb | grep -i realtek
lspci | grep -i realtek
 
# RTL8821CE / RTL8822CE(常见)
yay -S rtl8821ce-dkms-git
 
# RTL8852BE
yay -S rtw89-dkms-git
 
# RTL8812AU(USB 网卡)
yay -S rtl8812au-dkms-git

27.11.4 通用无线问题排查

# 检查无线接口
ip link show
iw dev
 
# 检查 RF Kill 状态
rfkill list
rfkill unblock all
 
# 扫描 WiFi 网络
sudo iw dev wlan0 scan | grep -i ssid
 
# 查看连接状态
iw dev wlan0 link
iwconfig wlan0

27.12 指纹识别器

27.12.1 fprintd 安装与配置

# 安装
sudo pacman -S fprintd
 
# 查看支持的设备
lsusb | grep -i fingerprint
 
# 录入指纹
fprintd-enroll
 
# 验证指纹
fprintd-verify
 
# 列出已录入的指纹
fprintd-list $USER
 
# 删除指纹
fprintd-delete $USER

27.12.2 PAM 集成

编辑 /etc/pam.d/system-local-login,在第一行添加:

auth sufficient pam_fprintd.so

支持指纹登录的 PAM 文件:

文件作用
/etc/pam.d/system-local-loginTTY 登录
/etc/pam.d/sddmSDDM 登录
/etc/pam.d/gdm-passwordGDM 登录
/etc/pam.d/sudosudo 认证
/etc/pam.d/polkit-1Polkit 认证

27.12.3 部分不支持的指纹识别器

# 某些 Goodix 指纹识别器需要额外驱动
yay -S libfprint-goodixtls-git
 
# 查看 fprintd 日志
journalctl -u fprintd -f

27.13 Thunderbolt / USB4

# 安装 bolt 管理工具
sudo pacman -S bolt
 
# 列出 Thunderbolt 设备
boltctl list
 
# 授权设备
boltctl authorize DEVICE_UUID
 
# 永久信任设备
boltctl enroll DEVICE_UUID
 
# 撤销信任
boltctl forget DEVICE_UUID
 
# 查看设备详情
boltctl info DEVICE_UUID

Thunderbolt 安全级别查看:

cat /sys/bus/thunderbolt/devices/domain0/security
# none - 无安全验证
# user - 用户授权
# secure - 安全连接

27.14 红外接收器

# 安装 LIRC(Linux Infrared Remote Control)
sudo pacman -S lirc
 
# 启动服务
sudo systemctl enable --now lircd
 
# 列出红外设备
ls /dev/lirc*
 
# 测试接收
mode2 -d /dev/lirc0
 
# 录制遥控器按键
irrecord -d /dev/lirc0 ~/my_remote.conf
 
# 将配置复制到系统目录
sudo cp ~/my_remote.conf /etc/lirc/lircd.conf.d/

使用 ir-keytable 替代方案(更现代):

# 安装 v4l-utils(包含 ir-keytable)
sudo pacman -S v4l-utils
 
# 列出红外设备
ir-keytable
 
# 测试接收
ir-keytable -t -s rc0
 
# 加载按键映射
ir-keytable -c -w /etc/rc_keymaps/my_remote.toml

27.15 驱动故障排查通用流程

1. 确认硬件被识别
 lspci / lsusb / dmesg

2. 检查驱动是否加载
 lsmod | grep <driver>

3. 查看内核日志
 dmesg | grep -i error
 journalctl -b -p err

4. 检查固件
 dmesg | grep -i firmware

5. 安装缺失的固件/驱动
 pacman -S <package>

6. 重新加载模块
 sudo modprobe -r <module>
 sudo modprobe <module>

7. 搜索 Arch Wiki
 https://wiki.archlinux.org/

常用硬件信息工具汇总:

工具用途安装包
lspciPCI 设备列表pciutils
lsusbUSB 设备列表usbutils
lshw完整硬件信息lshw
hwinfo详细硬件信息hwinfo
inxi系统信息概览inxi
dmidecodeDMI/BIOS 信息dmidecode
lscpuCPU 信息util-linux
lsblk块设备信息util-linux
lsmod已加载模块kmod
# 生成完整硬件报告
sudo lshw -html > hardware_report.html
inxi -Fxxxz