说明:本文章主要说明Linux图形界面的启动流程,以及使用自己的图形化应用替换桌面程序的方法,类似与安卓启动会启动Launcher,使用自己程序替换Launcher一样,实现应用独占系统,或者设计自己的桌面程序。
一、实现原理
众所周知,不知也可,内核加载完成后,会启动第一个进程init/systemd. 在centos6及以前使用init进程管理服务,centos7及以后使用systemd守护进行管理服务。init/systemd会根据启动级别加载和运行对应的系统进程。
Linux有七种运行级别(0-6):
运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
运行级别2:多用户状态(没有NFS)
运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
运行级别4:系统未使用,保留
运行级别5:X11控制台,登陆后进入图形GUI模式
运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
带图形化界面的Linux默认会启动到级别5,不带图形化界面的Linux默认会启动到级别3(也就是命令行模式,也叫文本模式)。
这个启动级别当然是可以设置的,设置方法如下:
查看是否有inittab文件,来判断系统服务的管理方式。
ls /etc/inittab
在Linux系统中,/etc/inittab
文件是用来配置init(初始化)系统的运行级别和控制启动进程的。然而,在最新的Linux发行版中,如CentOS 7、Ubuntu 15.04及以后的版本,以及基于Fedora 15的系统中,已经采用了一个新的初始化系统,即systemd
。在这些系统中,/etc/inittab
文件已经被弃用,如果你在系统中找不到这个文件,很可能是你正在使用的是基于systemd
的系统。
1、inittab方式修改默认启动级别
1) 编辑/etc/inittab文件
使用文本编辑器打开`/etc/inittab`文件。常用的编辑器有`vi`、`vim`或`nano`等。例如,使用`vi`编辑器打开该文件:
vi /etc/inittab
2) 查找并修改默认启动级别
在文件中找到如下一行:
id:5:initdefault:
其中的数字“5”代表默认启动级别为图形界面(X Window系统)。为了将默认启动级别更改为多用户模式(运行级3),需要将数字“5”修改为“3”:
id:3:initdefault:
3) 保存并退出
如果使用的是`vi`或`vim`编辑器,按下`Esc`键,然后输入`:wq`来保存并退出。
如果使用的是`nano`编辑器,则可以按`Ctrl+X`,然后按`Y`键确认保存,最后按`Enter`键退出。
2、systemd方式修改默认启动级别
1、要查看当前的默认目标:
systemctl get-default
要更改默认的目标到多用户模式(相当于传统上的运行级别3):
sudo systemctl set-default multi-user.target
要更改为图形化界面模式(相当于传统的运行级别5):
sudo systemctl set-default graphical.target
以上命令会创建一个符号链接 /etc/systemd/system/default.target 到相应的目标位置,从而决定了系统启动时的行为。
执行成功提示如下:
Removed /etc/systemd/system/default.target.
Created symlink /etc/systemd/system/default.target → /lib/systemd/system/graphical.target.
3、启动级别对图形化程序的影响
为什么级别5叫图形化模式,即使在文本模式屏幕不是也会显示吗?难道就无法运行图形化程序吗?
其实文本模式也可叫framebuffer模式,是通过对/dev/fbx设备的写入实现的,也可以显示图形化界面,但是效率并不高,帧率也上不去,并且一旦有命令行文字刷新,就会抢占屏幕显示区域。但是好处是方便、操作简单,只要不在意刷新速度,通过一些手段关闭命令行的光标闪烁和log打印,也可以用来显示复杂的图形界面。
4、图形化模式详解
要实现高效率的图形化界面还是建议使用图形化模式,但是一旦进入图形化模式肯定是直接就启动桌面程序了,或者如果没有安装桌面程序,切换到图形化模式了,可能也就意味着死机了。
提到图形化模式就不得不提 显示服务器(Display server)了
主流的显示服务器主要有两种X11和Wayland,传统X11支持应用环境多,Wayland是下一代的显示服务器,或许会是以后的主流。
Linux主流的图形库QT和GTK+都是基于X11的。
可能会有朋友问了,什么是显示服务器呢?对于传统的Windows应用开发者来说,只要给我们一个GUI库我们就可以开发图形化程序了,你给我说qt我懂,gtk+我也懂,给我说显示服务器我可就黑人问号了。想详细了解的可以自己去查阅,这个跟我们普通开发者关系不太大,我们只需要知道qt和gtk依赖x11运行就行了,当Linux系统启动到图形化模式的时候,x11也就顺带启动了,然后就可以运行基于x11的图形库开发的图形化程序了。
还有朋友可能会问,那我如果不用QT和GTK呢?那我是不是就不需要X11了?【傲娇脸】
好好好,这么玩是吧?那就来吧!【穿山甲拉手雷】
难道没有X11我们就无法搞GUI了吗?不不不!【摇手指】
这就要引出一个大家都耳熟能详的名词了,OpenGL,你可以直接使用EGL接口开发基于OpenGL的图形化程序,甚至OpenGL都不需要,直接通过libDRM控制GPU渲染,我猜你不会想这样,这将毫无开发效率可言。
还是老老实实选一种适合自己的GUI库开发好了。
如果你不想用QT和GTK还有其他选择吗?有!SDL也是一种不错的选择。
但是很不巧,SDL也是基于Xlib的,也就是X11
难道就没有支持Wayland的吗?都夸Wayland好,原来都只是口头上支持的吗?【气抖冷】
其实也不是没有,只不过很多家GUI库还是以X11为主,支持Wayland大多都是实验性的,感兴趣的可以自己去查找。
如果你是嵌入式软件开发者,那么就不得不提一下大名鼎鼎的LVGL了,什么X11、什么Wayland,什么SDL,什么Framebuffer,就算是OpenGL那也都是都是小case了,几乎没有不支持的【掌声】,弊端就是不能方便的部署环境,需要自己去配置环境编译。
二、环境部署
1、选择自己的图形化程序开发库
首先明确我们的目的,我是要用我们自己的程序替换掉系统桌面,如果我们的的程序是基于QT、GTK+、SDL开发的,那么我们需要使用X11作为显示服务器,以及相应的GUI运行环境,然后查看我们使用的桌面环境是什么,用我们自己的程序把桌面程序替换就行了(虽然实现起来并没有那么简单)。
如果我们的程序是基于LVGL开发的,如果LVGL是基于X11的就需要X11环境,基于Wayland的就需要Wayland环境,基于SDL的就需要X11+SDL环境,基于framebuffer这就不是我们这次要讨论的重点了,也很简单自行查阅就好。
2、修改启动流程
1)默认启动顺序
当我们配置默认启动级别是5(图形化模式的时候)
inittab/systemd就会运行启动级别为5的服务。
其中就包含了x11服务,以及桌面程序(显示管理器),常见的显示管理器有:
-
GDM(GNOME 显示管理器GNOME Display Manager):GNOME 的首选。
-
SDDM(简单桌面显示管理器Simple Desktop Display Manager):KDE 首选。
-
LightDM
由于桌面程序也是基于X11的,所以默认启动顺序是
X11 > DM(显示管理器)> 其他GUI程序
2)X11环境LightDM桌面替换
查看lightdm服务配置文件
linaro@linaro-alip:/etc/init.d$ cat lightdm
#! /bin/sh
### BEGIN INIT INFO
# Provides: lightdm
# Should-Start: console-screen kbd acpid dbus hal consolekit
# Required-Start: $local_fs $remote_fs x11-common
# Required-Stop: $local_fs $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Light Display Manager
# Description: Debian init script for the Light Display Manager
### END INIT INFO
#
# Author: Yves-Alexis Perez <corsac@debian.org> using gdm script from
# Ryan Murray <rmurray@debian.org>
#
set -e
PATH=/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/sbin/lightdm
可以看得出来,lightdm显示管理器,依赖x11-common服务
查看x11-common服务配置文件
linaro@linaro-alip:/etc/init.d$ cat x11-common
#!/bin/sh
# /etc/init.d/x11-common: set up the X server and ICE socket directories
### BEGIN INIT INFO
# Provides: x11-common
# Required-Start: $remote_fs
# Required-Stop: $remote_fs
# Default-Start: S
# Default-Stop:
# Short-Description: set up the X server and ICE socket directories
### END INIT INFO
而x11已经基本没有什么依赖了,这里我们不需要关心$remote_fs
三、参考文章
关于linux的图形界面_linux图形化界面-CSDN博客
【进阶知识】显示管理器,窗口管理器,桌面环境/桌面管理器,显示服务器_linux窗口管理器-CSDN博客
Linux图形子系统详解:从X11到Wayland与OpenGL,-CSDN博客