Ubuntu下用NdisWrapper安装网卡驱动
下面是一个简单全面的使用NdisWrapper的指南.这是从Beginning Ubuntu Linux, Second Edition中提炼出来的.
这份指南是第8章的一部分.该章给出了在Ubuntu下配置硬件(包括网络设备,打印机,扫描仪,3D显卡等等)的详细说明.
除了详细介绍怎样安装/删除NdisWrapper驱动,这份3500多字的指南还包括了精确匹配正确的硬件驱动,从Windows驱动文件中提取必要的文件等关键步骤.这些步骤在其他的指南中往往被忽视了,但它们往往是许多用户难以逾越的障碍.
这份指南主要是针对Ubuntu Edgy Eft (6.10)的用户的.当然,在其他的Ubuntu版本中,包括Feisty Fawn (7.04),也同样好用.实际上,这份指南应该可以用在大部分其他的发行版中(我最近一本书中, Beginning SUSE Linux, Second Edition, 有一个修改过的版本)
使用NdisWrapper
NdisWrapper实际上是一个开源的驱动(从技
术上讲,是内核的一个模块),它能够让Linux使用标准的Windows
XP下的无线网络驱动.你可以认为NdisWrapper是Linux内核和Windows驱动之间的一个翻译层.Windows驱动可以通过
NdisWrapper的配置工具进行安装.
有下面两种情况之一时,使用NdisWrapper:
- 你的无线网络硬件没有被Ubuntu识别出来.也就是说,在网络环境设置对话框中的网络设备列表里没有发现你的无线网络硬件.
- 你的无线网络硬件被Ubuntu识别出来了,但是当你配置它的时候,它不能正常工作.比如,它不能连接到无线基站.如果发生这种情况,除了要安装NdisWrapper,你还要进行另外的一步来把现在的Ubuntu驱动放入黑名单.这个后面再讲.
使
用NdisWrapper比较简单,仅仅需要几个命令.然而,得到必须的Windows驱动则是较难的工作,因为,不幸的是,NdisWrapper不能
和通常的驱动发布格式.exe一起工作.相反,NdisWrapper需要由特定的.inf和.sys文件(Windows系统文件)组成的驱动.很多时
候,这些文件包含在.exe文件中,必须手工提取出来.
注意 当然,有时候有的驱动是以.zip的格式发布的,这样这些相关的文件就很容易得到了.祈祷吧,让这种情况发生在你硬件上.
NdisWrapper还远不是完美的.并不是所有的无线驱动都能和它一起工作,在Windows下能工作的驱动,在Linux下则不一定能好
用.有时候,试验和错误是不可避免的.恼人的是,有时候Windows驱动好像是工作了,但是是不可靠的.有的甚至会搞垮你的系统.最好的方案就是试一
试.
技巧 NdisWrapper随着版本的更新在不断进步.这就是为什么要规律的更新你的系统.在Beginning Ubuntu Linux, Second Edition的第9章,我给出这样做的全部细节.
我将要讲解怎样使Asus 802.11g (Asus A6R 笔记本)在Ubuntu下利用NdisWrapper来工作.这些指令本质上来说对所有类型的无线网络设备都一样.然而,一些特别的细节,比如(驱动)下载地址,就会不一样了.
首先,我会解释一下怎样安装NdisWrapper.
接着,我会讲怎样找到你需要的Windows驱动.然后,我会讲怎样从驱动文件中提取必要的文件.最后,是怎样在Ubuntu下安装Window驱动.你
可能还需要把你的现有的Linux驱动放入黑名单,这个我也会讲的.
这些步骤仅仅是让你在Ubuntu下可以得到你的无线网络设备.一旦完成,你应该就可以用标准的网络配置工具来连到你的路由器或基站上了.这在Beginning Ubuntu Linux, Second Edition的第8章有详细的说明.
安装NdisWrapper配置工具(NdisWrapper Configuration Tools)
NdisWrapper包含两个部分:内核模块和配置工具.内核模块是默认内核的一部分,所以默认是安装了的.因此,你所需要做的就是安装配置工具.打开
Synaptic包管理工具,搜索并安装ndiswrapper-utils-1.8.
你会被告知ndiswrapper-common也需要被安装.这样就行了.
注意如果你在使用Edgy Eft (6.10),请确保你选择了ndiswrapper-utils-1.8,而不是别的版本.
安装Windows XP驱动
安装好NdisWrapper配置工具之后,你就可以安装Windows XP的无线网络设备驱动了.这个过程包括3个部分:
- 确定你的无线网络设备,然后找到合适的Windows驱动.
- 从驱动文件中(有可能是.bin格式,尽管这种情况较少)提取必要的.sys和.inf文件
- 利用NdisWrapper配置工具来安装Windows驱动,修改配置文件使得NdisWrapper模块在每次你重启的时候自动加载.
确定你的无线网络设备并找到找到合适的Windows驱动
要确定你的无线网络设备,你需要知道两件事情:你的硬件的make/model信息和PCI ID号.
前者是硬件的make/model信息,Ubuntu是根据系统探测的结果来确定的.Ubuntu发现的这些信息通常跟底层组件的制造商有关,而跟硬件的生成厂家无关.
PCI ID是两个4位的16进制数,它是你的计算机在内部用来识别设备的.Windows和Ubuntu使用相同的PCI ID编号系统.
执行下面的指令来得到你需要的信息:
- 你可以用设备管理工具来找到PCI ID和make/model信息.点击Start
System -> Administration -> Device Manager.(译者注: 也可以直接运行hal-device-manager).
- 你
现在要做的依赖于是否Ubuntu识别出了你的设备(也就是说,它出现在了你的网络设置里,但是不能正常工作).如果你的设备没有被识别出来,跳到下一
步.如果它被识别出来了,在硬件列表里找到那个叫做WLAN
Interface的一行.在这一行的上边一行,你就可以看到这个硬件的make/model信息.记下来.在我测试用的笔记本上,这一行上写着
BCM4318 [AirForce One 54g] 802.11g Wireless Lan
Controller.这个信息通常跟无线网络设备文档中列出的信息是不一样的.(笔记本的手册上列出的仅仅是ASUS 802.11g
device). 选择WLAN Interface那一行, 并点击在设备管理程序窗口右边的Advanced项.
接着查看以net.physical_device开头的一行. 看这行的末尾,
记录下以pci开头,以下划线分隔开来的两组字母和数字串.在我的笔记本上, 它们分别是14e4和4318.看下面的图, 相关的区域已经被标出来了.
- 如果Ubuntu并没有识别出你的无线设备(也就是说,它没有出现在网络设置对话框里).在设备管理列表中查找标有
802.11, WLAN,
或可能仅仅是"wireless"的一行.这一行里会有你需要的make/model信息.点击在设备管理程序窗口右边的Advanced项.查看
info.udi叫做的一行.看这行的末尾,记录下以pci开头,以下划线分隔开来的两组字母和数字串.参看下面的图示.
注意 这两组字母和数字串实际上是16进制数字.关于16进制数的更多信息,请参看 http://en.wikipedia.org/wiki/Hexadecimal.
- 把你从第二步或第三步记下来的两组数字写在一起就是PCI
ID号码.写在一起时,在它们中间加一个冒号.就我的而言,我的无线网络设备的PCI
ID号码是14e4:4318.如果这两组数字中,任一个少于4个字符,则在它前面加0来变成4个字符.例如,在我的桌面电脑上,从
net.physical_device得到的是1814_201.我在201前加了一个0,使得完整的PCI ID号码变成1814:0201.
在我测试的另外一台机器上,从net.physical_device得到的是168c_13.因此,在13前加2个0.PCI
ID号码变成168c:0013.
- 从另外一台可以上网的计算机上,访问http://ndiswrapper.sourceforge.net/m...index.php/List.这个是NdisWrapper支持的无线网络设备列表.
- 利用你的浏览器的搜索功能(Firefox中使用Ctrl+F),查找你前边得到的PCI ID号码(以第四步中的格式).例如,对我测试的笔记本来说,搜索14e4:4318.在这个列表中,查看下面几个东西(按重要性列出):
- PCI ID.
- 无线设备的制造商和model名字(正如上面的设备管理器中所得到);这将会被列到这一条的Card:项和/或Chipset:项.
- 笔记本的制造商和model名字.这将会被列到这一条的Card:项或Chipset:项或Other:项中.
在这个列表中,很有可能有很多项都能匹配你的PCI ID.这样的话,搜索跟你的硬件制造商和model最匹配的那一项.如果仍然还有很多匹配的项,搜索跟你的笔记本制造商和model最匹配的那一项.你可 能很不走运的发现没有跟你的笔记本制造商和model精确匹配的项.那么,就不得不找一个最像的了.利用你的常识和判断力.例如,你的笔记本是Asus生 产的,但是你没有找到能精确匹配的驱动,那么选择另外一个Asus的驱动.
注意 如果你没有用64位的Ubuntu,当心驱动文件的描述信息中是否提及x86_64.如果你没有选用64位Linux,你很可能用的是32位的.如果你找到的是x86_64的驱动,继续找直到找到32位的驱动.
- 在列表里这一项中查找那个连接到驱动文件的链接,下载Windows Xp的驱动.有时,这个链接没有给出时,制造商的站点会被提及,这样你可以访问该站点去下载相应的驱动.
提取驱动组件
下载了驱动之后,就需要提取和你的无线网络硬件相关的.sys和.inf文件了.这些就是NdisWrapper所需要的所有东西了,剩下的文件就可以丢弃了.但是,提取这些文件有时比较难,因为它们往往被包含在一个.exe文件里了.
注意 大多数的.exe格式的驱动文件实际上是自解压的文件.
另外,这个驱动文件可能含有硬件的多个不同模式下的多种驱动.找到那个和你的无线网络设备相关的特定驱动的.inf文件是很必要的:
- 如果你下载的是一个.zip驱动文件,那么你的工作就简单多了.
双击下载的.zip文件,在里面查找包含有真正驱动文件的目录.一般这个目录叫做"driver",或者有时它以驱动适用的操作系统命名,比如
Win_XP.如果你以前安装过Windows驱动,你会觉得很熟悉的.一旦你找到了相关的目录,点击并把.inf,.sys和.bin文件拖拽到一个独
立的目录(也有可能没有任何的.bin文件).你可以忽略任何其他的文件,比如.cab和.cat文件.然后,去第四步.
- 如果驱动是.exe格式的文件,我们必须从里面提取出相关的文件.幸运的话, 如果你是用Windows下载的文件的话你也许能够利用像WinZip(www.winzip.com)
这样的工具来做这件事.在WinZip里,用File -> Open菜单选项打开这个文件.你可能需要在File Type下拉列表中选择All
Files来使得.exe文件显示在文件列表中.然而,如果你在使用Windows,我推荐一个开源并且免费的程序Universal
Extractor,它可以从http://www.legroom.net/software/uniextract下载.这个程序几乎可以各种文件(包括大多数的驱动安装文件)中来提取文件.装上它之后,右键点击.exe驱动文件,然后选择UniExtract to
Subdir.这将会在.exe驱动文件相同的文件夹生成一个新的目录,里面包含安装文件的内容.
- 正如第一步提到的,你需要的驱动文件很有可能包含在叫做"Driver"或"Win_XP"的目录中.一旦你找到了这个相关的
目录,查找.inf,.sys和.bin文件(尽管你可能找不到任何.bin文件;它们只用在有些驱动中).点击并把这些文件拖拽到一个独立的目录.你可
以忽略任何其他的文件,比如.cab和.cat文件.
- 现在的工作就是为你的硬件找到相应的.inf文件.如果那儿只有一个.inf文件,那么你就可以进行下一步了.如果有多
个.inf文件,你就需要搜索每一个直到你找到你需要的.你需要查找对应于前面记下来的PCI
ID的文本.在一个文本编辑器中打开第一个.inf文件(在Windows中双击就可以了),然后用搜索功能来搜索PCI
ID的第一部分,这样能搜索的快一点.例如,我搜索的是14e4.
如果在这个文件里没有找到,那么就去下一个文件里继续找.如果你能够匹配到的话,它很有可能是出现在一句很长的文本行里,并且是在文本"VEN_"的右
边.接着,看看这行是否含有PCI
ID的第二部分,这部分很有可能出现在文本"DEV_"的右边.就我下载的驱动文件而言,在.inf中的这一整行的内容如下(PCI
ID的两部分已经被用粗体标出来了):
Code:%BCM430B_DeviceDesc% = BCM43XX, PCI\VEN_14E4&DEV_4318&SUBSYS_12F3103C
- 你现在就需要把这个.inf文件和.sys文件以及.bin文件(如果这个驱动里有任何的.bin文件的话)转移到你想安装驱动的计算机上.你可以通过把它们考到软盘上,或者烧制一个CD,再或者用一个USB优盘来干这件事.
把现有的驱动放入黑名单
下面这几步是否要做依赖于是否Ubuntu在你第一次启动的时候识别出了你的无线网络设备,但是又不能让它
正常工作.如果是这样的话,你就需要把内置的驱动放入黑名单,这样Ndiswrapper就可以和硬件联系起来了.如果设备没有被识别,你就可以直接跳
到"用Ndiswrapper来安装驱动"那一步了.
要把现有的驱动放入黑名单,你需要找到这个内核模块的名字,然后把它加入到/etc/modprobe.d/blacklist文件中.步骤如下:
- 打开设备管理器(System
-> Administration -> Device Manager, 译者注: 也可以运行hal-device-manager),然后在列表中选择对应于你的无线网络设备的那一项.点击含有你的网络硬件的make/model名字的那一项.
- 点击在设备管理程序窗口右边的Advanced项,查找以info.linux.driver开头的那一行.然后查看value那一列,并记录下那个值是什么.例如,在我测试的笔记本上,value那一列的值是bcm43xx.
- 关闭设备管理器,打开一个terminal窗口(Applications -> Accessories -> Terminal).键入以下命令来在Gedit中打开黑名单配置(blacklist configuration)文件:
Code:gksu gedit /etc/modprobe.d/blacklist - 在这个文件的最后面新加上下面一行:
Code:blacklist <modulename>
用你刚才找到的模块的名字来代替上面的<modulename>.例如,在我测试的系统里,我键入的内容如下(参见下图):
Code:blacklist bcm43xx
保存这个文件,然后重启你的计算机.你现在应该发现你的无线网络设备在你的网络设置(Network Settings)程序里不见了.非常好,因为这说明你的硬件现在没有相应的驱动了.现在,我们可以让Ndiswrapper来使用硬件了.
用Ndiswrapper来安装驱动
在那个你想安装驱动的Ubuntu计算机上,根据前面的步骤,你现在应该有了.inf文件和.sys文件,可能还有.bin文件,这些组成了硬件的驱动.假设这些文件被放在桌面(desktop)上一个名字为"driver"的目录里.
要用Ndiswrapper来安装驱动,使用下面的步骤:
- 打开一个terminal窗口(Applications -> Accessories -> Terminal).在这个窗口里,键入下面的命令来转到含有驱动文件的目录下:
Code:cd /home/<username>/Desktop/driver
- 键入下面的命令来安装驱动:
Code:sudo ndiswrapper –i filename.inf
- 然后,键入下面的命令:
Code:sudo ndiswrapper –m
gksu gedit /etc/modules
Code:ndiswrapper
- 保存该文件,关闭Gedit,然后重启你的计算机.
完成这些步骤后,你应该就能发现这个无线网络设备就可以进行配置了,比如连接一个无线基站,配置WEP/WPA.我在Beginning Ubuntu Linux, Second Edition的第8章解释了如何配置WEP和更新的WPA.
删除NdisWrapper驱动
正如前面提到的,尽管NdisWrapper可以解决一些无线网络设备驱动的问题,但是它并不是完美的.你可能会发现你安装的Windows驱动并不能工作.如果是这样的话,你可以下载一个不同版本的驱动,然后再试一下.但是,首先你需要卸载现有的驱动.
打开一个terminal窗口,然后键入下面的命令,这将使得NdisWrapper列出所有现在所安装的Windows驱动:
找到返回的一行的第一部分.在我测试的笔记本上,返回的这一行是:
这一行的第一部分是你需要删除的驱动的名字.要删除它,键入下面这行:
用驱动的名字来替代<drivername>.例如,我键入的命令如下:
现在,你可以重复前面的步骤来安装新的驱动了.