Xfce漫游(2) - Xfce的启动流程
本文探讨从Linux启动直到进入xfce4会话之前的过程;和Xfce相关的内容需要单独进行说明。
从按下电源键到进入登录界面
不关心这些,不过可以参考这篇Arch的启动流程或者bootup(7)。在这个过程中systemd启动时,还会启动各种服务诸如D-bus等,可以阅读systemd.service(5)。
systemd启动的目标就是执行default.target。为此它分析target文件所定义的依赖关系并从最开始解决它们,这些都可以从日志中的Reached target相关内容查出。一般来说都是为了执行graphical.target,此时启动显示管理器(比如lightdm)。在整个过程中(管他什么细节过程)所有被enabled的service也完成启动了。
那么话题就来到了lightdm本身的启动流程。LightDM的功能无外乎:
- 启动X服务器
- 运行Greeter(比如GTK greeter)以显示登录界面
- 调用PAM以完成登录动作,同时根据用户选择启动相应的会话
登录后
登录之后,systemd会为用户创建会话。所谓的会话(Session)就是一个用户从登录进到登出的过程……
LightDM调用startxfce4,startxfce4则进一步启动xfce4-session。一般来说一次用户登录中只能启动一个session,再次启动xfce4-session时会提醒已经有一个Session manager在运行了。为此需要使用一些小技巧:
$ Xephyr -screen 1280x720 :2 & # 启动一个虚拟X会话并为其分配DISPLAY环境变量
$ su - somebody # 登入某个用户,可以是你自己
$ export DISPLAY=:2 # 将DISPLAY变量设为之前的
$ xfce4-session # 也可以是startxfce4
在设置完DISPLAY之后其实想启动什么图形界面程序都行,随心所欲,比如也可以单独启动xfdesktop之类的或者试试在没有窗口管理器的情况下会出现什么情况,但是重新登录一步必须要做;为了成功率起见可以不用su登录,而是切换到某个TTY中登录,剩余的命令是一样的。
总之,在进行上述的命令行后,Xephyr启动的虚拟屏幕中已经出现了另一个xfce桌面,而我们的命令只是xfce4-session而已,说明是xfce4-session启动了xfce桌面。至于它是做什么的,具体又启动了哪些内容,就留到接下来的文章了。
关于Xorg、X服务器
由于xfce4很多地方使用了libx11库,所以这块也稍微看看。
考虑我们不用LightDM而是直接从TTY登入,登入后用startxfce4命令启动Xfce。此时的流程为:
- 在startxfce4脚本内部最终
xinit /etc/xdg/xfce4/xinitrc -- /etc/X11/xinit/xserverrc - xserverrc中启动了
/usr/bin/X -nolisten tcp - 剩下的在xfce4的xinitrc里面了
xinitrc做的事情主要就是:
- 设环境变量,XDG的也好,DBus的也好
- 启动
xfce4-session
xfce4-session的事再说,研究的问题在于/usr/bin/X -nolisten tcp。X是图形通信协议,用于启动图形化啥的。上面的场景中先是用了TTY的登录进入字符界面,然后用命令启动xfce4。
- 关于VT: https://en.wikipedia.org/wiki/Linux_console
- 关于TTY的绘制:https://en.wikipedia.org/wiki/Linux_framebuffer
关于libx11可以看这篇文章:https://www.x.org/wiki/guide/xlib-and-xcb/

浙公网安备 33010602011771号