ubuntu下无线网卡解决经历(转)

来源:互联网 发布:日照市软件研发工程师 编辑:程序博客网 时间:2024/04/29 08:50
ubuntu下无线网卡解决经历(转)

水菁灵:无聊的自己给自己找事儿来着,进而是又把ubuntu重装了一遍,结果发现ubuntu10还不如11,果断决定装回11了,但无线网一直是个大问题,无奈试着找方法自己解决,这篇还不错~

转自:http://my.oschina.net/kursk/blog/7896

和很多同学一样,安装ubuntu以后无线网卡不能正常上网。通过几天的努力终于解决了这个问题,本文将从比较基础的层面,逐步讲解解决问题。

 

 软硬件配置

 DELL e5400 

 使用network manager ,没有用ndiswrapper

 

因为很多问题表现相同,但是程度不同,就像那句话所说,幸福的家庭都是相同,不幸的家庭却有各自的原因,所以我不按步骤来解释,而先描述一下正常的无线网卡工作系统应该有哪些特点,再描述可能的错误现象。

 

1、系统应该安装有无线网卡驱动,应该能识别硬件

lshw -C network

lshw命令用来显示系统硬件信息,network说明显示网卡信息,-C说明显示详细内容

正确的情况

 

  *-network               

       description: Wireless interface

       product: BCM4312 802.11b/g

       vendor: Broadcom Corporation

       physical id: 0

       bus info: 

       logical name: eth1

       version: 01

       serial: c4:17:fe:75:54:46

       width: 64 bits

       clock: 33MHz

       capabilities: bus_master cap_list ethernet physical wireless

       configuration: broadcast=yes driver=wl0 driverversion=5.60.48.36 ip=192.168.104.165 latency=0 multicast=yes wireless=IEEE 802.11

       resources: irq:17 memory:f1ffc000-f1ffffff

  *-network

       description: Ethernet interface

       product: NetXtreme BCM5761e Gigabit Ethernet PCIe

       vendor: Broadcom Corporation

       physical id: 0

       bus info: 

       logical name: eth0

       version: 10

       serial: a4:ba:db:ab:92:b6

       width: 64 bits

       clock: 33MHz

       capabilities: bus_master cap_list ethernet physical

       configuration: broadcast=yes driver=tg3 driverversion=3.102 firmware=5761e-v3.60 latency=0 multicast=yes

       resources: irq:30 memory:f1ce0000-f1ceffff memory:f1cf0000-f1cfffff

从中可以看出有两个网卡,一个是无线的,logical name 是eth1;一个是有线的,logical name是eth0

如果没有安装驱动,系统未识别硬件,那么无线可能是显示不出来的(我的揣测),我遇到一种情况——有线网卡驱动安装了,却没有加载模块,结果无线网卡network 显示 unclaim,并且没有logical name,这种情况只要手动加载,具体办法下面会讲到。

2、如果硬件能识别出来,那么系统里应该有相应的模块

 vi /etc/udev/rules.d/70-persistent-net.rules

 # This file maintains persistent names for network interfaces.

# See udev(7) for syntax.

#

# Entries are automatically added by the 75-persistent-net-generator.rules

# file; however you are also free to add your own entries.


# PCI device 0x14e4:0x1680 (tg3)

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="a4:ba:db:ab:92:b6", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"


# PCI device 0x14e4:0x4315 (b43-pci-bridge)

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="c4:17:fe:75:54:46", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="wlan*", NAME="wlan0"


# PCI device 0x14e4:0x4315 (wl)

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="c4:17:fe:75:54:46", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

从logical name我们就可以看到,无线网卡eth1对应模块是wl 下面就要理解两个命令的区别 lsmod 显示当前已经被加载的模块 modprobe -l 显示所有模块,包括已加载和未加载的模块lsmod | grep wl

wl                   1959598  0

lib80211                5046  2 lib80211_crypt_tkip,wl

这说明wl这个模块已经被加载了,而且wl依赖于lib80211这个模块

如果没有出现wl,那么说明没有被加载,那么就要继续看wl是否存在

modprobe -l | grep wl

kernel/drivers/gpio/twl4030-gpio.ko

kernel/drivers/net/wireless/wl3501_cs.kokernel/drivers/net/wireless/rndis_wlan.ko

