1. 为什么我偏要在 Ubuntu 22.04 上折腾 Arc A770
先说结论:Intel Arc A770 在 Ubuntu 22.04 上跑起来,比大多数人想象的要顺,但前提是你得把两件事做对——内核版本要够新,RBAR(Resizable BAR)要开。这两件事任何一件没搞定,你要么进不了桌面,要么性能直接砍半,要么clinfo里根本看不到显卡。
我手上这张是 A770 16GB 公版,插在一台 B660 + i5-12400 的机器上,系统是 Ubuntu 22.04.4 LTS。之所以选 22.04 而不是更新的 24.04,是因为我日常跑的一些推理框架和容器镜像在 22.04 上验证得最充分,不想为了显卡把整个环境迁走。但 22.04 原生的 5.15 内核对于 Arc 来说太老了,i915驱动虽然能认卡,但频率管理、电源状态、部分编解码能力都不完整,所以升级内核是绕不开的第一步。
这篇文章适合三类人:一是刚拿到 Arc 显卡想在 Linux 下做深度学习推理或者视频转码的;二是装了驱动但发现xpu-smi报错、clinfo看不到设备的;三是机器点不亮或者进系统后频繁花屏、掉驱动的。我会把 RBAR 的开启、内核升级、驱动栈安装、验证、以及我自己踩过的几个坑完整讲一遍,尽量让你少走弯路。
需要提前说明的是,Arc 在 Linux 下的软件栈和 NVIDIA 完全不是一回事。NVIDIA 是装一个闭源驱动包就完事,Arc 走的是开源内核驱动i915+ 用户态计算栈intel-compute-runtime+ 媒体栈intel-media-driver的组合。理解这个分层,后面排查问题会清晰很多。
2. 装系统之前必须先确认的 RBAR 状态
2.1 RBAR 到底是什么,为什么 Arc 离了它不行
RBAR 全称 Resizable BAR,中文一般叫"可变基址寄存器"。传统上 CPU 访问显卡显存,一次只能映射 256MB 的窗口,显卡要把数据搬来搬去。RBAR 允许系统把整个显存一次性映射给 CPU 访问,省掉了反复搬运的开销。
对 Arc 来说这不是"锦上添花",而是"刚需"。Intel 官方明确说过,Arc 系列在未开启 RBAR 的平台上性能会有明显损失,部分游戏和负载下差距能到两位数百分比。更麻烦的是在 Linux 下,如果 RBAR 没开,i915驱动加载时可能直接报错或者设备初始化不完整,表现就是lspci能看到卡,但/dev/dri下没有对应的 render 节点。
所以我的建议是:在装系统之前,先进 BIOS 把 RBAR 打开。这样能省掉后面一大堆"驱动装了但用不了"的排查时间。
2.2 进 BIOS 开 RBAR 的具体路径
不同主板叫法不一样,我列几个常见的:
| 主板品牌 | BIOS 里的位置 | 备注 |
|---|---|---|
| 华硕 ASUS | Advanced → PCI Subsystem Settings → Re-Size BAR Support | 需同时开启 Above 4G Decoding |
| 微星 MSI | Settings → Advanced → PCI Subsystem Settings → Re-Size BAR | 部分老 BIOS 叫 "Resizable BAR" |
| 技嘉 GIGABYTE | Settings → IO Ports → Above 4G Decoding 和 Re-Size BAR Support | 两个都要开 |
| 华擎 ASRock | Advanced → PCI Configuration → Re-Size BAR Support | 需先开 Above 4G Decoding |
有两个关键点容易被忽略:
第一,Above 4G Decoding 必须先开。RBAR 依赖 64 位地址空间,如果 Above 4G Decoding 是关闭的,RBAR 选项要么是灰的,要么开了也不生效。
第二,CSM(Compatibility Support Module)必须关闭。CSM 是给老系统用的兼容模式,它会把系统限制在传统 BIOS 引导方式,RBAR 在这种模式下无法正常工作。如果你装的是 UEFI 引导的 Ubuntu,CSM 本来就该关。
改完之后保存重启,进系统用这条命令验证:
sudo lspci -vv -s $(lspci | grep -i "VGA.*Intel" | cut -d' ' -f1) | grep -i "BAR"如果看到类似Region 2: Memory at ... (64-bit, prefetchable) [size=16G]这样的大尺寸 BAR,说明 RBAR 生效了。如果还是 256M,那就是没开成功,回 BIOS 再检查。
2.3 一个反直觉的坑:开了 RBAR 反而进不去系统
我自己遇到过一次:开了 RBAR 之后,Ubuntu 安装 U 盘引导到一半黑屏。当时以为是显卡坏了,后来发现是安装镜像里的老内核(5.15)配合 RBAR 有兼容问题。
解决办法有两个:一是临时在 BIOS 里把 RBAR 关掉,装完系统升级内核后再打开;二是直接用 22.04.4 及以后的镜像,它的 HWE 内核版本更高,兼容性更好。我推荐第二个,省得来回折腾。
提示:如果你用的是 22.04.0 或 22.04.1 的原始镜像,建议直接去官网下 22.04.4 或更新的 point release,内核版本会新不少。
3. 内核版本:Arc 驱动能不能跑起来的命门
3.1 为什么 5.15 内核不够用
Ubuntu 22.04 原生带的是 5.15 内核。这个版本里i915对 Arc 的支持处于"能认卡但功能不全"的状态。具体表现包括:
- 显卡频率被锁在低频,性能上不去
- 电源管理不工作,待机功耗偏高
- AV1 编解码支持不完整
- 部分情况下
xe相关的新特性完全缺失
Arc 的完整支持大概是从 6.2 内核开始逐步完善的,6.5 之后比较稳定。所以我的做法是直接上 6.5 或更高的 HWE 内核。
3.2 升级内核的两种方式
方式一:用 Ubuntu 官方 HWE 内核(推荐给求稳的人)
sudo apt update sudo apt install --install-recommends linux-generic-hwe-22.04 sudo reboot重启后uname -r看一下,应该是 6.5 或 6.8 系列。这种方式的好处是内核由 Ubuntu 官方维护,安全更新跟着走,不用担心自己编译出问题。
方式二:用主线内核(适合需要更新版本的人)
如果 HWE 内核还是不够新,可以去 kernel.ubuntu.com 下载主线内核的 deb 包手动安装。但我要提醒一句:主线内核没有 Ubuntu 的签名和模块适配,某些第三方驱动(比如 VirtualBox、部分网卡驱动)可能会编译失败。除非你有明确需求,否则优先用 HWE。
3.3 升级内核后必须做的清理
升级完内核,旧的 5.15 内核还在。如果你确认新内核稳定,可以清掉旧的省空间:
sudo apt autoremove --purge但别急着删。我建议至少保留一个旧内核作为 fallback,万一新内核出问题还能在 GRUB 里选回去。等新内核跑了一两周没问题再清理。
另外,升级内核后第一次启动可能会比较慢,因为要重建 initramfs 和模块依赖。耐心等,别以为卡死了就强制关机。
4. 驱动栈的三层结构:i915、compute-runtime、media-driver
4.1 内核态:i915 驱动
i915是 Intel 显卡的内核态驱动,已经包含在 Linux 内核里,不需要额外安装。升级内核本质上就是在升级它。验证它有没有正确加载:
sudo dmesg | grep -i i915正常的话能看到一堆初始化日志,包括显卡型号、显存大小、固件加载情况。如果看到GuC firmware或HuC firmware加载失败的报错,说明固件缺失,需要装linux-firmware:
sudo apt install linux-firmwareGuC 和 HuC 是显卡上的微控制器固件,负责调度和编解码加速。Arc 对这两个固件依赖比较重,缺了会导致性能异常或者编解码不可用。
4.2 用户态计算栈:intel-compute-runtime
这层是给 OpenCL 和 Level Zero 用的,跑深度学习推理、科学计算都靠它。安装:
sudo apt update sudo apt install intel-opencl-icd intel-level-zero-gpu level-zero装完之后用clinfo验证:
sudo apt install clinfo clinfo | grep -i "Device Name"应该能看到Intel(R) Arc(TM) A770 Graphics。如果只看到 CPU 的 OpenCL 设备,说明 compute-runtime 没认到显卡,回去检查内核版本和 RBAR。
4.3 媒体栈:intel-media-driver
这层负责硬件编解码,做视频转码、ffmpeg 加速必须装:
sudo apt install intel-media-va-driver-non-free vainfo注意包名里的non-free,因为部分编解码器有专利限制,Ubuntu 把它放在 non-free 仓库。装完验证:
vainfo输出里应该能看到VAProfileAV1Profile0、VAProfileHEVCMain之类的条目,说明 AV1 和 HEVC 硬解可用。
4.4 三层之间的关系
我用一个类比帮你理解:i915是发动机,compute-runtime是变速箱(负责把算力输出给计算任务),media-driver是另一套传动(负责把算力输出给视频编解码)。三者独立安装,但都依赖内核态驱动正常工作。所以排查问题时,永远从dmesg | grep i915开始,内核态不对,上面两层怎么装都没用。
5. 完整安装流程与验证清单
5.1 从零开始的步骤
假设你已经装好 Ubuntu 22.04.4,RBAR 已开,下面是完整流程:
# 1. 更新系统 sudo apt update && sudo apt upgrade -y # 2. 安装 HWE 内核 sudo apt install --install-recommends linux-generic-hwe-22.04 -y # 3. 安装固件 sudo apt install linux-firmware -y # 4. 重启进入新内核 sudo reboot重启后确认内核:
uname -r然后装用户态栈:
# 5. 计算栈 sudo apt install intel-opencl-icd intel-level-zero-gpu level-zero -y # 6. 媒体栈 sudo apt install intel-media-va-driver-non-free vainfo clinfo -y # 7. 把当前用户加入 render 和 video 组 sudo usermod -aG render,video $USER第 7 步很多人会漏。不加组的话,普通用户访问/dev/dri/renderD128会权限不足,表现为clinfo用 sudo 能跑、不用 sudo 就报错。加完组要重新登录才生效。
5.2 验证清单
按顺序跑这几条,全过就说明环境没问题:
# 内核态 sudo dmesg | grep -i "i915" | grep -i "error" # 设备节点 ls -l /dev/dri/ # OpenCL clinfo | grep -i "Arc" # Level Zero sycl-ls # 媒体能力 vainfo | grep -i "AV1"/dev/dri/下应该有card0、card1、renderD128之类的节点。renderD128是计算用的,card0是显示用的。如果只有card0没有renderD128,说明计算侧没起来。
5.3 一个实测的性能参考
装好之后我跑了个简单的 ffmpeg AV1 转码测试,1080p 视频,用av1_qsv编码器:
ffmpeg -hwaccel qsv -i input.mp4 -c:v av1_qsv -preset medium output.mp4对比纯 CPU 软编,速度大概快了 8 到 10 倍。这个提升主要来自媒体栈,跟计算栈无关。如果你主要做视频处理,媒体栈的验证比计算栈更重要。
6. 我踩过的四个坑和排查过程
6.1 坑一:clinfo 只显示 CPU,不显示 Arc
现象:装完 compute-runtime,clinfo里只有 CPU 的 OpenCL 设备。
排查链路:先看dmesg | grep i915,发现有GuC firmware load failed。顺着查,发现linux-firmware版本太老,里面没有 Arc 需要的dg2_guc_*.bin。升级linux-firmware到最新版后重启,问题解决。
经验:Arc 是较新的硬件,固件更新频繁。装完系统第一件事就是把linux-firmware升到最新,别用镜像里自带的。
6.2 坑二:权限问题导致非 root 用户用不了
现象:sudo clinfo正常,普通用户clinfo报clGetPlatformIDs failed。
原因:当前用户不在render组里,没有/dev/dri/renderD128的读写权限。
解决:sudo usermod -aG render,video $USER,然后完全注销重新登录。注意是注销,不是开个新终端,因为组权限在登录时确定。
6.3 坑三:RBAR 开了但系统不稳定
现象:开 RBAR 后系统偶发花屏,重负载下掉驱动。
排查:查dmesg发现i915报 GPU hang。这种情况通常是 RBAR 和某些 BIOS 版本的兼容问题。我的处理是先把 BIOS 刷到最新版,问题缓解了大半。如果还不行,可以在内核参数里加i915.enable_guc=2强制启用 GuC 调度,稳定性会好一些。
修改内核参数的方法:
sudo nano /etc/default/grub # 在 GRUB_CMDLINE_LINUX_DEFAULT 里加上 i915.enable_guc=2 sudo update-grub sudo reboot6.4 坑四:升级内核后 NVIDIA 驱动挂了(双卡机器)
现象:机器上同时有 Arc 和一张 NVIDIA 卡,升级内核后 NVIDIA 驱动模块编译失败。
原因:NVIDIA 闭源驱动是 DKMS 编译的,新内核的头文件还没装。
解决:
sudo apt install linux-headers-$(uname -r) sudo dpkg-reconfigure nvidia-dkms-*装完头文件重新编译 DKMS 模块即可。这也是我建议保留旧内核的原因之一——万一新内核下某个 DKMS 模块编不过,还能回退。
7. 日常维护和几个实用技巧
7.1 怎么查看显卡实时状态
Intel 有个intel-gpu-tools包,里面的intel_gpu_top能看 GPU 利用率和频率:
sudo apt install intel-gpu-tools sudo intel_gpu_top输出里重点看Render/3D和Video两列的占用率。如果跑推理时Render/3D一直是 0,说明计算任务没走 GPU,回去查 compute-runtime。
7.2 内核升级后驱动"消失"了怎么办
这是最常见的问题。Ubuntu 自动升级内核后,如果你装的是 DKMS 类的驱动,需要重新编译。Arc 的驱动栈大部分是内核自带的,不受影响,但如果你还装了其他 DKMS 模块,升级后跑一遍:
sudo dkms autoinstall7.3 卸载重装的正确姿势
如果驱动装乱了想重来,别用网上那些apt purge一通乱删的脚本。Arc 的驱动栈分层清晰,按层卸载即可:
sudo apt purge intel-opencl-icd intel-level-zero-gpu level-zero sudo apt purge intel-media-va-driver-non-free内核态的i915不用卸,它是内核的一部分,卸载不了也不该卸。卸完重启,再按第 5 节的流程重装。
7.4 关于稳定性的一点个人体会
Arc 在 Linux 下的成熟度这两年提升很快,但相比 NVIDIA 还是有一些边角问题。我的经验是:内核版本尽量新,固件尽量新,BIOS 尽量新。这三样保持更新,能规避掉九成以上的玄学问题。另外,如果你做的是生产环境,建议在正式部署前用目标负载压测至少 24 小时,观察dmesg里有没有 GPU hang 或者 reset 记录,早发现早处理。
最后分享一个小技巧:把dmesg | grep -i i915的输出重定向到文件,每次系统更新后对比一下,能快速发现驱动行为的变化。这个习惯帮我提前发现过两次固件兼容问题,比出事了再排查省心得多。