SDB:Ndiswrapper
目录
为什么需要(和为什么不需要) NDISwrapper
有些厂家没有发布硬件规范或为它们的无线网卡提供 Linux 驱动。NDISwrapper 项目在 Linux 内核内部实现了 Windows 内核 API 和 NDIS(网络驱动接口标准)API。无线网卡的 Windows 驱动稍后链接至此实现,这样驱动即可像在 Windows 上一样原生运行而无需二进制仿真。
然而请注意您应在可行时尽量使用内核提供的原生无线驱动(如 b43、ath9k,等)。NDISwrapper 的工作原理是将 Windows 驱动桥接进内核空间; 对于内核开发者来说这是对内核的 GPL 协议的一种违反。还有,NDISwrapper 不能使用标准内核功能,诸如 4K 堆栈,并且将用户暴露给了用户无法修改或修复的内核空间二进制驱动。还有,没有 Windows 驱动的话 NDISwrapper 完全不能工作,前者是一不可分发、二非开源的。另外,由于 NDISwrapper 是绑定到内核的,Windows 无线驱动的故障有可能导致内核崩溃,即使同样的故障在 Windows 下不会有太大问题。所以也要考虑稳定性问题。一个更进一步的问题就是如果您遇到了一个会导致 OOPS 的内核故障,多数内核开发者都会要求您不加载任何非 GPL 驱动来重现问题,以免污染内核。
比 NDISWrapper 更好的解决方案
用到 NDISWrapper 的时候几乎就等于是最后一搏了。若您的 wifi 网卡没有自由软件兼容 Linux 驱动(和固件)请考虑买一张新的。请注意多数卖 Linux 兼容网卡的地方都不提供 Linux 支持并且芯片也可能不是自由软件兼容的。
这意味着自由软件社区无法对这些网卡提供支持,您只能期待芯片厂家发善心提供支持。当该网卡不再生产时,您可能会发现您的网卡不再能用,或者根本在您所选的发行版下没法用。
您可以在一些地方买到清楚地标明芯片或自由软件支持情况的网卡。目前唯一清楚标明自由软件兼容网卡的购买来源是 ThinkPenguin.com。
另外还可以基于芯片查找自由软件兼容网卡。这稍微困难一点,通常用户会发现挑战性很大,因为有时网上找到的可用列表中标明的型号买到手却发现不是那种说好的芯片。这是由于厂家变更了芯片而没有变更型号造成的。
撷取 NDISwrapper
从 openSUSE 镜像
Ndiswrapper 囊括在您的 openSUSE 安装 CD/DVD 中。使用 YaST 软件管理工具来安装以下软件包:
- ndiswrapper
- ndiswrapper-kmp-[default|smp|xen]
- wireless-tools
选择适合您架构的内核模块包 (kmp)。以下命令可找出您正在使用的内核:
uname -r
从 driver:wireless 源
您可以从 driver:wireless 源获取最新版本的 NDISwrapper。
- 首先,检查您当前正在使用的内核版本:
uname -r
- 然后获取 root 权限
su
- 根据您的 openSUSE 版本,您必须添加正确的软件源:
kernel 3.4.6-2.10 i586/x86_64 GNU/Linux (openSUSE 12.2)
zypper ar http://download.opensuse.org/repositories/driver:/wireless/openSUSE_12.2 ndiswrapper
kernel 3.7.10-1.1 i586/x86_64 GNU/Linux (openSUSE 12.3)
zypper ar http://download.opensuse.org/repositories/driver:/wireless/openSUSE_12.3 ndiswrapper
kernel 3.10.5-20.g4e0ffc2 i586/x86_64 GNU/Linux (openSUSE Tumbleweed)
zypper ar http://download.opensuse.org/repositories/driver:/wireless/openSUSE_Tumbleweed ndiswrapper
- 在您添加完软件源后,您可以基于您所有的内核来运行命令安装 NDISwrapper:
若您使用 "desktop" 内核:
zypper in ndiswrapper ndiswrapper-kmp-desktop
若您使用 "default" 内核:
zypper in ndiswrapper ndiswrapper-kmp-default
若您使用 "pae" 内核:
zypper in ndiswrapper ndiswrapper-kmp-pae
若您使用 "xen" 内核:
zypper in ndiswrapper ndiswrapper-kmp-xen
- 安装完成后,您可以运行下面命令移除刚才添加的软件源:
zypper rr ndiswrapper
从源代码
您也可以直接从 ndiswrapper 官方网站下载并编译最新版本。
获取 Windows 驱动
您或许可以去ndiswrapper 兼容性列表查找您的特定硬件来确定您需要的驱动。
从您的 Windows 分区
若您有双系统且网卡在 Windows 下可以正常工作,这样您就可以去 Windows 分区来找驱动。[请记住若您的 Windows 安装是 32 位的,您的驱动也会是 32 位,若您的 Windows 安装是 64 位的,您的驱动也会是 64 位的。]
在 Windows 下,去设备管理器并在「网络适配器」下找到您的无线网卡。右键点击它并去「属性」-「驱动」-「驱动细节...」。在此您可以找到指向一个 .sys 文件的路径,通常位于 C:\windows\system32\drivers\ 文件夹中。
现在您可以使用 Windows 「搜索」功能来找到相应的 .inf 文件,它只是一个普通文本文件(可以打开一个来看看),列出了全部需要的驱动文件。所以在 Windows 下的搜索查询将是:
文件名或部分文件名: | *.inf |
文件中的单词或短语: | <上面找到的 .sys 路径> |
查找范围: | 本地硬盘驱动器 (C:) |
搜索可能要等一会儿!在您找到它后,使用文本编辑器查看 .inf 文件并看看您是否需要更多的文件。若您比较幸运的话,全部文件都会在同一个文件夹中(例如 C:\Program Files\Atheros\Drivers\)。将它们都复制到一个地方(例如 /home/myuser)或复制到 U 盘,总之是能被您的 Linux 访问到的地方。
从驱动安装程序获取
您可以在以下几个位置找到适合您的驱动,以偏好度排序:
- 您个人电脑或网卡厂家的支持网站的「下载」页面
- 随硬件分发的安装 CD
- 通过 Google 搜索适合您的 .sys 文件(高级,如果你没有做过前面,你也不知道 .sys 文件的名字)
如果百年不遇的话,您可能会非常简单地找到合适的 .inf 和 .sys 以及它们的关联文件。(虽然多数情况下都会走大背运)
多数时候,您需要从包含您的驱动的 .exe 或 .cab 文件中自行提取驱动。下面教大家怎么做,以 Netgear WNA3100 (BCM23231)为例。
提取驱动是一项瞎猫碰死耗子的工作。因为 Windows 下的 .exe 和 .cab 都有两种格式:正常的、和由 InstallShield 制作的,它们的后缀都是一样的。
去 http://downloadcenter.netgear.com/en/ 搜索 WNA3100 下载 Windows 驱动(WNA3100_V2.1.0.4.zip 108MB)
创建驱动文件夹,复制并解压:
mkdir ~/bcm43231 mv ./WNA3100_V2.1.0.4.zip ~/bcm43231 unzip WNA3100_V2.1.0.4.zip
我们只要驱动,Genie Setup 那个是 Windows 的网卡设置程序,不需要
cd WNA3100_DriverOnly_2.1.0.1_signed
现在我们直面的是一个 Setup.exe 驱动,先来使用 cabextract(命令行程序)尝试下它是不是一个自解压 Cab。
安装 cabextract
sudo zypper in cabextract
尝试解压
cabextract Setup.exe
如果遇到:
Setup.exe: no valid cabinets found
那就证明这个 .exe 不是自解压 Cab 而是 InstallShield 制作的 .exe 安装文件。Linux 下没有能解压它的程序,所以我们使用 Windows 下的开源程序 Universal Extractor 来解压:您可以用虚拟机或直接运行 Windows,也可以使用 wine,我们来使用 wine:
sudo zypper in wine wine ./UniExtract.exe
于是通过 Universal Extractor 我们解压出了一个 Disk1 文件夹。里面并没有驱动,而是有 data1.cab 和 data2.cab 两个 Cab 文件。
尝试解压
cabextract data1.cab
如果遇到
WARNING; found InstallShield header. This is probably an InstallShield file. Use UNSHIELD from www.synce.org to unpack it.
这就证明它依然是一个 InstallShield 创建的 Cab 而不是正常的 Windows 自解压 Cab。它建议我们使用 unishield 解压:
sudo zypper in unishield mkdir data1 unishield -d ./data1 x data1.cab mkdir data2 unishield -d ./data2 x data2.cab
于是 data1 和 data2 中就被填充满了内容,我们找一下是否有 .inf
find ./data1 -name "*.inf" ./data1/Win8_x86/bcmwlhigh6.inf ./data1/Win8_x64/bcmwlhigh6.inf
恭喜。将那两个文件夹 Win8_x86 和 Win8_x64 复制出来即可。
针对多个 .inf 文件
若有两个或更多的 .inf 文件的话,不要慌,每个文件都是适用于一个特定版本 Windows 的。例如原作者的驱动盘里就有两个:
bcmwl5a.inf bcmwl5.inf
第一个是用于 win98 的,第二个适用于 win2k/Me/XP 的。对原作者来说,98 的可用而 XP 的不行。总之慢慢试。
安装驱动
- 打开一个控制台窗口并获取 root 权限:(若您不知道这是什么,su 命令的意思是「替换用户」,可以替换成根用户 root。它将询问您的 root 密码)
su
- 现在输入:
ndiswrapper -i /path/to/drivers/bcmwl5a.inf
请确保使用了到您 .inf 文件的真实路径。
cd '/home/where the/inf file is'
并且之后您可以只用 .inf 文件名即可安装驱动:
- 若上面的没出问题,输入:
ndiswrapper -l
- 若您安装了一个有效/兼容的 Windows 驱动,ndiswrapper 将显示像这样的消息:
<驱动名称> : driver installed device (xxxx:xxxx) present (alternate driver: <Linux 原生驱动名称>)
<驱动名称>是 ndiswrapper 安装的 Windows 驱动的名称,<Linux 原生驱动名称>是被覆盖的 Linux 原生驱动的名称。
- 若 ndiswrapper 告诉你说「无效驱动」那样您需要卸载那个驱动并安装针对其它 Windows 版本的驱动。
- 要卸载驱动,您需要输入:
ndiswrapper -r <要卸载的驱动名称>
- 可以去下面文件夹中额外地检查一下
/etc/ndiswrapper
看是否存在有已安装驱动名称的同名文件夹。
USB 无线网卡
若您使用的是 USB 无线网卡,您需要做额外的一步来正确安装驱动。您需要使用 -d 选项为 NDISwrapper 提供您的无线网卡的 VendorID 和 ProductID。可以在 YaST 硬件信息模块的 USB 分类下找到这些 ID,或者您也可以运行:
lsusb
其中您应该能够看到两个四位字符/数字如 168c 和 0013。
要将 USBID 链接到驱动,您需要输入:
ndiswrapper -d xxxx:xxxx <驱动名称>
使用命令:
dmesg | tail
检查驱动是否成功加载/连上了。
若它可以工作,您需要在 modules.conf 中为 ndiswrapper 写入别名:
ndiswrapper -m
加载 NDISwrapper
modprobe ndiswrapper
之后您就可以使用 YaST 配置它了。
使用 YaST 配置您的网卡
若您遇到了 KDE Networkmanagement 组件检测不到您的无线网卡的问题,您或许需要额外的步骤来配置网卡。
可行的配置有很多种,这里只是一个典型的示例:
DHCP
- 启动 YaST 网络设置:「网络设备」-「网络设置」
- 前往「概览」选项卡
- 选择底部的「添加」按钮
- 选择
- 设备类型:「无线」
- 配置名称:随便
- 模块名称:「ndiswrapper」
- 选项:留空
- 不要选择「PCMCIA」或「USB」
- Ethtool 选项:留空
- 下一步
- 在「地址」选项卡中选择「动态地址」-「DHCP」,下一步
- 「无线网卡配置」这个窗口保留默认配置
- 操作模式:「受管」
- 网络名称 (ESSID) 留空
- 认证方式:「WEP - 开放式」
- 输入类型:「密码」
- 加密密钥:留空
- 下一步
- 或许会打开 KDE 钱包 -- 输入您的密码并忽略钱包的这次开启(它不会做任何事)
- 忽略「不使用任何加密存在安全风险」警告
- 回到「网卡设置概览」并下一步
您的网卡就配置好了。
您现在可以在系统托盘中打开 NetworkManager 挂件并选择找到的网络了。若同时也连接着有线,请禁用它,并上网冲浪吧。
若您的 SSID(无线网络名称)没有广播,您可以在 NetworkManager 中选择「隐藏网络」并自行指定一个。
或有冲突和问题
连接问题
一旦您搞定了 ndiswrapper,您将能够看到网卡随着无线网卡指示灯亮起而启动,例如,在引导时或在执行 sudo systemctl restart NetworkManager.service
后。
您将能够通过 KDE 网络管理组件看到可用网络,或者通过执行命令(以 root 执行):
sudo iwlist wlan0 scan
您可能需要将 wlan0 变更为您的无线接口。
之后您可以查找您想要连接的网络并尝试连接。然而,依然有一些陷阱是您需要规避的...
openSUSE 11.1 的版本资讯上说,无线频段 12-14(含首尾)是没有开箱即用式的支持的。
请确保您的路由器没有使用这些频段,除非您已经像上面 URL 中描述的那样手工启用了这些频段。
原作者也发现他的 Netgear DG834PN 和 BeThere 产汤姆森 Speedtouch 的 1、2、3 频段有问题。使用 WPA-PSK 几乎是无法连接的,但没有加密又不可靠。信号强度持续衰弱,会习惯性的落回 11Kbps。
原作者推荐禁用全部安全功能。将笔记本放到路由器的旁边并检查报告的信号强度。有问题的频道的强度会低于 100%。例如,原作者的笔记本,在频段 1 下的信号强度只有 70%,即使笔记本和路由器只有一毫米那么近。
一旦您找到了一个 100% 信号强度的频段,您就可以尝试连接了。一旦不设安全的时候连接没什么问题,您就可以启用安全了,例如 WPA-PSK 加密。
NDISwrapper 未加载
您可以运行以下命令检查 NDISwrapper 内核模块是否加载:
lsmod | grep ndiswrapper
若命令没有返回,您需要加载 NDISwrapper。
运行
sudo modprobe ndiswrapper
在 modprobe 运行完毕后,若您已经在 YaST 中 配置好了您的网卡,您可以运行
sudo systemctl restart NetworkManager.service
来重启您的网络管理器,您的网卡应该就被正确激活了。
引导时加载 NDISwrapper
一个可行方法是编辑 /etc/init.d/network 文件,在真实的网络配置脚本前添加一行 modprobe ndiswrapper
这样,脚本运行前就会先行加载 ndiswrapper。注意,若您使用 YaST 配置了您的无线接口并在「模块名称」字段输入了「ndiswrapper」,这是不需要的,因为这样 ndiswrapper 内核模块会在引导时自动加载。
另一种方法是编辑 /etc/sysconfig/kernel 配置文件,添加 ndiswrapper
到 MODULES_LOADED_ON_BOOT
部分(例如:MODULES_LOADED_ON_BOOT="ndiswrapper"
)。
在某些情况下(USB 网卡?)使用 YaST 配置无线接口不会自动加载 ndiswrapper 模块。要让您的无线网卡在引导式能够工作,您需要编辑 /etc/init.d/network(见上)。
与 NetworkManager 冲突
若您无法使用 NetworkManager 连接到无线网络,您或许还能够通过 YaST 使用 ifup 来配置(IP 地址、加密、认证,等)并连接无线。
特殊硬件
Atheros
若您使用 Atheros 网卡,推荐您先尝试 madwifi。若您无法用 madwifi 激活您的网卡,NDISwrapper 可能不会让您失望,虽然您可能会遭遇到一些小问题。更多信息请参考 Atheros madwifi。
对于 AR5005G(常用于笔记本),您需要更新的 Windows 驱动。若您可以访问 Windows 分区,您可以从 C:\Program Files\Atheros\Driver 复制驱动。
您也可以尝试从 Windows 驱动 CD 中提取它或者到此下载 32 位 Atheros NDIS 驱动(这是当您没有其它办法获取驱动时死马当活马医的), 若您使用的是 64 位的 openSUSE(x86_64),您需要针对 64 位 Windows 的驱动。