kernel/drivers/net/wireless/mwl8k.kokernel/drivers/net/wireless/iwlwifi/iwlcore.ko

kernel/drivers/net/wireless/iwlwifi/iwlagn.ko

kernel/drivers/net/wireless/iwlwifi/iwl3945.ko

kernel/drivers/net/wireless/wl12xx/wl1251.ko

kernel/drivers/net/wireless/wl12xx/wl1251_spi.ko

kernel/drivers/net/wireless/wl12xx/wl1251_sdio.ko

kernel/drivers/net/wireless/wl12xx/wl1271.ko

kernel/drivers/usb/otg/twl4030-usb.ko

kernel/drivers/input/keyboard/twl4030_keypad.ko

kernel/drivers/input/misc/twl4030-pwrbutton.ko

kernel/drivers/rtc/rtc-twl4030.kokernel/drivers/watchdog/twl4030_wdt.ko

kernel/drivers/staging/wlan-ng/prism2_usb.ko

kernel/drivers/uwb/wlp/wlp.ko

kernel/drivers/uwb/i1480/i1480u-wlp/i1480u-wlp.ko

kernel/sound/soc/codecs/snd-soc-twl4030.ko

kernel/net/netfilter/ipvs/ip_vs_wlc.koupdates/dkms/wl.ko

看到最后一行wl.ko了吗,ko是模块名的后缀名,说明这个模块是存在的,如果没有很可能是因为没有安装驱动,并需要手动加载,这方面的内容网上很多,下面我引用了别人的一个帖子来说明

*************************************************************************** 首先 :

lspci -vnn |grep 14e4

0c:00.0 Network controller [0280]: Broadcom Corporation BCM4312 802.11b/g [14e4:4315] (rev 01)

具体pci id:14e4:4315.

4315就是用的无线芯片的具体型号了。(水:我的是4357,就这个43XX到后面会非常怨念的,啊啊啊)

然后:

在broadcom的网站上下载linux下的驱动。

www.broadcom.com/support/802.11/linux_sta.php

下了32-bit的驱动,再下了一个readme。然后基本上按照这个readme来安装驱动。

安装:

mkdir hybrid_wl

cd hybrid_wl

tar xzf <path>/hybrid-portsrc-x86_32-v5.10.91.9.3.tar.gz

我这里输入的是tar xzf ../hybrid-portsrc-x86_32-v5.10.91.9.3.tar.gz 因为我的压缩 包在上一级目录。

make clean   (optional)

make

(水:由于是43XX的显卡,最头疼的事情莫过于,你老老实实按照官网的readme来做,结果make会报错,没办法,继续google

得到解决方案http://isouth.org/archives/323.html

BCM 43XX 的驱动在 Linux 下一向很是让人蛋碎的,除了某几个发行版本外,其他系统大多不集成它的驱动。好在官方比较厚道,还是提供叻802.11 Linux STA driver源码下载,并且在README里其编译注意事项及步骤都给的很清楚。

Mint Debian 内核升级到 2.6.38 之后,使用12/22/2010 的源码却无法正确地编译此驱动叻,错误提示:

...src/wl/sys/wl_linux.c:485: error: implicit declaration of function ‘init_MUTEX’

解决方案是将源码解压后的src/wl/sys/wl_linux.c第 485行init_MUTEX(&wl->sem);手动修改为sema_init(&wl->sem,1);然后再进行编译就可以叻。

让无线网卡驱动载启动时加载,可以将加载的命令写成脚本,然后在 /etc/rc.local 的 exit 0 之前添加一行,执行此脚本。

我看完了,就得出两个字的结论,无语,照着做了,总算编译过了。。。)

 

下面就是移除原来的驱动

lsmod  | grep "b43\|ssb\|wl"

rmmod b43

rmmod ssb

rmmod wl (水:这里和后面的一些命令可能会提示说你的权限不够,于是在命令前面加上 sudo,把权限提高 sudo rmmod wl)

echo "blacklist ssb" >> /etc/modprobe.d/blacklist.conf   (echo "blacklist ssb" >> sudo /etc/modprobe.d/blacklist.conf ,后面类似的命令同理)

echo "blacklist b43" >> /etc/modprobe.d/blacklist.conf

安装:

modprobe lib80211

insmod wl.ko

