Linux图形界面详解以及替换桌面程序方法

说明:本文章主要说明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)了

主流的显示服务器主要有两种X11Wayland,传统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博客 


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/956143.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第4章 Kafka核心API——Kafka客户端操作

Kafka客户端操作 一. 客户端操作1. AdminClient API 一. 客户端操作 1. AdminClient API

使用 Java 和 FreeMarker 实现自动生成供货清单,动态生成 Word 文档,简化文档处理流程。

在上一篇博客中主要是使用SpringBootApache POI实现了BOM物料清单Excel表格导出&#xff0c;详见以下博客&#xff1a; Spring Boot Apache POI 实现 Exc&#xff08;&#xff09;el 导出&#xff1a;BOM物料清单生成器&#xff08;支持中文文件名、样式美化、数据合并&#…

python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)边缘检测

OpenCV中边缘检测四种常用算子&#xff1a; &#xff08;1&#xff09;Sobel算子 Sobel算子是一种基于梯度的边缘检测算法。它通过对图像进行卷积操作来计算图像的梯度&#xff0c;并将梯度的大小作为边缘的强度。它使用两个3x3的卷积核&#xff0c;分别用于计…

R语言绘图

多组火山图 数据准备&#xff1a; 将CSV文件同一在一个路径下&#xff0c;用代码合并 确保文件列名正确 library(fs) library(dplyr) library(tidyr) library(stringr) library(ggplot2) library(ggfun) library(ggrepel)# 获取文件列表 file_paths <- dir_ls(path &quo…

IDEA2023版中TODO的使用

介绍&#xff1a;TODO其实本质上还是注释&#xff0c;只不过加上了TODO这几个字符&#xff0c;可以让使用者快速找到。 注意&#xff1a;在类、接口等文件中&#xff0c;注释是使用// 即&#xff1a;// TODO 注释内容 在配置文件中&#xff0c;注释是使用# 即&#xff1a;# TO…

Maven的多模块架构设计诺依的多模块

Maven的多模块架构设计 多模块架构设计&#xff0c;本文采用 诺依的多模块架构设计分析

【JsonViewer】Json格式化

使用 Notepad 对 Json 数据进行格式化处理&#xff0c;使数据在结构上更清晰 1.在线安装 安装之后&#xff0c;重启应用&#xff0c;在插件菜单栏即可看到 JsonViewer 选项&#xff0c;在 Notepad 中放入 Json 数据&#xff0c;点击 Format Json 进行数据格式化 2.离线安装 …

【漏洞预警】FortiOS 和 FortiProxy 身份认证绕过漏洞(CVE-2024-55591)

文章目录 一、产品简介二、漏洞描述三、影响版本四、漏洞检测方法五、解决方案 一、产品简介 FortiOS是Fortinet公司核心的网络安全操作系统&#xff0c;广泛应用于FortiGate下一代防火墙&#xff0c;为用户提供防火墙、VPN、入侵防御、应用控制等多种安全功能。 FortiProxy则…

企业分类相似度筛选实战:基于规则与向量方法的对比分析

文章目录 企业表相似类别筛选实战项目背景介绍效果展示基于规则的效果基于向量相似的效果 说明相关文章推荐 企业表相似类别筛选实战 项目背景 在当下RAG&#xff08;检索增强生成&#xff09;技术应用不断发展的背景下&#xff0c;掌握文本相似算法不仅能够助力信息检索&…

Ubuntu打开文件夹不显示文件

1.情况介绍 使用ubuntu打开文件夹不显示文件夹里面的内容&#xff0c;而是直接打开了资源查看器。 2.解决办法 命令行安装nautilus sudo apt-get install nautilus

Go-知识 版本演进

Go-知识 版本演进 Go release notesr56(2011/03/16)r57(2011/05/03)Gofix 工具语言包工具小修订 r58(2011/06/29)语言包工具小修订 r59(2011/08/01)语言包工具 r60(2011/09/07)语言包工具 [go1 2012-03-28](https://golang.google.cn/doc/devel/release#go1)[go1.1 2013-05-13]…

pycharm+pyside6+desinger实现查询汉字笔顺GIF动图

一、引言 这学期儿子语文期末考试有一道这样的题目&#xff1a; 这道题答案是B&#xff0c;儿子做错了选了C。我告诉他“车字旁”和“车”的笔顺是不一样的&#xff0c;因为二者有一个笔画是不一样的&#xff0c;“车字旁”下边那笔是“提”&#xff0c;而“车”字是“横”&am…

Red Hat8:搭建DHCP服务器

1、新建挂载文件 2、挂载 3、关闭防火墙 4、搭建yum源 &#xff08;搭建的时候用vim 自行定义文件名.repo或者是vi 自行定义文件名.repo&#xff09; 5、安装dhcp-server 6、复制模板文件 dhcpd.conf 是DHCP服务的配置文件&#xff0c;DHCP服务所有参数都是通过修改dhcpd.co…

Web前端------HTML链接标签

1.普通超链接 &#xff08;1&#xff09;链接外部网页 点击文本&#xff0c;跳转到外部网页 <!DOCTYPE html><html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, i…

linux下springboot项目nohup日志或tomcat日志切割处理方案

目录 1. 配置流程 2. 配置说明 其他配置选项&#xff1a; 3. 测试执行 4. 手动执行 https://juejin.cn/post/7081890486453010469 通常情况下&#xff0c;我们的springboot项目部署到linux服务器中&#xff0c;通过nohup java -jar xxx.jar &指令来进行后台运行我们…

每日进步一点点(网安)

1.BUU CODE REVIEW 1 先看源代码 <?phphighlight_file(__FILE__);class BUU {public $correct "";public $input "";public function __destruct() {try {$this->correct base64_encode(uniqid());if($this->correct $this->input) {ec…

2025.1.19机器学习笔记:PINN文献精读

第三十周周报 一、文献阅读题目信息摘要Abstract创新点物理背景网络框架实验实验一&#xff1a;直道稳定流条件实验二&#xff1a;环状网络中的非稳定流条件 结论缺点及展望 二、代码实践总结 一、文献阅读 题目信息 题目&#xff1a;《Enhanced physics-informed neural net…

移动端布局 ---- 学习分享

响应式布局实现方法 主流的实现方案有两种: 通过rem \ vw/vh \ 等单位,实现在不同设备上显示相同比例进而实现适配. 响应式布局,通过媒体查询media 实现一套HTML配合多套CSS实现适配. 在学习移动端适配之前,还需要学习移动端适配原理: 移动端适配原理(Viewport) 了解VSCo…

STM32 FreeROTS 任务创建和删除实验(静态方法)

实验目标 学会 xTaskCreateStatic( )和 vTaskDelete( ) 的使用&#xff1a; start_task&#xff1a;用来创建其他的三个任务。task1&#xff1a;实现LED1每500ms闪烁一次。task2&#xff1a;实现LED2每500ms闪烁一次。 task3&#xff1a;判断按键KEY1是否按下&#xff0c;按…

家政服务小程序,打造智慧家政新体验

春节即将来临&#xff0c;家政市场呈现出了火热的场景&#xff0c;大众对家政服务的需求持续增加。 近年来&#xff0c;家政市场开始倾向数字化、智能化&#xff0c;借助科学技术打造家政数字化平台&#xff0c;让大众在手机上就可以预约家政服务&#xff0c;减少传统家政市场…