Linux图形界面详解以及替换桌面程序方法[持续更新]

news2025/1/21 4:42:07

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

3、X11环境LightDM桌面替换Qt程序

说明:我使用的是PC主机ssh登录RK3288 Linux主机开发,即使停掉图形界面也不影响远程命令行的使用,使用本地Linux主机开发的建议还是再找台电脑远程开发,避免卸载图形界面之后就无法操作。

1)查看配置文件

查看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

2)停止LightDM服务

先不要直接卸载或者禁用LightDM服务,避免开机直接黑屏,不便于恢复原本系统状态,只需要停止lightDM服务就好。

停止lightDM服务命令:

sudo systemctl stop lightdm

停止之后我们会发现黑屏了,如果我们想显示桌面则可以再启动lightdm服务

sudo systemctl start lightdm

3)编写我们图形化程序的启动服务

 这时候需要启动我们自己的图形化程序看一下能否显示,由于已经没有图形界面了,而在远程ssh中我们无法直接启动,所以需要编写一个系统服务,通过服务的方式来启动。

linaro@linaro-alip:/etc/init.d$ cat testapp
#! /bin/sh
### BEGIN INIT INFO
# Provides:          testapp
# 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: Display Service
# 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


case $1 in
        start)
                start-stop-daemon --start --quiet --pidfile /var/run/testapp.pid --name testapp --exec /home/linaro/testapp -b|| echo -n " already running"
                ;;
        stop)
                sudo kill $(ps -ef | grep -m 1 testapp | awk '{print $2}')
                ;;
esac

重新加载服务,然后启动服务。

linaro@linaro-alip:/etc/init.d$ sudo systemctl daemon-reload
linaro@linaro-alip:/etc/init.d$ sudo systemctl start testapp

试了一下,没有任何反应,还是黑屏,这是什么情况?

查看进程发现我们的测试程序并没有启动

是我们的系统服务配置有问题还是环境有问题?又或者是x11有问题?

linaro@linaro-alip:/etc/init.d$ sudo systemctl start testapp
linaro@linaro-alip:/etc/init.d$ sudo systemctl start x11-common
Failed to start x11-common.service: Unit x11-common.service is masked.
linaro@linaro-alip:/etc/init.d$

尝试启动x11服务也失败了。

但是X11服务没有启动lightDM又是如何启动的呢?

而且我发现,启动lightdm的时候这个x11-common服务也是这个状态,说明与x11-common服务状态无关。

这时我想到一个命令,能够启动X11,那便是

sudo xinit &

嚯!终于有显示了。

 并且也可以输命令了,这时候再去启动我们图形化程序。

哦吼!成功了,说明流程是没有问题了,接下来需要考虑的就是如何把这个流程配置成系统服务了。 另外注意到,图形化程序没有了标题栏和边框,这是因为桌面程序和窗口管理程序是绑定的,没有桌面程序也就没有了窗口管理器和应用窗口边框。

4、未完待续

持续更新、欢迎关注

三、参考文章

关于linux的图形界面_linux图形化界面-CSDN博客

【进阶知识】显示管理器,窗口管理器,桌面环境/桌面管理器,显示服务器_linux窗口管理器-CSDN博客

Linux图形子系统详解:从X11到Wayland与OpenGL,-CSDN博客


 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

异地IP属地代理业务解析:如何改变IP属地

在数字化时代&#xff0c;IP地址作为网络设备的唯一标识符&#xff0c;不仅关乎设备间的通信&#xff0c;还涉及到用户的网络身份与位置信息。随着互联网的深入发展&#xff0c;异地IP属地代理业务逐渐走进大众视野&#xff0c;成为许多用户关注的话题。本文将详细解析异地IP属…

网络安全VS数据安全

关于网络安全和数据安全&#xff0c;我们常听到如下两种不同声音&#xff1a; 观点一&#xff1a;网络安全是数据安全的基础&#xff0c;把当年做网络安全的那一套用数据安全再做一遍。 观点二&#xff1a;数据安全如今普遍以为是网络安全的延伸&#xff0c;实际情况是忽略数据…

Android系统开发(一):AOSP 架构全解析:开源拥抱安卓未来

引言 当我们手握智能手机&#xff0c;流畅地滑动屏幕、切换应用、欣赏动画时&#xff0c;背后其实藏着一套庞大且精密的开源系统——Android AOSP&#xff08;Android Open Source Project&#xff09;。这套系统不仅是所有安卓设备的根基&#xff0c;也是系统开发者的终极 pl…

day02_ElasticSearch基础和SeaTunnel

文章目录 day02_ElasticSearch基础和SeaTunnel一、ElasticSearch基本介绍(了解)1、Elasticsearch应用方向2、ElasticSearch特点3、发展历史二、安装ElasticSearch(操作)1、安装ElasticSearch2、插件安装2.1 浏览器安装可视化插件2.2 PyCharm安装Elasticsearch插件三、Elast…

AI 大爆发时代,音视频未来路在何方?

AI 大模型突然大火了 回顾2024年&#xff0c;计算机领域最大的变革应该就是大模型进一步火爆了。回顾下大模型的发展历程&#xff1a; 萌芽期&#xff1a;&#xff08;1950-2005&#xff09; 1956年&#xff1a;计算机专家约翰麦卡锡首次提出“人工智能”概念&#xff0c;标志…

OpenEuler学习笔记(三):为什么要搞OpenEuler?

为什么要搞OpenEuler&#xff1f; 技术自主可控需求 在信息技术领域&#xff0c;操作系统是关键的基础软件。过去&#xff0c;很多关键技术被国外厂商掌控&#xff0c;存在技术“卡脖子”的风险。OpenEuler的出现可以为国内提供一个自主可控的操作系统选择。例如&#xff0c;在…

