当我从 Ubuntu 14.04 迁移到 Ubuntu 18.04 时,我注意到输出通常nmcli d wifi
不会列出一堆可见的接入点,而只会列出计算机连接到的接入点。
例如:
me@computer:~$ sudo nmcli device wifi list
IN-USE SSID MODE CHAN RATE SIGNAL BARS SECURITY
* XYZ Infra 161 540 Mbit/s 67 ▂▄▆_ WPA2
可以通过手动调用来“修复”此问题sudo iw wlan0 scan
,然后重新运行上述操作并按预期查看附近的 AP。
我的理解是,系统会定期自动进行扫描(如果我没有记错的话,每 300 秒一次)。与此同时,Ubuntu/NetworkManager 似乎决定放弃上次扫描所获得的信息。
这是一个已知的变化、和/或功能、还是一个错误? 这能改变吗?在研究时,我经常最终回到这个问题,这表明扫描频率由 NetworkManager 驱动并且是硬编码的。
到目前为止,我已经在 Intel 7260、8260 和 9260 无线网卡以及 Atheros 无线网卡上看到了这种行为,所以我很确定这不是硬件问题。我目前正在查看的系统有网络管理器 1.10.6
为了证明在给定系统上是否发生了这种明显的缓存清除,一种方法是监视此命令的输出:while [ 1 ]; do nmcli device wifi list | wc -l; sleep 15; done
。当出现上述症状时,输出将为“2”。如果您在命令运行时执行新的扫描,即iw wlan0 scan
,输出将反映 NetworkManage 现在已经知道其他接入点。
在我测试过上述内容的两台机器上,我始终看到在清除缓存之前有 17 个 15 秒的间隔,因此缓存的生命周期约为 255-280 秒。值得注意的是,这与上面的链接(我确认在当前 github repo 中保持不变)。
答案1
更新/注意:我没有深入研究提交历史,但似乎扫描间隔在 20.04 版本的 NetworkManager 中改回了更合理的间隔,大约每 4 分钟一次(我可能记错了这个数字)。
以前,NetworkManager 会定期扫描,无论 wifi 连接质量如何。导致常见用例出现问题,例如视频会议。
在撰写本文时,逻辑已进行了调整,因此扫描间隔时间(在常见的 WPA2 设置上)为每天一次,只要信号强度良好,在本例中为 > 70/100(似乎是 NM 使用的任意单位)。如果信号强度低于此阈值,将进行扫描每 30 秒直到建立更好的连接。这是网络管理器的硬编码设置属于底层 wpa_supplicant 的 bgscan 漫游阈值。(此代码当前版本的大致链接)
我没有进一步挖掘,但显然,它nmcli device wifi list
正在加载有关哪些 wifi 网络可用的缓存信息。在我看来,当缓存达到某个陈旧阈值时,它会被丢弃,因此不会列出其他 AP/网络,这似乎是合理的(现在我更了解发生了什么)。
所以这个问题源于在静态环境中观察机器上这种变化的症状。对于绝大多数现实世界用例来说,这是无害的。如果我移动到一个由其他 AP 提供更好服务的区域,我的笔记本电脑可能会在我不注意的情况下漫游。
那么对于不断移动的机器,需要快速从一个 AP 跳转到另一个 AP 怎么办?这可能可行,但这取决于具体情况。归根结底,这不是此处设计的用例,并且上述逻辑是硬编码的,不可调整。