Alpine Linux上的WiFi通道13和14,又称我无法连接到我的路由器,又称crda配置

无线路由器

摘要

在为我们为一个客户做的Pi Zero WLAN端口改造开发一个嵌入式只读测试系统时,我遇到了一个有趣的问题。

Pi Zero W突然停止连接到我们的路由器。

经过一些调查,我设法找到了原因,并进行了修复。

原因是什么?WLAN的监管领域

在不同国家,有不同的WiFi "频道"(=频率)可供使用。 

维基百科有一个很好的概述。

https://en.wikipedia.org/wiki/List_of_WLAN_channels#2.4_GHz_(802.11b/g/n)

对于2,4 GHz的通道12和13在美国是不存在的,但在大多数其他国家是存在的。

如果你让你的WLAN设备/Raspberry Pi的默认设置,他们会认为他们不被允许连接到这些通道。在你告诉它们之前,它们没有办法知道它们在哪里,因此为了你的利益,它们会选择安全的 "全球 "选项。

另一方面,如果你的路由器被配置在频道12或13,你的Raspberry Pi Zero W(或任何其他Pi,包括Pi 3 B+)将无法看到你的路由器。

但我没有将我的路由器设置为使用这个通道

一切都很正常,直到凌晨4点--然后路由器突然决定要切换到这个频道,因为邻居对它的干扰较少。

你的路由器可能会突然切换,而你会发现自己在调查一个困难的问题。

我怎样才能确定这是否是我的问题?

使用WLAN扫描工具。

我使用inSSIDer for Home。不幸的是,它似乎不再是免费的了,但也有替代品。

形象

正如你在这个截图中看到的,我们的网络使用的是通道 13 和9。(因为它是一个802.11 n网络,它使用两个20MHz宽的信道绑定)。

频道13在美国是不存在的,因此默认情况下Raspberry Pi上也没有。

解决办法。CRDA

你需要安装一些软件包,并对其进行适当设置,以便设置WiFi国家。

在Raspbian上,这是非常简单和直接的,因为所有必要的软件包都已经为你预装。

使用sudo raspi-config作为工具来设置WiFi国家。

在Alpine Linux上,还有一些工作是必要的。我将在这篇博文中一步一步地引导你,分享我所学到的东西,以及我花了大约一整天的时间来学习。希望你能在20分钟以内完成。

关于Raspberry Pi上的Alpine Linux将有更多的博文,现在我们重点讨论欧洲公民的这个具体的WiFi连接问题。

以root身份运行

在下面的教程中,我假设你以用户身份运行操作 .

如果你不是根,请酌情成为根。

关于Alpine的纯RAM文件系统的说明

Alpine Linux有一个很大的优势,就是能够从你的SD卡上完全只读地运行。例如,这意味着你可以在操作过程中拔掉Raspberry Pi的插头而不破坏文件系统。

当然,在开发过程中必须有可能将你的改动应用到基础系统中。

该命令是。

lbu commit -d

重要的是:lbu承诺 可能需要 要设置为保存 特定的子目录 其中的修改(使用lbu include - 详情请参考下面的链接)。

更多细节请参考以下页面。

设置存储库

注意:在Alpine Linux上默认只安装了vi。如果你想添加nano,请使用以下命令。

apk添加nano

编辑存储库(如果你安装了nano,就用vi来切换)。

vi /etc/apk/repositories

添加/替换以下内容(阅读底部的评论以了解更多信息)。

/media/mmcblk0p1/apks
http://dl-3.alpinelinux.org/alpine/edge/testing

http://dl-3.alpinelinux.org/alpine/edge/main

http://dl-3.alpinelinux.org/alpine/edge/community

这三个边缘存储库都是必要的,因为不同的软件包驻扎在不同的存储库中。

安装必要的软件包

运行以下命令。

apk add wireless-regdb crda iw

解释一下。

  • 无线-regdb 包含无线监管数据库的二进制文件。
  • crda 是用户空间工具,用于更新内核的监管信息。
  • iw 是无线配置工具,你将用它来设置监管域(国家)。

检查当前的监管领域

运行。

我想获得

这将显示当前的域名(很可能是国家00:DFS-UNSET)。下面是我们的目标的截图(在我们的例子中,DE代表德国)。

形象

编辑mdev规则

在下文中,新条目的位置非常重要--它必须在最上面,正好是 之前 $MODALIAS线。否则,这将无法工作!!

vi /etc/mdev.conf

在$MODALIAS行之前插入以下新行。

$COUNTRY=...root:root 0660 */sbin/crda

这是编辑过的文件的截图。

形象

参考资料。

创建新的modprobe.d条目

运行。

touch /etc/modprobe.d/cfg80211.conf

vi /etc/modprobe.d/cfg80211.conf

插入以下一行(如有必要根据你的国家调整DE--双字母代码)。

选项 cfg80211 ieee80211_regdom=DE

保存该文件。

这个文件将确保你的监管域在启动时被正确应用。

参考资料。

或者: iw

你也可以用iw来设置监管域(除了上述方法外,可能还有必要?但我的测试表明,这并不坚持)。

iw reg set DE

这里有一张截图。

形象

最终确定

运行(如有必要)。

lbu commit -d

重新启动。你的Pi Zero W现在也应该能够连接到频道12和频道13了

关于crda的说明

crda是 不是 应该由你这个用户来运行。它是作为iw的一个辅助程序运行的。

一个粗糙的黑客,在调试时 "可能 "起作用。它有时会起作用。实际上,很少见。

iw reg set DE ; COUNTRY=DE /sbin/crda

我经常失败,输出结果如下。

未能设置监管域-22

即使是现在,在我可以正确地设置国家之后,这个命令在大多数时候都会失败......我想这是由于竞赛条件造成的。

就我的理解而言。 iw 设置某些环境变量,这反过来会触发MDV运行/sbin/crda,将这些变化发送到内核。

iw不是唯一能够改变内核监管域的工具;wpa-supplicant也应该能够做到这一点。

而且,正如你所看到的,cfg80211.conf也能做到这一点。

监管.bin被安装在 /usr/lib/crda.

在这篇博文描述的解决方案中,你不需要crda-dev包。

关于资源库文件的说明

如果你删除/注释一开始添加的版本库源,软件包就会从你的系统中 "消失"。

我需要进一步调查这个问题,因为我刚刚开始使用Alpine Linux。

现在,不要删除你安装到系统中的软件包的仓库行。