session_manager
用于管理Chrome進程的生命周期。通常位于目錄 login_manager
下,并通過包chromeos-login
安裝。
當前session_manager
與其他進程使用D-Bus
通訊。其保有名為org.chromium.SessionManager
的服務,對應路徑為/org/chromium/SessionManager
,導出接口名為org.chromium.SessionManager
。
Startup
啟動任務ui
(對應執行文件為init/upstart/ui.conf
)用于運行session_manager
。在執行之前,首先會運行ui-pre-start
(對應執行文件為init/script/ui-pre-start
來創建必要的文件和目錄。
session_manager
構造命令行用于運行Chrome并為其產生子進程。命令行通過文件chrome_setup.cc
和libchromeos-ui
的類ChromiumCommandBuilder
來構造。命令行的內容依賴于先前的變量標簽(如USE
)。包libchromeos-use-flags
中在IUSE
下羅列了大量的可用于USE
的標簽;在編譯時,其將所有設置的標簽寫入到/etc/ui_use_flags.txt
中。session_manager
讀取其中的內容并啟動。通常ui_use_flags.txt
是一個很小的文本文件,用以避免寫入到chromeos-login
中導致需要為不同的主板類型編譯。
開發者還需要注意到文件/etc/chrome_dev.conf
,這是一個配置文件,用于在設備上添加或移除Chrome
的命令行參數。在該文件中有對應的文檔。
在Chrome
顯示出登陸提示界面后,調用session_manager
的D-Bus
方法EmitLoginPromptVisible
。session_manager
寫入一個login-prompt-visible
啟動狀態事件,在接口上發出D-Bus
信號LoginPromptVisible
,并異步調用D-Bus
通知事件login-prompt-visible
到Upstart
;該事件隨后用于觸發其他任務。
Login
當用戶成功登陸Chrome
后,Chrome
調用session_manager
的D-Bus
方法StartSession
。session_manager
通過D-Bus
異步調用Upstart
的方法StartUserSession
,并在它自己的接口上發出信號SessionStateChanged
。
當有更多的用戶加入到會話中時,會再次發出信號SessionStateChanged
。
Screen Locking
在用戶登錄成功后系統內其他進程可能會鎖定屏幕:
- Chrome鎖定屏幕以響應用戶請求,或僅僅是因為系統掛起之前設置了
Require password to wake from sleep
選項; -
powerd
鎖定屏幕以響應user inactivity
;
其他進程要鎖定屏幕,首先會調用session_manager
的D-Bus
方法LockScreen
。session_manager
內部記錄鎖定的狀態,并調用到Chrome
的D-Bus
方法LockScreen
。一旦Chrome
成功顯示鎖定屏幕,就緊接著調用session_manager
的D-Bus
方法HandleLockScreenShown
發出D-Bus
信號ScreenIsLocked
。
當用戶成功輸入密碼以解鎖屏幕后,Chrome
調用session_manager
的D-Bus
方法HandleLockScreenDIsmissed
。session_manager
更新其內部狀態以記錄屏幕未鎖定狀態,并發出D-Bus
信號ScreenIsUnlocked
。
Logout
當用戶登出時,Chrome
調用session_manager
的D-Bus
方法StopSession
。session_manager
發送信號SIGTERM
到瀏覽器進程,并等待3秒(缺省值為3秒)到退出。如果3秒內仍然在運行,則發送信號SIGABRT
,然后session_manager
退出。
接下來會運行腳本ui-post-stop
(對應路徑為init/script/ui-post-stop
)。它寫入啟動狀態事件ui-post-stop
,并通過發送信號SIGKILL
到所有仍然在運行的chronos
進程,以強行清理進程,并殺死孤兒進程。
然后會運行Upstart任務ui-respawn
(對應路徑為init/upstart/ui-respawn.conf
),然后執行ui-respawn
(對應路徑為init/scripts/ui-respawn
),用于管理ui
任務的重啟。
Crashes
如果Chrome
意外退出,session_manager
通常會進行重啟(不帶標簽--login-manager
)。如果在崩潰時屏幕鎖定,則session_manager
會結束會話以避免在無人值守的系統上暴露出已登陸的桌面。
如果Chrome
多次崩潰,則ui-respawn
會重啟系統。如果持續崩潰,則會停止重啟系統,并嘗試自動更新到不會崩潰的新版本。關于這一點可以參考ui-respawn
(對應腳本init/scripts/ui-respawn
)以獲取更多信息。
mark
翻譯自文件src/platform2/login_manager/README.md
。