处理BCM4312网卡驱动纪实

2013年07月03日

现在我是越来越讨厌不开源并且不标准化的产品了。拿我Thinkpad跟老婆换了一台hp来用,果断格操作系统装ubuntu server + openbox,重头打造属于自己的超级清凉的系统。木办法,有强迫症的人。

于是乎,在无线网卡上面卡住了,搞了一下午才把驱动装好。BCM4312是一块比较奇葩的网卡,一般来说ubuntu对大多数硬件都已经支持得很好了,但是这个网卡一定要装驱动。

谷歌了一下,网上的人提供了闭源驱动wl和开源驱动b43两种方案。同时,我采用wicd-curses来管理我的无线网络。

首先,说明一下如何查询硬件信息和一些系统信息。为方便,把其他硬件信息的查询方式也说明如下:

# 查看硬件信息
dmidecode | less
# 查看总线信息,一般指主板上的设备
lspci -vvnn

# 查看CPU信息
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
# 实际有多少核心
cat /proc/cpuinfo | grep physical | uniq -c
# 当前使用字长,32位还是64位
getconf LONG_BIT

# 查看内存信息
cat /proc/meminfo

# 查看操作系统内核信息
uname -a
# 查看操作系统发行版信息
cat /etc/issue

# 利用内核加载硬件驱动时打印的信息来查看网卡信息
dmesg | grep -i eth

可以使用grep命令过滤查询到的信息,如lspci -vvvnn|grep Net可以显示网卡型号。

实验证明b43驱动在我的本子上是无法正常工作的,但是此处还是记录一下我的安装过程。主要参考了b43官方文档ubuntu帮助

sudo apt-get install b43-fwcutter
sudo apt-get install firmware-b43-installer
# 坑爹了,这条语句提示需用firmware-b43-lpphy-installer替代,然后又提示有个包无法被bzip2解压
# 没办法,还是手动安装吧!
wget http://www.lwfinger.com/b43-firmware/broadcom-wl-5.100.138.tar.bz2
tar xjf broadcom-wl-5.100.138.tar.bz2
sudo b43-fwcutter -w /lib/firmware broadcom-wl-5.100.138/linux/wl_apsta.o
# 有人提到需要去除对bcm43xx驱动的禁用,使用下面命令找到是在哪儿禁用的
egrep 'bcm' /etc/modprobe.d/*

# 完成后开启驱动
sudo modprobe b43
## 卸载驱动
# sudo modprobe -r b43
# sudo rmmod b43

好吧,一通折腾,此方案没有成功,无线网卡的键盘灯根本就没亮,尽管我是否想用开源的驱动,并且它提供了更多的功能。

接下来,上闭源驱动:

# 为免冲突先把上面装的删了
sudo apt-get purge firmware-b43-lpphy-installer
# 装闭源驱动
sudo apt-get install bcmwl-kernel-source
# 加载驱动
sudo modprobe wl

键盘灯是亮了,但是进入wicd-curses还是不能扫描到网络。这下没辙了,于是我就不停在b43wl之间换,试各种方式,检查各个操作步骤。最后被我发现是坑爹的wicd的问题,有两个链接文件位置错了,

sudo rm /etc/resolv.conf
sudo ln -s /run/resolvconf/resolv.conf /etc/resolv.conf
sudo rm /var/lib/wicd/resolv.conf.orig
sudo ln -s /run/resolvconf/resolv.conf /var/lib/wicd/resolv.conf.orig
sudo service wicd start

对了,上面有一点没有说到,就是现在ubuntu 13.04源里的wl驱动有问题,在运行命令sudo iwconfig的时候会把内核搞死掉。所以需要安装一个打了补丁的版本:

wget https://launchpad.net/~eugenesan/+archive/ppa/+build/4546722/+files/bcmwl-kernel-source_6.30.223.30%2Bbdcom-0ubuntu1%7Eeugenesan%7Eraring2_i386.deb
sudo dpkg -i bcmwl-kernel-source_6.30.223.30+bdcom-0ubuntu1~eugenesan~raring2_i386.deb

这其中我还考虑到是不是我NIC(Network Interface Card)的名称没有搞对,cat /etc/udev/rules.d/70-persistent-net.rules查看硬件对应的名称,果然,里面提示我wl模块的名称应该是eth1而非我们常说的wlan0,赶紧去/etc/network/interfaces改成下面这样:

auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet dhcp

auto eth1
iface eth1 inet dhcp

采用动态分配地址。

然后,再打开wicd-curses还是没有反应,彻底崩溃中。。。

看到前面有人提到使用iwconfig命令,这玩意儿干嘛的呀?跑一下一看,诶,有识别到eth1啊!这才想到是wicd-curses的问题。查看它的设置(敲wicd-curses,然后shift+p进设置),发现有无线网卡一栏没有填写东西,赶紧填上名称eth1,这才能检测到网络信号!

好吧,折腾死我了。