使用 NDISwrapper 实现无线连接

作者:Federico Kereki

在 Linux 上使用无线连接仍然是一件碰运气的事情,您必须承认,如果您想获得连接的机会,可能不得不选择非开源软件方向。这个领域正在进行大量的开发,但让我们面对现实吧,至少在目前,让无线设备使用原生开源驱动程序工作并不是您可以指望的事情。

造成这种状况的原因是什么?就像显卡一样,有很多因素。供应商非常有兴趣提供更新的设备,但他们中的大多数人并不关心 Linux,并且持有仅限 Windows 的思维模式。此外,如果您购买笔记本电脑,您甚至可能没有选择网卡的选项,因此您必须使用任何分配给您的东西。最后,当制造商不发布其产品的规格、API 等时,开发人员无法生成所需的软件,而这些文档几乎永远不可用。

因此,除非您非常幸运并且碰巧拥有少数几个开源支持的选项之一,否则 NDISwrapper 可能是您的最佳选择;但是,它并不是万无一失的灵丹妙药。NDISwrapper 尝试在 Windows 驱动程序周围提供一个包装器,以便 Linux 可以像使用本机驱动程序一样使用它们。如果您幸运的话(好吧,不算太幸运,因为许多驱动程序似乎都可以工作),您的 Linux 机器会认为它拥有非常好的驱动程序并将使用它们。

虽然该程序本身是开源的,但这种使用专有驱动程序的行为是令人反感的(甚至可能不是 100% 合法的?),并且显然无法保证。此外,它仍然有点碰运气,文档不完善,并且方法有些晦涩难懂。这里没有花哨的图形界面,只有老式的命令行操作,有很多犯错的可能性。考虑到所有这些,许多人成为 NDISwrapper 的有良知反对者或最终无法使其工作也就不足为奇了。

希望在不久的将来,这将不再是一个问题,我们将为大多数(如果不是全部)无线网卡提供完全开源的软件。当然,对于少数精选的网卡,此类驱动程序是存在的。与此同时,我们不得不凑合使用这种权宜之计——即使 NDISwrapper 很出色,但我们不得不依赖这样的程序也很遗憾——并等待更好的时代。

我最近得到了一台有点旧的 eMachines M5305 笔记本电脑,由于我必须在仅限无线的办公室工作,因此我别无选择,只能让无线网络工作起来。在本文中,我将解释如何安装两种不同的网卡(USB 和 PCI)并使它们通过 NDISwrapper 工作。我不会赘述我尝试过的许多其他替代方案(这些方案让我一无所获),而将重点放在 NDISwrapper 解决方案上。纯粹从实用角度出发,我需要我的机器工作——无论是否是开源软件。

什么是 NDISwrapper?

NDISwrapper 代表网络驱动程序接口规范包装器。包装器是一个技术名称,用于描述一种软件,粗略地说,它可以让您以某种不同的方式使用某些东西。在 Linux 下使用 Windows 驱动程序当然符合“以某种不同的方式使用某些东西”的条件。

您可以在大多数现代发行版中找到 NDISwrapper。可以使用提供的存储库,或访问 NDISwrapper 站点(请参阅“资源”),下载源文件并自行安装。事实上,即使我使用 OpenSUSE 10.2 并且 NDISwrapper 很容易获得,我还是选择自己走这条路,以便获得最新的版本。在撰写本文时,当前的稳定版本为 1.47,并且正在开发 1.48RC2 候选版本,但我决定使用前者。

如果您的系统上已经安装了 NDISwrapper 的版本,最好先卸载它(使用发行版中的工具——我使用了 YaST),然后,以普通用户的身份,转到您下载文件的位置,并执行以下操作

tar zxvf ndiswrapper-1.47
cd ndiswrapper-1.47
make distclean
make

最后,以 root 用户身份,键入make install.

第一个实验:USB 方法

我去附近的一家电脑商店,找到了一款便宜又不错的 USB 无线适配器,Allied Telesyn 的 AT-WCU201G 型号,它支持高达 108Mbps 的速度,并且兼容 IEEE 802.11、802.11b 和 802.11g。当然,如今 54Mbps 的速度更为常见,因此拥有额外的速度储备资源是很不错的。

由于这是一个 USB 设备,您可以使用 lsusb 命令来获取设备 ID。将设备插入任何 USB 插槽,然后执行

lsusb
Bus 003 Device 002: ID 3242:4001
Bus 003 Device 001: ID 0000:0000
Bus 002 Device 001: ID 0000:0000
Bus 001 Device 001: ID 0000:0000

