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
这是编辑过的文件的截图。
参考资料。
- http://lists.alpinelinux.org/alpine-devel/5092.html
- https://blog.w1r3.net/2018/02/11/getting-crda-regdb-working-on-alpine.html
- (不幸的是,没有提到新的mdev.conf行的位置--让我调试了几个小时!)
创建新的modprobe.d条目
运行。
touch /etc/modprobe.d/cfg80211.conf
vi /etc/modprobe.d/cfg80211.conf
插入以下一行(如有必要根据你的国家调整DE--双字母代码)。
选项 cfg80211 ieee80211_regdom=DE
保存该文件。
这个文件将确保你的监管域在启动时被正确应用。
参考资料。
- https://linux.die.net/man/8/crda - 说国家代码是一个ISO / IEC 3166 alpha2国家代码
或者: 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。
现在,不要删除你安装到系统中的软件包的仓库行。