linux下的NFS和FTP部署

目录 NFS应用场景架构通信原理部署权限认证Kerberos5其他认证方式 命令serverclient查看测试系统重启后自动挂载 NFS 共享 高可用实现 FTP对比一些ftp服务器1. **vsftpd (Very Secure FTP Daemon)**2. **ProFTPD (Professional FTP Daemon)**3. **Pure-FTPd**4. **WU-FTPD (Was…

STM32-keil安装时遇到的一些问题以及解决方案

前言&#xff1a; 本人项目需要使用到STM32,故需配置keil 5&#xff0c;在配置时遇到了以下问题&#xff0c;并找到相应的解决方案&#xff0c;希望能够为遇到相同问题的道友提供一些解决思路 1、提示缺少&#xff08;missing&#xff09;version 5编译器 step1&#xff1a;找…

mfc操作json示例

首先下载cJSON,加入项目; 构建工程,如果出现, fatal error C1010: unexpected end of file while looking for precompiled head 在cJSON.c文件的头部加入#include "stdafx.h"; 看情况,可能是加到.h或者是.cpp文件的头部,它如果有包含头文件, #include &…

AI可信论坛亮点:合合信息分享视觉内容安全技术前沿

前言 在当今科技迅猛发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;技术正以前所未有的速度改变着我们的生活与工作方式。作为AI领域的重要盛会&#xff0c;CSIG青年科学家会议AI可信论坛汇聚了众多青年科学家与业界精英&#xff0c;共同探讨AI技术的最新进展、挑…

调试Hadoop源代码

个人博客地址&#xff1a;调试Hadoop源代码 | 一张假钞的真实世界 Hadoop版本 Hadoop 2.7.3 调试模式下启动Hadoop NameNode 在${HADOOP_HOME}/etc/hadoop/hadoop-env.sh中设置NameNode启动的JVM参数&#xff0c;如下&#xff1a; export HADOOP_NAMENODE_OPTS"-Xdeb…

Ability Kit-程序框架服务(类似Android Activity)

文章目录 Ability Kit&#xff08;程序框架服务&#xff09;简介Stage模型开发概述Stage模型应用组件应用/组件级配置UIAbility组件概述概述声明配置 生命周期概述生命周期状态说明Create状态WindowStageCreate**和**WindowStageDestroy状态WindowStageWillDestroy状态Foregrou…

鸿蒙安装HAP时提示“code:9568344 error: install parse profile prop check error” 问题现象

在启动调试或运行应用/服务时&#xff0c;安装HAP出现错误&#xff0c;提示“error: install parse profile prop check error”错误信息。 解决措施 该问题可能是由于应用使用了应用特权&#xff0c;但应用的签名文件发生变化后未将新的签名指纹重新配置到设备的特权管控白名…

哈尔滨有双线服务器租用吗?

哈尔滨有双线服务器租用吗&#xff1f;双线服务器是一种针对哈尔滨特有的网络环境优化的服务器解决方案&#xff0c;它能够同时支持中国电信和中国联通或移动其中两家主要ISP&#xff08;互联网服务提供商&#xff09;的连接。 由于中国南方地区多采用电信网络&#xff0c;而北…

三天急速通关Java基础知识:Day1 基本语法

三天急速通关JAVA基础知识&#xff1a;Day1 基本语法 0 文章说明1 关键字 Keywords2 注释 Comments2.1 单行注释2.2 多行注释2.3 文档注释 3 数据类型 Data Types3.1 基本数据类型3.2 引用数据类型 4 变量与常量 Variables and Constant5 运算符 Operators6 字符串 String7 输入…

JVM 面试八股文

目录 1. 前言 2. JVM 简介 3. JVM 内存划分 3.1 为什么要进行内存划分 3.2 内存划分的核心区域 3.2.1 核心区域一: 程序计数器 3.2.2 核心区域二: 元数据区 3.2.3 核心区域三: 栈 3.2.4 核心区域四: 堆 4. JVM 类加载机制 4.1 类加载的步骤 4.1.1 步骤一: 加载 4…

《AI赋能中国制造2025:智能变革,制造未来》

引言&#xff1a;开启智能制造新时代 在全球制造业格局深度调整的当下&#xff0c;科技变革与产业转型的浪潮汹涌澎湃。2015 年&#xff0c;我国重磅推出《中国制造 2025》这一宏伟战略&#xff0c;它如同一座灯塔&#xff0c;为中国制造业驶向高端化、智能化、绿色化的彼岸指明…

Observability:最大化可观察性 AI 助手体验的 5 大提示(prompts)

作者&#xff1a;来自 Elastic Zoia_AUBRY 在过去三年担任客户工程师期间&#xff0c;我遇到了数百名客户&#xff0c;他们最常问的问题之一是&#xff1a;“我的数据在 Elastic 中&#xff1b;我该如何利用它获得最大优势&#xff1f;”。 如果这适用于你&#xff0c;那么本…

Mysql常见问题处理集锦

Mysql常见问题处理集锦 root用户密码忘记&#xff0c;重置的操作(windows上的操作)MySQL报错&#xff1a;ERROR 1118 (42000): Row size too large. 或者 Row size too large (&#xff1e; 8126).场景&#xff1a;报错原因解决办法 详解行大小限制示例&#xff1a;内容来源于网…

【前端】用OSS增强Hexo的搜索功能

文章目录 前言配置 _config.fluid.yml云端实时更新 local-search.xml解决 OSS.Bucket 的跨域问题 前言 原文地址&#xff1a;https://blog.dwj601.cn/FrontEnd/Hexo/hexo-enhance-local-search-with-oss/ 考虑到某著名云服务商提供的云服务器在两年的 99 计划后续费价格高达四…