前言
- 关于linux相关的知识其实比较好的学习网站,更多的就是linux官网。
1. arch的wiki网站: https://wiki.archlinux.org/index.php/Xinit_(简体中文)
2. ubuntu的wiki网站: https://wiki.ubuntu.com/CustomXSession?_ga=2.35195881.998869739.1618487423-1134072113.1617848790
3. 介绍xorg很好的一篇文章:https://wiki.archlinux.org/index.php/Xorg_(简体中文)
4. ubuntu官网的启动说明: https://wiki.ubuntu.org.cn/启动#autostart
5. csdn上的一篇关于xinit的很不错的博客: https://blog.csdn.net/qq_39101111/article/details/78728857
引出的问题
- 在使用过程中, 发现ubuntu可以通过桌面应用startup_applictions(gnome-session-properties)来添加自定义的桌面应用启动程序, 比如在其应用中添加
gnome-terminal 命令
, 可以打开一个桌面图形终端来执行相应的command? 于是, 想当然地在rc.local
的脚本中也执行了gnome-terminal 命令
, 但是发现完全不起作用?于是就有了开始探讨gnome-session-properties这个命令如何在启动时起作用的思考。
解决问题
linux下的图形界面启动流程,下图有些地方并不是那么准确,大致参考即可:
开机启动中不同的运行级别代表着不同的作用,级别5表示启动X-windwos界面。
Ubuntu默认shell为bash,.bashrc即为配置文件,在用户输入完用户名和密码后生效,可添加启动项目。
其实,以下这张图足以说明,为何我们在rc.local的脚本当中启动不了gnome-terminal, 因为在那个阶段, xinit显然还没有启动。图形界面的开机启动流程:(下图的启动流程, 可以使用
pstree
去查看 整棵进程树。)
图形界面的服务器和客户端的启动流程:图形界面的服务端和客户端的相关启动配置文件如下:
$(HOME)/.xinitrc Client to run. Typically a shell script which runs many programs in the background.
$(HOME)/.xserverrc Server to run. The default is X.
/etc/X11/xinit/xinitrc Client to run if the user has no .xinitrc file.
/etc/X11/xinit/xserverrc Server to run if the user has no .xserverrc file.用户可以通过 xinit 程序手动启动 Xorg 显示服务器,startx(1) 脚本只是是 xinit(1) 的前端。
startx的默认启动过程大致为:
startx调用并将系统文件/etc/X11/xinit/xinitrc
和/etc/X11/xinit/xserverrc
作为参数传给xinit,
xinit就会先执行系统文件/etc/X11/xinit/xserverrc
以启动X Server,
然后执行/etc/X11/xinit/xinitrc
,而xinitrc则会执行脚本/etc/X11/Xsession
,而Xsession则会按顺序调用执行/etc/X11/Xsession.d
目录下的文件,从而最终调用了gnome-session(或者openbox)这个用于启动GNOME桌面环境的程序。常见的X-server有 xorg, 常见的x-client有
openbox
,gnome
等等那么和Xorg, xclient, X11之间具体存在什么联系呢?
- X.Org 项目提供了 X 窗口系统的开源实现, 主要提供显示器的显卡驱动配置以及输入设备的配置,如鼠标,键盘,触摸屏, 触摸板等等硬件。
- xinit 工具(startx 脚本)可以带一个可选的客户端程序参数,用来启动上图说的X-client程序, 该程序就是用于桌面显示的桌面环境。
- Xorg通过还要配合窗口管理器才能进行窗口移动,最大化,最小化等, 而窗口管理器一般包含在桌面环境 x-client中, 桌面环境主要用来提供通用图形用户界面元素,如图标、工具栏、壁纸,桌面小部件,并控制窗口管理器。
(1)XDM(默认的X Window System Display Manager)
(2)GDM(gnome提供的Display Manager)
(3)KDM(KDE提供的Display Manager) - 需要注意的是,LightDM(Light Display Manager)是一个全新的轻量级Linux桌面显示管理器,而传统的Ubuntu是使用GNOME桌面标准的GDM。参考wiki链接: https://wiki.archlinux.org/index.php/LightDM
- 那么X11是什么呢? X11也叫做X Window系统,是图形化窗口管理系统 。它是诞生于Unix 、以及 OpenVMS,是传统上Unix环境中建立图形用户界面 的标准工具包和协议, 也就是说它是一个用于规定X-server设计的协议, 不然千奇百怪的,直接就乱套了, 互不兼容,难以相护借鉴,X.org是其中一个极为优秀的开源方案。
在ubuntu下的桌面环境配置文件
- Ubuntu默认shell为bash,.bashrc即为配置文件,在用户输入完用户名和密码后生效,可添加启动项目。
- LightDM会去读取/etc/profile的来的配置当前账户的环境变量等信息。
- ubuntu默认使用lightDM来作为桌面管理器,桌面管理器会去读取自动启动的配置。自动启动会去读以下相关的配置内容, 来启动相应的程序:
/etc/xdg/autostart
/usr/share/autostart
/usr/share/gdm/autostart
/usr/share/gnome/autostart
~/.config/autostart
~/.kde/share/autostart
~/.local/share/autostart - 可新建文件/usr/share/xsessions/custom.desktop, 用于桌面自动启动的管理:
1 [Desktop Entry] 2 Name=Ubuntu 3 Comment=This session logs you into Ubuntu 4 Exec=gnome-session --session=ubuntu 5 TryExec=unity 6 Icon= 7 Type=Application 8 DesktopNames=Unity 9 X-Ubuntu-Gettext-Domain=gnome-session-3.0
仍存在的问题点:
在rc5.d的启动脚本中,可以看到lightdm已经在启动过程中被启动了? 这样的话, 图形界面就很早启动了,与前面的图解相矛盾, 那么Xorg的启动位置在哪里?
$:/etc/rc5.d $ ls
README S01lvm2-lvmetad S01unattended-upgrades S02anacron S02hddtemp S02rsync S02thermald S03avahi-daemon S04cups S05grub-common S05rc.local
S01apport S01lvm2-lvmpolld S01uuidd S02cron S02irqbalance S02speech-dispatcher S02vsftpd S03bluetooth S04cups-browsed S05ondemand
S01binfmt-support S01rsyslog S02acpid S02dbus S02kerneloops S02ssh S02whoopsie S03lightdm S04saned S05plymouth直接在命令行通过startx命令启动图形窗口,显示出的界面只有壁纸,整体缺失严重? 界面图形显示不全。