一、问题背景
某台安装 Arch Linux 的 MacBook 在系统升级后再次出现没有声音的问题。
机器使用的是 Cirrus Logic CS8409 相关声卡,需要依赖第三方驱动 snd-hda-macbookpro 才能正常驱动内置扬声器和耳机。此前系统中安装的是 AUR 包:
snd-hda-macbookpro-dkms-git 0.1-3
系统升级后,内核版本变为:
7.0.7-arch1-1
重新安装 AUR 包后,声音仍然无法恢复。因此问题重点不再是“软件包是否安装”,而是要确认:
DKMS 是否针对当前内核成功编译
模块是否安装到正确位置
系统是否加载了修正版 snd-hda-codec-cs8409 模块
二、先确认内核、headers 和 DKMS 环境
首先检查当前内核版本:
uname -r
输出为:
7.0.7-arch1-1
继续检查内核、headers 和 DKMS:
pacman -Q linux linux-headers dkms
结果为:
linux 7.0.7.arch1-1
linux-headers 7.0.7.arch1-1
dkms 3.4.1-1
再检查当前内核的 build 目录:
ls -ld /usr/lib/modules/$(uname -r)/build
结果为:
drwxr-xr-x ... /usr/lib/modules/7.0.7-arch1-1/build
这说明基础环境没有问题:
内核版本正常
linux-headers 与当前内核匹配
DKMS 已安装
/usr/lib/modules/.../build 目录存在
因此可以排除 headers 缺失、内核和 headers 不匹配、DKMS 环境缺失等常见问题。
中间曾出现过一个无关报错:
builduname -r
bash: builduname: command not found
这只是复制命令时把两段命令粘连在一起导致的,不是系统故障。
三、问题真正原因
这次问题的关键在于:
AUR 包 snd-hda-macbookpro-dkms-git 0.1-3 没有正确适配当前 Linux 7.0.7 内核。
Linux 6.17 以后,内核 sound 相关源码目录结构发生过变化。旧版构建脚本可能仍然假设旧路径,因此在新内核上会出现构建流程不稳定、模块生成位置不符合 DKMS 预期,或者安装后模块不生效等问题。
因此继续反复执行:
paru -S snd-hda-macbookpro-dkms-git
意义不大。
更合理的处理方式是绕过 AUR 包,直接使用上游最新版源码中的安装脚本。
四、清理旧 DKMS 和 AUR 包
先删除旧的 DKMS 记录:
sudo dkms remove snd-hda-macbookpro/0.1 --all
输出:
Deleting module snd-hda-macbookpro/0.1 completely from the DKMS tree.
然后卸载 AUR 包:
sudo pacman -Rns snd-hda-macbookpro-dkms-git
卸载时同时删除了:
snd-hda-macbookpro-dkms-git
dkms
这是因为使用了 -Rns,而系统当时认为 dkms 已经没有其他软件包依赖,所以一起作为不再需要的依赖删除了。
这不是严重问题,之后重新安装 DKMS 即可。
继续清理残留目录:
sudo rm -rf /var/lib/dkms/snd-hda-macbookpro
sudo rm -rf /usr/src/snd-hda-macbookpro-0.1
sudo depmod -a
这一步完成后,旧 AUR 包和旧 DKMS 状态已经清理干净。
五、重新安装 DKMS
由于卸载 AUR 包时 DKMS 被一起删除,需要重新安装:
sudo pacman -S dkms
之后再次确认:
pacman -Q dkms
输出:
dkms 3.4.1-1
六、使用上游最新版源码安装
进入工作目录并拉取上游源码:
cd ~/workspace
git clone https://github.com/davidjo/snd_hda_macbookpro.git
cd snd_hda_macbookpro
然后执行上游安装脚本:
sudo ./install.cirrus.driver.sh -i
这次输出显示构建成功:
Creating symlink /var/lib/dkms/snd_hda_macbookpro/0.1/source -> /usr/src/snd_hda_macbookpro-0.1
Sign command: /usr/lib/modules/7.0.7-arch1-1/build/scripts/sign-file
Signing key: /var/lib/dkms/mok.key
Public certificate (MOK): /var/lib/dkms/mok.pub
Running the pre_build script............... done.
Building module(s).... done.
Signing module /var/lib/dkms/snd_hda_macbookpro/0.1/build/build/hda/codecs/cirrus/snd-hda-codec-cs8409.ko
Found pre-existing /usr/lib/modules/7.0.7-arch1-1/kernel/sound/hda/codecs/cirrus/snd-hda-codec-cs8409.ko.zst, archiving for uninstallation
Installing /usr/lib/modules/7.0.7-arch1-1/updates/dkms/snd-hda-codec-cs8409.ko.zst
Running depmod... done.
最重要的是这几行:
Building module(s).... done.
Signing module ...
Installing /usr/lib/modules/7.0.7-arch1-1/updates/dkms/snd-hda-codec-cs8409.ko.zst
Running depmod... done.
这说明新版上游脚本已经成功为当前内核构建并安装了修正版模块。
七、确认 DKMS 和模块路径
安装完成后检查 DKMS 状态:
dkms status
输出:
snd_hda_macbookpro/0.1, 7.0.7-arch1-1, x86_64: installed (Original modules exist)
再检查当前实际使用的模块路径:
modinfo -n snd-hda-codec-cs8409
输出:
/lib/modules/7.0.7-arch1-1/updates/dkms/snd-hda-codec-cs8409.ko.zst
这一步非常关键。
正常内核自带模块通常位于:
/lib/modules/7.0.7-arch1-1/kernel/...
而现在 modinfo -n 指向:
/lib/modules/7.0.7-arch1-1/updates/dkms/...
说明系统优先使用 DKMS 安装的修正版模块,而不是内核自带的原始模块。
其中:
Original modules exist
不是错误。意思是系统原本自带的 snd-hda-codec-cs8409 模块仍然存在,但 DKMS 版本会以更高优先级覆盖它。
八、重启并检查声音设备
驱动安装完成后,建议直接重启:
reboot
重启后检查声卡设备:
aplay -l
wpctl status
lsmod | grep -E 'snd_hda|cs8409'
如果声音恢复,就说明问题已经解决。
九、这次问题的结论
这次故障不是普通的“没装驱动”,也不是 headers 缺失。
真正原因是:
系统升级到 Linux 7.0.7 后,AUR 里的 snd-hda-macbookpro-dkms-git 0.1-3 没有正确完成当前内核下的构建和安装。
解决方式是:
清理旧 AUR/DKMS 状态
重新安装 DKMS
直接使用上游最新版 snd_hda_macbookpro 源码脚本安装
确认模块安装到 updates/dkms 路径
重启系统
最终有效状态为:
snd_hda_macbookpro/0.1, 7.0.7-arch1-1, x86_64: installed
/lib/modules/7.0.7-arch1-1/updates/dkms/snd-hda-codec-cs8409.ko.zst
dkms 3.4.1-1
这说明当前内核下的修正版声卡模块已经正确安装。
十、后续注意事项
短期内不建议重新安装 AUR 包:
snd-hda-macbookpro-dkms-git
因为它可能再次覆盖当前已经成功安装的上游脚本版本。
之后如果系统再次升级内核,声音又失效,可以优先进入源码目录执行:
cd ~/workspace/snd_hda_macbookpro
git pull
sudo ./install.cirrus.driver.sh -r
sudo ./install.cirrus.driver.sh -i
然后检查:
dkms status
modinfo -n snd-hda-codec-cs8409
只要模块路径仍然指向:
updates/dkms/snd-hda-codec-cs8409.ko.zst
并且 DKMS 状态显示当前内核已 installed,通常就说明驱动安装状态是正确的。