默认情况下,NetworkManager 将 WiFi 密码以纯文本形式存储*.nmconnection
在/etc/NetworkManager/system-connections/
.这对我来说是不可接受的,所以我决定使用nm-connection-editor
.我在那里检查了该Store the password only for this user
选项。这具有将密码存储在 GNOME 密钥环中而不是纯文本中的效果。
但这个解决方案有一个问题:NetworkManager 在计算机启动时作为 systemd 单元启动。此时 GNOME 密钥环尚未启动。稍后成功登录后,它将由我的显示管理器启动,并使用我的用户密码(与密钥环的密码相同)自动解锁。因此,显然,NetworkManager 无法从密钥环中获取密码,并发出以下日志:
NetworkManager[610]: <warn> [1565208122.6857] device (wlp2s0): no secrets: No agents were available for this request.
登录后没有WiFi连接。我必须单击 nm-applet 并选择我的 WiFi 网络。此后就已连接,但我更希望它自动发生。
是不是我的配置有问题?如果是这样,我该如何修复它?
为了完整性,这里是我的配置:
- 操作系统:Arch Linux
- 显示管理器:SDDM
- 窗口管理器:i3
答案1
在分析了NetworkManager的源代码后,我发现了问题所在。如果 NetworkManager 无法从密钥环获取机密,它将阻止连接自动连接。看起来此行为是不可配置的,并且在 nm-policy.c 中硬编码:
https://github.com/NetworkManager/NetworkManager/blob/master/src/nm-policy.c
在第 1830 行附近有一段代码:
if (nm_device_state_reason_check (reason) == NM_DEVICE_STATE_REASON_NO_SECRETS) {
/* ... */
con_v = nm_settings_connection_get_last_secret_agent_version_id (sett_conn);
if ( con_v == 0
|| con_v == nm_agent_manager_get_agent_version_id (priv->agent_mgr))
block_no_secrets = TRUE;
}
if (block_no_secrets) {
_LOGD (LOGD_DEVICE, "connection '%s' now blocked from autoconnect due to no secrets",
nm_settings_connection_get_id (sett_conn));
nm_settings_connection_autoconnect_blocked_reason_set (sett_conn, NM_SETTINGS_AUTO_CONNECT_BLOCKED_REASON_NO_SECRETS, TRUE);
}
解决此行为并使 NetworkManager 不阻止自动连接的最简单方法是不将其设置block_no_secrets
为 TRUE(只需将其设置为 FALSE 或完全删除第一个 if 语句)。