SDB:Ndiswrapper
为什么(以及为什么不)使用 NDISwrapper
一些供应商不发布硬件规范或为其无线网卡提供 Linux 驱动程序。NDISwrapper 项目在 Linux 内核中实现了 Windows 内核 API 和 NDIS(网络驱动程序接口规范)API。然后将 Windows 无线网卡驱动程序链接到此实现,以便驱动程序本机运行,就像在 Windows 中一样,而无需二进制仿真。
但是请注意,您应该尽可能使用内核提供的本机无线驱动程序(例如 b43、ath9k 等)。NDISwrapper 通过桥接 Windows 驱动程序到内核空间来工作;对于内核开发人员来说,这违反了内核的 GPL 许可。此外,NDISwrapper 不适用于标准内核功能,例如 4K 堆栈,并且将用户暴露于内核空间中的仅二进制驱动程序,用户无法修改或修复。此外,如果没有 Windows 驱动程序,NDISwrapper 根本无法工作,而 Windows 驱动程序 1) 不可重新分发,并且 2) 不是开源的。此外,由于 NDISwrapper 与内核相关联,Windows 无线驱动程序中的错误有导致内核崩溃的潜在风险,即使相同的错误在 Windows 中可能不会引起问题。因此,也需要考虑稳定性问题。另一个问题是,如果您遇到导致 oops 的内核错误,大多数内核开发人员会要求您在不加载任何非 GPL 驱动程序的情况下重现该问题,以避免内核被污染。
比 NDISWrapper 更好的解决方案
总而言之,NDISWrapper 是最后的解决方案。如果您的无线网卡没有免费软件兼容的 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 版本,您必须添加正确的仓库
内核 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
内核 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
内核 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 子树中)或复制到 Linux 系统可以访问的外部 USB 驱动器。
从驱动程序安装软件
有几个地方可以尝试找到您的驱动程序,以下是按首选顺序排列的列表
- 您的 PC 或网卡制造商支持网站上的“下载”页面/部分
- 随硬件附带的安装 CD
- 使用 Google 搜索您的 .sys 文件(高级,如果您还没有尝试前两种方法,您甚至不知道 .sys 文件的名称)
如果您最幸运,您将很容易找到正确的 .inf/.sys 和相关文件。(尽管大多数时候您运气非常不好)
大多数时候,您需要自己从 .exe 或 .cab 文件中提取驱动程序。以下将教您如何操作,示例来自 Netgear WNA3100 (BCM43231)。
提取驱动程序是一项琐碎的工作。因为在 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 安装程序。没有程序可以解压缩这种格式,因此我们需要使用 Windows 开源实用程序 Universal Extractor 来执行此操作:您可以在虚拟机下直接或间接运行 Windows,或者您可以使用 `wine`。我们在这里使用 wine
sudo zypper in wine wine ./UniExtract.exe
因此,使用 Universal Extractor,我们成功解压缩了一个 Disk1 目录。里面没有驱动程序,但有 data1.cab 和 data2.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。cabextract 建议我们使用 `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 复制到 Linux 可以读取的某个位置,就完成了!
处理多个 *.inf 文件
如果有两个或多个 .inf 文件,不要惊慌,每个文件对应于不同的 Windows 版本。我的驱动程序光盘有两个
bcmwl5a.inf and bcmwl5.inf
第一个是为 win98,第二个是为 Win2K、Me 和 XP。在我的例子中,win 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-name> : driver installed device (xxxx:xxxx) present (alternate driver: <native-driver-name>)
其中 <driver-name> 显示使用 ndiswrapper 安装的 Windows 驱动程序的名称,而 <native-driver-name> 是正在覆盖的 Linux 本机驱动程序的名称。
blacklist <native-driver>
其中 <native-driver> 是要列入黑名单的驱动程序的实际名称。
- 如果 ndiswrapper 显示“无效驱动程序”,则需要卸载该驱动程序并尝试另一个驱动程序。
- 要卸载驱动程序,您需要输入
ndiswrapper -r <then the name of the driver to uninstall>
- 另一个检查方法是查看
/etc/ndiswrapper
是否存在名为已安装驱动程序的目录。
USB WLAN 网卡
如果您有一个 USB WLAN 网卡,您需要执行额外的步骤才能正确安装驱动程序。您需要使用 -d 选项向 NDISwrapper 提供 USB WLAN 网卡的 VendorID 和 ProductID。在 YaST 硬件信息类别 USB 中查找这些 ID。或者,您也可以运行
lsusb
您应该能够获得两个四字符/数字,例如 168c 和 0013。
要将 USBID 链接到驱动程序,您需要输入
ndiswrapper -d xxxx:xxxx <then the name of the driver>
使用以下命令查看
dmesg | tail
以成功加载/连接驱动程序。
如果有效,您可以将 ndiswrapper 的别名写入 modules.conf 中,使用
ndiswrapper -m
使用以下命令加载 NDISwrapper
modprobe ndiswrapper
之后,您可以使用 Yast 进行配置
在 YaST 中配置您的网卡
如果您在使无线网卡被 (K)NetworkManager 检测时遇到问题,您可能需要额外的步骤来配置网络卡。
有很多可能的配置。这里只是一个典型的例子
屏幕截图演示
屏幕 1
屏幕 2
屏幕 3
DHCP
- 启动 YaST 的网络配置: 网络设备 → 网卡
- 转到“概述”选项卡
- 选择:下半部分的“添加”按钮
- 选择
- 设备类型:“无线”
- 配置名称:“0”(或任何其他名称:)
- 硬件配置名称:“static-0”
- 模块名称:“ndiswrapper”
- 选项:“”(保持为空)
- 不要选择“PCMCIA”或“USB”
- …最后“下一步”
- 在下一个屏幕上,在“主机名和名称服务器”中选择 DHCP,在“高级 → DHCP 选项”中,然后单击“下一步”
- 在“无线网络卡配置”窗口中选择(保持默认值)
- 操作模式:“管理”
- 网络名称 (ESSID):“”(保持为空)
- 身份验证模式:“开放”
- 输入类型:“密码短语”
- 加密密钥:“”(保持为空)
- …最后“下一步”
- kwallet 管理器可能会打开——提供您的密码并忽略此打开(它什么也不做)
- 忽略“加密有风险”的警告
- 回到“网卡配置概述”选择“下一步”
您的网卡已配置。
您现在可以打开任务栏(kicker)中的网络管理器并选择找到的网络之一。禁用您的有线连接(如果已连接),并访问互联网。
如果您的 SSID(无线网络名称)未广播,您可以在网络管理器中选择自己的特定名称。
潜在冲突和问题
连接问题
一旦 ndiswrapper 工作,您会看到无线网卡的 LED 在网络启动时亮起,例如在启动时或响应 rcnetwork restart 命令时
您可以通过 KDE 网络管理器或通过发出命令以 root 身份发出查看可用的网络
su -c 'iwlist wlan0 scan'
您可能需要更改 wlan0 以匹配您的无线接口
因此,您找到您喜欢的网络并尝试连接。但是,有一些陷阱需要避免…
openSUSE 11.1 的发行说明指出,默认情况下不支持通道 12-14(含)。默认情况下,WLAN 通道 12、13 和 14 被禁用,因为并非在所有地方都允许使用这些通道。如果您想在您的区域使用它们,请参阅 https://en.opensuse.net.cn/Tracking_down_wireless_problems 以获取更多信息。
因此,请确保您的路由器没有使用这些通道,除非您已手动启用它们,如上面的 URL 中所述。
我还发现我的 Netgear DG834PN 和来自 BeThere 的 Thompson Speedtouch 的通道 1、2 和 3 存在问题。我发现启用 WPA-PSK 时连接几乎不可能,禁用加密时也极不可靠。信号不断下降并习惯性地降至 11Kbps。
我建议您禁用所有安全设置。将笔记本电脑物理上放置在路由器旁边,并检查报告的信号强度。存在问题的通道的报告低于 100%。例如,我发现我的笔记本电脑在笔记本电脑和路由器相隔几毫米时,通道 1 仅报告 70%。
一旦您找到报告 100% 的通道,请尝试连接。只有在连接可靠地工作而没有安全设置后,您才应该启用它,例如 WPA-PSK。
NDISwrapper 未加载
您可以通过运行以下命令来检查是否加载了 NDISwrapper 内核模块
lsmod | grep ndiswrapper
如果该命令没有输出,您需要加载 NDISwrapper。运行
su -
以获取 root 权限,然后
modprobe ndiswrapper
在 modprobe 运行后,如果您在 YaST 中配置了您的网卡,那么您可以运行
rcnetwork restart
这与(只是打字更少)相同
/etc/init.d/network restart
以重新启动您的网络管理器,网卡应该可以正确激活。
在启动时加载 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 wlan?),使用 YaST 配置无线接口不会自动加载 ndiswrapper 模块。要使您的 wlan 卡在启动时工作,您必须编辑 /etc/init.d/network 中的网络脚本(如上所述)。
使用 1.46 及更高版本从源代码编译
Ndiswrapper 1.46 及更高版本需要 2.6.17 或更高版本的内核才能正确编译。只有 OpenSUSE 版本 10.2 及更高版本才配备 2.6.17+ 内核;早期 SUSE 版本的用户需要升级他们的内核或使用版本等于或早于 1.45。当然,选择随 CD/DVD 提供的预编译 ndiswrapper-kmp-<flavor> 包的用户可以忽略此问题。
与 NetworkManager 的冲突
如果您无法使用 NetworkManager 连接到无线网络,您可以使用 ifup 配置无线连接(IP 地址、加密、身份验证等)通过 YaST。
硬件特定信息
Atheros
如果您拥有基于 Atheros 的网卡,建议您首先尝试 madwifi。如果无法使 madwifi 工作,那么 NDISwrapper 很可能可以完成这项工作,尽管您可能会遇到一些小问题。请参阅 Atheros madwifi 以获取更多信息。
对于 AR5005G(经常用于笔记本电脑),您需要更新版本的 Windows 驱动程序。如果您可以访问 Windows 下的安装,您可以从 C:\Program Files\Atheros\Driver 复制驱动程序
您也可以尝试从 Windows 驱动程序 CD 中提取它,或者您可以从 这里 下载 32 位 Atheros 无线驱动程序(如果这是您获取驱动程序的最后手段)。如果您使用的是 openSUSE 的 64 位版本 (x86_64),您将需要 64 位 Windows 的驱动程序。


