一、问题背景

某台安装 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,通常就说明驱动安装状态是正确的。

Leave a Reply

Your email address will not be published. Required fields are marked *