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
。