安装到这里,iwconfig就可以看到有个eth1--就是Ubuntu无线网卡了,但是tx-power 还是off的。为了保险起见,我还加了两句#modprobe wl---第一次提示没有wl这个模块,后来在系统--管理--硬件驱动里面我把broadcom sta 驱动激活了(原来是没有的,好像insmod wl.ko后就有了),再次运行这个命令就可以了。
#depmod -s

装到这就完了,为了让这模块一开始就可以加载,在/etc/modules里面加上wl就可以了。

/etc/modules: kernel modules to load at boot time.

# This file contains the names of kernel modules that should be loaded at boot time, one per line. Lines beginning with "#" are ignored.lpwl

就是上面这样。在一个wiki上搜到说是在/etc/rc.conf里面加几句话,但是ubuntu没有这个文件。
我原来以为这样就可以了。装完后右上角看无线网络一直是无线网络被禁用,百思不得其解。后来在ubuntu论坛上搜了半天,各种原因,看到眼花缭乱,终于在一个回帖中看到,某人说要fn+f2来启用笔记本的Ubuntu无线网卡才行。
ok。最后的步骤,按下fn+f2.还是不行呢,再重启,进入系统前狂按fn+f2数次,进去后终于ok了。然后连接无线网络,输入密码,ok拉。

这个方法很简单麻,不象用ndiswrapper那么麻烦,而b43的驱动还不支持4315芯片。唯一的坏处是如果更新内核后要重新编译安装驱动,不过安装驱动的步骤还是很简单的麻。

***************************************************************************

3、下面看看/etc/network/interface这个文件,无数的帖子都说network manager与interface是互相冲突的,我的这个文件内容如下auto loiface lo inet loopback

、最后说明一下我是如何安装驱动,我使用过BCM官方的rpm包,也使用过sdiawrapper,因为刚开始搞时也不清楚,最终没有成功,最后参考下面的帖子完成了驱动安装

