Linux 桌面GUI及其启动流程
为了让大家更好的理解 ChromiumOS 系统的UI启动流程,这里将它和Ubuntu系统的启动进行对比。
Linux GUI 涉及到的术语
Init systems(Init)
- 用户空间启动的第一个进程,PID=1,进程名一般为init,用来(根据配置文件)启动系统中的其他进程;
- 常见的实现有 System V Init(SysV,最老的,新的init大多都兼容它的启动脚本),SystemD(兼容SysV),Upstart(兼容SysV和SystemD),OpenRC(基于SysV),runit
- 对比: https://www.tecmint.com/best-linux-init-systems/ ,https://wiki.gentoo.org/wiki/Comparison_of_init_systems
Display Manager(DM)
- 别名
Login Manager
,提供系统登陆界面,并且负责启动 Display Server,一般会允许配置登录后要执行的程序,默认登录后会执行相应桌面环境的session程序,比如gnome-session,mate-session,如果需要的话这些session程序会启动WM程序,可以通过配置直接启动一个普通的应用程序,这时没有可用的WM,除非程序自己实现相关功能,DM一般也会允许配置对应的greeter程序,该程序专门用来显示登陆界面; - 常见的实现有
LightDM
,GDM
,SDDM
;
Display Server(DS)
- 用来为上层应用提供和鼠标,键盘,GPU等硬件交互的能力,一般通过定义好的协议来和上层应用通信,常见的协议包括
X11
,Wayland
,SurfaceFlinger
,QuartzCompositor
,DirectFB
,SPICE
等,; - 常见的实现有
X.org Server
,X Window System
,Xephyr
,Xvfb
,Weston
,Mutter
,Kwin
,Enlightenment
;
Window Manager(WM)
:
- 为GUI程序提供“窗口”这一概念,提供窗口标题栏,最大化最小化关闭按钮,阴影,窗口re-parent等功能,有些WM同时提供root window,它提供壁纸等功能;
- 常见的实现有 Compiz,Mutter,Kwin,dwm.exe,openbox,awesome等;
- 对比: https://en.wikipedia.org/wiki/Comparison_of_X_window_managers
Greeter
:
- 一般附属于DM,专门提供系统登陆界面;
Desktop Environment(DE)
:
- 代表一个完整桌面环境,可能包括WM,Shell,小工具,图形库等;
- 常见的DE有
GNOME
,KDE
;
使用mate桌面的 Ubuntu18 系统GUI的启动流程
其中有几点需要说明:
systemd
是目前主流的 Init 系统;lightdm
是目前主流的 DM 系统;Xorg
的介绍见 X window system(X11) 介绍 ;mate-session
是 Mate 桌面环境提供的 SM。Mate桌面环境是由gnome2
发展而来,个人觉得它比 gnome2/3 都更好用;macro
是 Mate 默认的WM,可以通过配置替换成其他的WM,比如Compiz
;Greeter
(登陆界面)程序是 DM 提供的,不随着你安装的 DE 的改变而改变,Greeter 程序在登陆后就会退出,如果要更换登陆界面,可以安装独立的 Greeter 程序,然后配置lightdm使之生效;- 安装了不同的DE之后,一般可以在 Greeter 界面上选择登陆后要使用的 DE;
- 有些 WM 是没有独立的进程的,在Ubuntu18默认的系统上,使用
gnome3
的DE,它的WM(Mutter)是集成在gnome-shell中的,所以看不到独立的进程;
ChromiumOS 系统GUI启动流程
说明:
upstart
是由ubuntu开发的并行Init系统,用于取代System-V,文档见 http://upstart.ubuntu.com/;- ChromiumOS 把 Display Manager 和 Session Manager 进行了合并,都是由 session_manager 程序提供;
- Display Server 的实现在 components/exo 目录下,没有独立的进程,运行在 chrome 进程中,实现了 wayland 协议;
- Desktop 和 Window Manager 都是由
ash
模块提供,同样没有独立的进程,运行在 chrome 进程中; exo
是一个不完整的 wayland 服务器,有些api没有实现,因此只能运行部分 wayland 程序;- 在
components/exo/wayland/clients
目录下提供了好几个简单的 wayland 客户端程序,可以通过ninja编译之后拷贝到系统中直接运行; - 在
ui/display/manager/display_manager.xx
文件中定一个名为 DisplayManager 的类,它是用来管理显示器的,相当于 MonitorManager,并不是图中提到的Display Manager;