很明显,我们设备的 ID 是 3242:4001。如果您想要更多关于设备的信息(有很多信息),请尝试lsusb -d 3242:4001 -v,您可以验证制造商、产品代码、序列号等等。很有可能其他人已经尝试过让该设备工作,因此我在网上 Google 了一下,看看是否有任何帮助或已知的良好 Linux 驱动程序。我没有找到任何有用的参考资料,但我还是继续前进——您期望这么容易放弃吗?

如果您正在跟随本文进行操作,您将需要一个 Windows XP 驱动程序,包括 .inf 和 .sys 文件。幸运的是,我选择的产品附带了一张包含几个适用驱动程序的 CD,只需将其复制到磁盘即可。请注意,并非所有 Windows 驱动程序都能工作或稳定。有时您可能会发现您需要尝试其他驱动程序才能使您的网卡工作。此外,供应商可能已将所需文件包含在 EXE 文件(尝试解压缩它,看看您是否获得了所需的文件)或 CAB 文件中。

在我的特定情况下,这很简单——只需复制一些文件(atiwu.inf 和 atiwu.sys),然后键入ndiswrapper -i atiwu.inf,然后是ndiswrapper -m,再然后是ndiswrapper -l列出所有驱动程序。我得到了

atiwu : driver installed
        device (3242:4001) present

这表明设备已被识别并且驱动程序已安装。现在,是时候让 Linux 更多地了解新设备了。因为我使用 OpenSUSE,所以我打开 YaST 并转到“网络设备”→“网卡”→“添加”,然后选择了以下内容

  • 设备类型:无线。

  • 配置名称:0(以便设备将被称为 wlan0)。

  • 硬件配置名称:static-2(随便什么)。

  • 模块名称:ndiswrapper(最重要)。

不要选择 PCMCIA 或 BUS。然后,浏览后续屏幕(选择 DHCP 或 IP,指定您的 DNS 服务器等等),直到您进入“无线设备设置”表单。在那里,您可能必须设置以下内容

  • 运行模式:管理模式(ad hoc 模式适用于点对点网络)。

  • 网络名称:Guiamovil(我想连接的网络名称)。

  • 认证模式:WPA-PSK(开放模式适用于不受限制、未受保护、无密码的网络)。

  • 密钥输入类型和加密密钥:无论网络管理员告诉您使用什么。(当然,对于“开放”网络,您不需要这个。)

但是,如果您不知道您将连接到哪个网络,则可以忽略所有这些更改。只需退出程序,保存所有更改,您将拥有可用的设备 wlan0。我们快成功了!

如何连接?

如果您走到这一步,您可以使用无线工具,其中包括 iwconfig 和 iwlist,来配置您的设备并搜索可用网络。(当然,有很多类似的工具,有些甚至具有图形界面;如果您愿意,可以四处看看。)在我的情况下,我已经知道我想连接的网络,但在其他情况下(例如机场的 Wi-Fi 热点区域),您需要四处寻找一个。

您可以使用以下命令扫描网络iwlist wlan0,您将得到类似这样的结果

wlan0  Scan completed :
       Cell 01 - Address: 00:16:B6:DB:10:93
                 ESSID:"linksys"
                 Protocol:IEEE 802.11g
                 Mode:Managed
                 Frequency:2.437 GHz (Channel 6)
                 Quality:0/100 Signal level:-84 dBm Noise level:-256 dBm
                 Encryption key:off
                 Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 18 Mb/s
                          24 Mb/s; 36 Mb/s; 54 Mb/s; 6 Mb/s; 9 Mb/s
                          12 Mb/s; 48 Mb/s
                 Extra:bcn_int=100
                 Extra:atim=0
       Cell 02 - Address: 00:4F:67:00:C1:AA
                 ESSID:"Guiamovil"
                 Protocol:IEEE 802.11g
                 Mode:Managed
                 Frequency:2.437 GHz (Channel 6)
                 Quality:0/100 Signal level:-67 dBm Noise level:-256 dBm
                 Encryption key:on
                 Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
                           9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s; 36 Mb/s
                           48 Mb/s; 54 Mb/s
                 Extra:bcn_int=200
                 Extra:atim=0
                 IE: WPA Version 1
                     Group Cipher : WEP-40
                     Pairwise Ciphers (1) : WEP-40
                     Authentication Suites (1) : PSK

太棒了,我想要的连接在那里(第二个,Guiamovil),还有另一个开放的、未受保护的连接,名为 Linksys。(未更改的名称表明无线路由器是在没有任何特定配置的情况下安装的。)