水菁灵:其实完全可以按照官网上的readme来做,不过少了解释,当然对于不喜欢英语的人来说就算了,这篇文章的解释还不错,不过我也搜到了一篇更好的(http://zhidao.baidu.com/question/135835090)

不是很明白楼主的问题,把每条语句的意思告诉你,你自己看看是哪出问题了

# mkdir hybrid_wl 创建一个名为hybrid_wl的文件夹

# cd hybrid_wl 进入hybrid_wl文件夹

# tar xzf <path>/hybrid-portsrc.tar or <path>/hybrid-portsrc-x86_64.tar.gz 解压驱动源码

# make clean (optional) 编译之前先清除目标文件

# make 编译驱动,完成后该目录下会有个wl.ko文件,即为驱动模块

# lsmod | grep "b43\|ssb\|wl" 显示当前系统中是否安装有这三个模块

# rmmod b43 卸载b43

# rmmod ssb 卸载ssb

# rmmod wl 卸载wl防止以后自动加载ssb和b43

# echo "blacklist ssb" >> /etc/modprobe.d/blacklist.conf

# echo "blacklist b43" >> /etc/modprobe.d/blacklist.conf

# rmmod wl 卸载wl# mv <path-to-prev-driver>/wl.ko <path-to-prev-driver>/wl.ko.orig 将系统自带的wl.ko模块更名为wl.ko.orig

# cp wl.ko <path-to-prev-driver>/wl.ko 将新编译好的wl.ko模块复制到<path-to-prev-driver>目录下# depmod 刷新模块依赖关系

# modprobe wl 加载wl驱动模块实在搞不定还有个笨办法,把上面的这些语句写在开机自动执行的脚本里...


关于那个官网上下载的驱动对43XX网卡无法编译的问题,还有一篇日子写到了解决方法,我就不明白了,官网上那东西明明有问题就没人给改一下么,啊啊啊啊啊!

http://www.linuxidc.com/Linux/2011-04/34696.htm

1. 检查内核版本 和硬件

#uname -a

Linux Neil-PC 2.6.38.2-9.fc15.x86_64 #1 SMP Wed Mar 30 16:55:57 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux

#lspci

00:00.0 Host bridge: Intel Corporation Core Processor DRAM Controller (rev 02)

 
00:01.0 PCI bridge: Intel Corporation Core Processor PCI Express x16 Root Port (rev 02)
00:19.0 Ethernet controller: Intel Corporation 82577LM Gigabit Network Connection (rev 05)
00:1a.0 USB Controller: Intel Corporation 5 Series/3400 Series Chipset USB2 Enhanced Host Controller (rev 05)
00:1b.0 Audio device: Intel Corporation 5 Series/3400 Series Chipset High Definition Audio (rev 05)
00:1c.0 PCI bridge: Intel Corporation 5 Series/3400 Series Chipset PCI Express Root Port 1 (rev 05)
00:1c.1 PCI bridge: Intel Corporation 5 Series/3400 Series Chipset PCI Express Root Port 2 (rev 05)
00:1c.2 PCI bridge: Intel Corporation 5 Series/3400 Series Chipset PCI Express Root Port 3 (rev 05)
00:1d.0 USB Controller: Intel Corporation 5 Series/3400 Series Chipset USB2 Enhanced Host Controller (rev 05)
00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev a5)
00:1f.0 ISA bridge: Intel Corporation Mobile 5 Series Chipset LPC Interface Controller (rev 05)
00:1f.2 SATA controller: Intel Corporation 5 Series/3400 Series Chipset 6 port SATA AHCI Controller (rev 05)
00:1f.3 SMBus: Intel Corporation 5 Series/3400 Series Chipset SMBus Controller (rev 05)
00:1f.6 Signal processing controller: Intel Corporation 5 Series/3400 Series Chipset Thermal Subsystem (rev 05)
01:00.0 VGA compatible controller: nVidia Corporation GT218 [NVS 3100M] (rev a2)
01:00.1 Audio device: nVidia Corporation High Definition Audio Controller (rev a1)
03:00.0 Network controller: Broadcom Corporation BCM4313 802.11b/g LP-PHY (rev 01)
04:00.0 SD Host controller: Ricoh Co Ltd Device e822 (rev 03)
04:00.4 FireWire (IEEE 1394): Ricoh Co Ltd Device e832 (rev 03)
3f:00.0 Host bridge: Intel Corporation Core Processor QuickPath Architecture Generic Non-core Registers (rev 02)
3f:00.1 Host bridge: Intel Corporation Core Processor QuickPath Architecture System Address Decoder (rev 02)
3f:02.0 Host bridge: Intel Corporation Core Processor QPI Link 0 (rev 02)
3f:02.1 Host bridge: Intel Corporation Core Processor QPI Physical 0 (rev 02)
3f:02.2 Host bridge: Intel Corporation Core Processor Reserved (rev 02)
3f:02.3 Host bridge: Intel Corporation Core Processor Reserved (rev 02)

2 . 编译源码

注意:yum install broadcom-wl 不能用,Fedora 14 可以的

到官方下载驱动包,但是那个包编译不了,(这里可以下载 我改过的代码 )

KBUILD_NOPEDANTIC=1 make -C /lib/modules/`uname -r`/build M=`pwd`
make[1]: Entering directory `/usr/src/kernels/2.6.38.2-9.fc15.x86_64'
  CC [M]  /root/broadcom_bcm4313/src/wl/sys/wl_linux.o
/root/broadcom_bcm4313/src/wl/sys/wl_linux.c: In function ‘wl_attach’:
/root/broadcom_bcm4313/src/wl/sys/wl_linux.c:485:3: error: implicit declaration of function ‘init_MUTEX’ [-Werror=implicit-function-declaration]
cc1: some warnings being treated as errors

make[2]: *** [/root/broadcom_bcm4313/src/wl/sys/wl_linux.o] Error 1
make[1]: *** [_module_/root/broadcom_bcm4313] Error 2
make[1]: Leaving directory `/usr/src/kernels/2.6.38.2-9.fc15.x86_64'

需要在wl_linux.h 186 行加上

#define init_MUTEX(LOCKNAME) sema_init(LOCKNAME,1);

3. 编译好的 wl.ko 复制到

/lib/module/xxxxx/extra/wl/wl.ko

[root@Neil-PC wl]# pwd
/lib/modules/2.6.38.2-9.fc15.x86_64/extra/wl
[root@Neil-PC wl]# ll
total 3964
-rw-r--r-- 1 root root 4058778 Apr 15 08:32 wl.ko

4. 插入模块

检测并自动插入,成功的话直接返回,无错误

#modproble wl

5. reboot 就可以使用了