當密碼保存在 GNOME 密鑰環中時,NetworkManager 無法自動連接到 WiFi 網路
預設情況下,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
在分析了 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 語句)。