设置Alpine Linux无线: broadcom-wl
警告
本文的方法现在可能已经失效,我在 Alpine Linux 升级到内核 6.12.67-0-lts 时,已无法完成 broadcom-wl 源代码编译,之前简单手工修订已无法解决。不过,gemini提供了一些参考信息,我整理在 快速设置Alpine Linux无线: broadcom-wl ,准备在后续实践。
备注
在 MacBook Pro 15" Late 2013 和 MacBook Air 13" Early 2014 上安装Alpine Linux时,默认系统没有识别出Broadcom无线网卡:
Broadcom
BCM4360使用 wl 芯片,需要使用broadcom-wl驱动,该驱动是non-free,默认没有包含在仓库中需要使用源代码自行编译
broadcom-wl驱动来安装
本文重点记录如何在Alpine Linux编译 broadcom-wl 驱动来支持 Broadcom BCM4360
树莓派Raspberry Pi 3 上安装Alpine Linux非常顺利能够识别无线网卡,所以配置无线记录在 设置Alpine Linux无线
安装pciutils:
apk add pciutils
检查网卡设别:
lspci | grep -i network
显示:
03:00.0 Network controller: Broadcom Inc. and subsidiaries BCM4360 802.11ac Wireless Network Adapter (rev 03)
wl 驱动编译
安装编译环境:
apk add git alpine-sdk linux-headers linux-lts-dev
下载驱动源代码仓库:
broadcom-wl 源代码git clone https://github.com/antoineco/broadcom-wl
cd broadcom-wl
编译安装:
broadcom-wlmake
doas make install
doas depmod -A
doas modprobe wl
重要 必须屏蔽掉冲突内核模块,否则系统会加载错误模块并导致
wlan0不可见
/etc/modprobe.d/blacklist.conf# wireless drivers (conflict with Broadcom hybrid wireless driver 'wl')
blacklist ssb
blacklist bcma
blacklist b43
blacklist brcmsmac
问题排查
我在执行 make 时遇到报错:
asm/unaligned.hKBUILD_NOPEDANTIC=1 make -C /lib/modules/`uname -r`/build M=`pwd`
make[1]: Entering directory '/usr/src/linux-headers-6.12.55-0-lts'
CFG80211 API is prefered for this kernel version
Using CFG80211 API
CC [M] /home/admin/broadcom-wl/src/shared/linux_osl.o
CC [M] /home/admin/broadcom-wl/src/wl/sys/wl_linux.o
/home/admin/broadcom-wl/src/wl/sys/wl_linux.c:59:10: fatal error: asm/unaligned.h: No such file or directory
59 | #include <asm/unaligned.h>
| ^~~~~~~~~~~~~~~~~
compilation terminated.
make[3]: *** [scripts/Makefile.build:229: /home/admin/broadcom-wl/src/wl/sys/wl_linux.o] Error 1
make[2]: *** [/usr/src/linux-headers-6.12.55-0-lts/Makefile:1945: /home/admin/broadcom-wl] Error 2
make[1]: *** [Makefile:224: __sub-make] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-6.12.55-0-lts'
make: *** [Makefile:159: all] Error 2
我检查了 linux-headers 包含了 :
/usr/src/linux-headers-6.12.55-0-lts/include/linux/unaligned.h
/usr/src/linux-headers-6.12.55-0-lts/include/vdso/unaligned.h
google AI提示是较新的内核更改了头文件位置,从 asm/unaligned.h 移动到了 linux/unaligned.h ,所以修改 src/wl/sys/wl_linux.c 然后重新编译即可
但是我发现重启操作系统,并且确认 lsmod | grep wl 已经看到了如下内核加载:
wl 6463488 0
cfg80211 1413120 3 wl,b43,mac80211
检查系统日志 dmesg :
[ 3.033728] b43-phy0: Broadcom 4360 WLAN found (core revision 42)
[ 3.034941] b43-phy0 ERROR: FOUND UNSUPPORTED PHY (Analog 12, Type 11 (AC), Revision 1)
[ 3.034950] b43 bcma0:1: probe with driver b43 failed with error -95
[ 3.034983] Broadcom 43xx driver loaded [ Features: PNLS ]
奇怪,怎么针对 BCM4360 加载了 b43 驱动?加载失败
尝试修改 /etc/modprobe.d/blacklist.conf 添加阻断 b43 :
b43 加载blacklist b43
但是重启后还是没有识别出 wlan0
检查 dmesg 日志,甚至没有看到 broadcom 相关信息
我发现一个奇怪的现象, lspci 显示 BCM4360 加载的内核模块是 bcma-pci-bridge :
lspci -vv -s 03:00.0 显示 BCM4360 使用的驱动是 bcma-pci-bridge03:00.0 Network controller: Broadcom Inc. and subsidiaries BCM4360 802.11ac Dual Band Wireless Network Adapter (rev 03)
Subsystem: Apple Inc. Device 0117
Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
...
Capabilities: [220 v1] Physical Resizable BAR
BAR 2: current size: 2MB, supported: 1MB 2MB
Kernel driver in use: bcma-pci-bridge
补充安装firmware(似乎应该先安装?):
apk add linux-firmware-brcm
但是没有解决问题
仔细看了一下 GitHub: antoineco/broadcom-wl ,原来 wl 模块和以下内核模块不兼容:
wl 的冲突模块ssb
bcma
b43
brcmsmac
解决了: 修订
/etc/modprobe.d/blacklist.conf添加:
/etc/modprobe.d/blacklist.conf# wireless drivers (conflict with Broadcom hybrid wireless driver 'wl')
blacklist ssb
blacklist bcma
blacklist b43
blacklist brcmsmac
然后重启系统就能够正常看到 wlan0 无线网卡了
akms 安装wl驱动(参考)
警告
我尝试本段落在安装编译dkms时候没有成功,因为最终上文的手工编译安装 wl.ko 成功,所以放弃本段,仅记录参考
Broadcom wl driver for alpine linux 采用了 akms 来编译安装apline linux的dkms
按照 Setting up the build environment on HDD 设置好编译环境
获取代码仓库:
git clone https://codeberg.org/haesbaert/broadcom-wl-alpine.git
编译软件包
# 首次使用abuild需要生成一个私钥
abuild-keygen -a -i
# abuild编译
cd broadcom-wl-alpine && abuild -r
编译后的软件包位于
~/packages目录,通过doas apk add ./broadcom-wl-6.30.223.271-r_.apk安装,实际安装过程会有一个dkms内核编译,不过我的实践在ibianyi过程失败,遂放弃...
无线安装配置
安装无线配置软件:
apk add wireless-tools wpa_supplicant
检查无线网卡:
ip link
遗留问题
源代码安装会执行 akms 配置,后续内核升级会自动出发 wl 内核模块编译,但是实践发现 akms 触发的内核模块编译会出错:
akms 编译 wl 内核模块报错...
from /var/lib/akms/6.12.58-0-lts/wl/6.30.223.271/build/src/include/linuxver.h:40:
/var/lib/akms/6.12.58-0-lts/wl/6.30.223.271/build/src/wl/sys/wl_linux.c: In function 'wl_down':
./include/linux/workqueue.h:765:9: warning: call to '__warn_flushing_systemwide_wq' declared with attribute warning: Please avoid flushing system-wide workqueues. [-Wattribute-warning]
765 | __warn_flushing_systemwide_wq(); \
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/var/lib/akms/6.12.58-0-lts/wl/6.30.223.271/build/src/wl/sys/wl_linux.c:1498:25: note: in expansion of macro 'flush_scheduled_work'
1498 | flush_scheduled_work();
| ^~~~~~~~~~~~~~~~~~~~
LD [M] /var/lib/akms/6.12.58-0-lts/wl/6.30.223.271/build/wl.o
ld: cannot find /var/lib/akms/6.12.58-0-lts/wl/6.30.223.271/build/lib/wlc_hybrid.o_shipped: No such file or directory
make[2]: *** [scripts/Makefile.build:425: /var/lib/akms/6.12.58-0-lts/wl/6.30.223.271/build/wl.o] Error 1
make[1]: *** [/usr/src/linux-headers-6.12.58-0-lts/Makefile:1945: /var/lib/akms/6.12.58-0-lts/wl/6.30.223.271/build] Error 2
make: *** [Makefile:224: __sub-make] Error 2
make: Leaving directory '/usr/src/linux-headers-6.12.58-0-lts'
akms: ERROR: Failed to build module wl/6.30.223.271 for 6.12.58-0-lts
akms: ERROR: examine /var/lib/akms/6.12.58-0-lts/wl/6.30.223.271/build
kernel-hooks: ERROR: hook 20-akms.hook failed
Executing akms-0.3.0-r0.trigger
Executing mkinitfs-3.12.0-r0.trigger
==> initramfs: creating /boot/initramfs-lts for 6.12.58-0-lts
OK: 2238 MiB in 578 packages
这个 wlc_hybrid.o_shipped 是 Broadcom STA wireless driver软件包提供的私有文件,我发现我的系统中有2个位置包含了这个大约 7.0M 大小的文件:
wlc_hybrid.o_shipped-rw-r--r-- 1 root root 7.0M Jun 13 23:56 /usr/lib/wlc_hybrid.o_shipped
-rw-r--r-- 1 admin admin 7.0M Oct 31 16:59 /home/admin/broadcom-wl/lib/wlc_hybrid.o_shipped
而且 /home/admin/broadcom-wl/lib/ 目录下就只有这一个文件和LICENSE.txt,所以我直接复制到缺乏文件的 akms 目录(该目录下没有 lib 目录):
wlc_hybrid.o_shippedcp -r /home/admin/broadcom-wl/lib /var/lib/akms/6.12.58-0-lts/wl/6.30.223.271/build/
警告
以下内容为早期探索,实际上是Broadcom b43 编译安装步骤,和 broadcom-wl 不同,仅供参考
安装 b43 firmware
备注
这段不需要了,因为 b43 源代码包含firmware部分,可以通过源代码安装firmware,见下文
如果没有看到 wlan0 设备,则说明需要安装无线网卡的firmware:
apk add linux-firmware
alpine linux linux-firmware 包含了90+以上驱动fireware,其中就包含了 linux-firmware-brcm (我可能搞错firmware软件包了 linux-firmware-brcm 是用于比较陈旧的braodcom芯片,另外从源代码编译 broadcom-wl 驱动包会自动处理获取和安装需要的firmware)
完整安装 linux-firmware 非常缓慢,所以建议只安装需要的firmware:
apk add linux-firmware-brcm
如果不需要任何firmware,则安装 linux-firmware-none ,如果不知道需要安装哪个firmware,则:
dmesg | grep firmware
查看需要安装信息
编译b43驱动
官方文档 Connecting to a wireless access point 已经说明了Broadcom芯片需要手工编译安装驱动
检查Broadcom无线芯片:
dmesg | grep Broadcom
可以看到:
[ 8.212259 ] b43-phy0: Broadcom 4360 WLAN found (core revision 42)
[ 8.212536 ] Broadcom 43xx driver loaded [ Features: PNLS ]
安装SDK和git:
apk add alpine-sdk git
切换到普通用户,然后将这个用户账号添加到
abuild组:su - huatai sudo addgroup $(whoami) abuild
首次build软件包,需要生成一个签名包到key:
abuild-keygen -a -i
下载源代码:
git clone git://git.alpinelinux.org/aports
进入 b43-firmware
cd aports/non-free/b43-firmware
在目录下有一个 APKBUILD 文件,类似 Gentoo Linux
编译软件包:
abuild -r
编译完成后,在 ~/packages/non-free/x86_64/ 目录下有一个 b43-firmware-4.150.10.5-r1.apk 软件包
需要传递一个
--allow-untrusteddapk add --allow-untrusted ~/packages/non-free/x86_64/b43-firmware-4.150.10.5-r1.apk
报错:
(1/1) Installing b43-firmware (4.150.10.5-r1)
ERROR: Failed to create lib/firmware/b43/a0g0bsinitvals5.fw: No such file or directory
ERROR: Failed to create lib/firmware/b43/a0g0bsinitvals9.fw: No such file or directory
ERROR: Failed to create lib/firmware/b43/a0g0initvals5.fw: No such file or directory
...
在 Broadcom wireless package installation 提出了是需要参考 How do I write to/make changes to an existing squashfs filesystem? 修订squashfs文件系统。不过,我暂时没有时间实践,等以后有机会再补充。