如果您宁愿使用命令行,iwconfig 允许配置无线设备。尝试iwconfig --helpman iwconfig了解更多信息。例如,我可以键入以下内容,获得与 YaST 相同的结果

iwconfig wlan0 essid "Guiamovil" mode managed key 
"s:THESECRETPASSWORD" commit

现在,您只需 ping 任何站点即可检查设备的工作情况,或者连接到 Web 并上网冲浪。

第二个实验:PCMCIA 方法

我的一个朋友借给我一张 PCMCIA 卡,这样我就可以测试不同类型的设备。我首先想到删除 USB 驱动程序和设置,然后安装他的卡,但这有点逊色。无论如何,为了确保该卡工作正常,我尝试了一下,从

ndiswrapper -r atiwu
rm /etc/modprobe.d/ndiswrapper
cd /path.where.you.downloaded.ndiswrapper
make uninstall
make clear
make
make install

开始,回到原点。然后我将卡插入其插槽并使用了lspcilspci -v命令来了解更多关于它的信息。我在列表的底部找到了该卡,第二个命令生成了它的 ID (11ab:1faa)

$ lspci
00:00.0 Host bridge: ATI Technologies Inc AGP Bridge 
                     [IGP 320M] (rev 13)
00:01.0 PCI bridge: ATI Technologies Inc PCI Bridge 
                    [IGP 320M] (rev 01)
00:07.0 ISA bridge: ALi Corporation M1533/M1535 PCI to 
                    ISA Bridge [Aladdin IV/V/V+]
00:08.0 Multimedia audio controller: ALi Corporation M5451 
          PCI AC-Link Controller Audio Device (rev 02)
00:09.0 Modem: ALi Corporation M5457 AC'97 Modem Controller
00:0a.0 CardBus bridge: ENE Technology Inc CB1410 Cardbus Controller
00:0d.0 USB Controller: NEC Corporation USB (rev 43)
00:0d.1 USB Controller: NEC Corporation USB (rev 43)
00:0d.2 USB Controller: NEC Corporation USB 2.0 (rev 04)
00:0e.0 Ethernet controller: Broadcom Corporation BCM4401 
                             100Base-T (rev 01)
00:10.0 IDE interface: ALi Corporation M5229 IDE (rev c4)
00:11.0 Bridge: ALi Corporation M7101 Power 
                Management Controller [PMU]
01:05.0 VGA compatible controller: ATI Technologies Inc 
                                   Radeon Mobility U1
02:00.0 Ethernet controller: Marvell Technology Group Ltd. 
              88w8335 [Libertas] 802.11b/g Wireless (rev 03)
$ lspci -s 02:00.0 -v
02:00.0 Class 0200: 11ab:1faa (rev 03)

这一次,Google 搜索 11ab:1faa 很幸运。我找到了几个参考资料,说这张卡工作良好,所以我继续前进,并使用与 USB 卡相同的方法安装了它。它工作得很好——几乎是反高潮的。

现在,回到同时安装两个设备的最初想法。我什至不确定 NDISwrapper 是否可以同时处理两个驱动程序,当我在网上搜索时,我一无所获。继续前进,我决定做一些实验。事实证明,/etc/modprobe.d/ndiswrapper 文件读取

alias wlan0 ndiswrapper

所以,我添加了一个alias wlan1 ndiswrapper行到其中,只是想看看它是否会产生任何影响。我回到了开头(卸载了所有内容),重新启动(以防万一),然后重新开始。设置完两个设备后,我尝试了iwconfig并高兴地看到两个接口都被识别了。我可以移除其中任何一个,另一个仍然可以正常工作。我注意到 Allied Telesyn USB 设备比 Netgear 卡更灵敏——它可以找到更多远程网络——但我猜这是合理的,因为前者更新,并且可以预期更强大。

结论

即使无线设备仍然是 Linux 的一个弱点,但如果您不固执于专有二进制驱动程序或在 Linux 机器上使用 Windows 软件,则使用 NDISwrapper 提供了一个很好的解决方案。我更喜欢 OSS 解决方案,但我不能等待它。当然,没有保证,但我的实验让我相信,让无线网络工作应该是一件容易的工作,并且我能够同时使两个不同的设备工作,这证明了 NDISwrapper 的质量。

Federico Kereki 是一位乌拉圭系统工程师,拥有 20 多年的大学教学、开发和咨询工作经验,以及撰写文章和课程材料的经验。他使用 Linux 已经很多年了,并在多家不同的公司安装了 Linux。他对 Linux 机器更好的安全性和性能特别感兴趣。

加载 Disqus 评论