SDB:Ndiswrapper

跳转到:导航搜索
NDISwrapper 是一个程序,它使用硬件附带的 Windows *.inf 驱动程序文件,在 Linux 上操作您的无线网卡。

为什么(以及为什么不)使用 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
Icon-warning.png
警告:如果您更新了您的 openSUSE 内核,而该内核并非来自 OSS/OSS-Update 仓库,则必须手动编译 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 兼容性列表 中查找您的特定硬件来确定您需要的驱动程序

如果您正在运行 64 位 Linux 内核,则必须找到 64 位 Windows 驱动程序(这比找到 32 位 Windows 驱动程序要难得多!),因此,如果您找不到 64 位 Windows 驱动程序,如果您计划使用 ndiswrapper,则需要改用 32 位版本的 openSUSE!

从您的 Windows 分区

如果您有双引导机器,并且您的网卡在 Windows 中正常工作,那么获取驱动程序的一种方法是从 Windows 分区本身获取。 [请记住,如果您的 Windows 安装是 32 位,您的驱动程序将是 32 位,反之亦然,如果您的 Windows 安装是 64 位,您的驱动程序将是 64 位。]

在 Windows 下,转到 设备管理器,并在“网络适配器”下找到您的无线网卡。右键单击它并转到属性->驱动程序->'驱动程序详细信息...'。在这里,您应该找到指向 *.sys 文件的路径,通常位于您的 C:\windows\system32\drivers\ 目录中。

现在您将使用 Windows“搜索”功能找到相应的 *.inf 文件,这只是一个简单的文本文件(尝试打开一个!),其中包含所需驱动程序文件的列表。因此,Windows 中的示例搜索查询将是

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 可以读取的某个位置,就完成了!

Icon-warning.png
警告:现在不要删除 data1 和 data2 目录,有时 Linux 下 Win8/Win7/Vista 驱动程序无法正常工作,您可能需要用 XP 甚至 Win2K 的驱动程序替换它们。

处理多个 *.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 命令更改到包含 .inf 文件的文件夹,然后再运行该命令。如果到此文件夹的路径(路径名)包含空格,例如“Program Files”,那么对于新手来说,先 cd 到包含所需 .inf 文件的文件夹可能更容易

cd '/home/where the/inf file is'
然后您可以使用 .inf 文件名安装驱动程序

ndiswrapper -i filename.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 本机驱动程序的名称。

如果本机驱动程序已安装并正在被检测到,则可能需要在 /var/log/messages 日志文件中指示的本机驱动程序被“黑名单”。黑名单可以防止本机驱动程序尝试操作硬件,因为我们希望 ndiswrapper 的驱动程序来操作它。要将本机驱动程序列入黑名单,请将一行添加到 /etc/modprobe.d/blacklist 文件中,该行如下所示

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 检测时遇到问题,您可能需要额外的步骤来配置网络卡。

从 openSUSE 11.1 开始,当网络由 NetworkManager 控制时,您不再可以在 YaST 中编辑网络设置。如果您在使用 (K)NetworkManager 时遇到问题,请参阅 https://en.opensuse.net.cn/NDISwrapper#Conflicts_with_NetworkManager 以获取更多信息

有很多可能的配置。这里只是一个典型的例子

屏幕截图演示

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 的驱动程序。

Broadcom


参见


外部链接