startx 及xinit 介绍(经典)
X-server管理鼠标、键盘、显卡、显示器
X-client处理程序的运行
----------------------------------------------------------------------------------------------------
WM管理窗口:移动、变型、关闭、装饰......
----------------------------------------------------------------------------------------------------
DE桌面环境:窗口管理器+面板+文件管理器+配套软件......
----------------------------------------------------------------------------------------------------
发行版:特定内核+特定桌面环境+特定包管理+特定软件源......
----------------------------------------------------------------------------------------------------
互动关系:
X-server(鼠标、键盘)==>X-client解释指令==>X-server(显卡、显示器)
X-server接收指令==>X-client解释指令==>X-server落实指令
X-server<===>WM<===>X-client
----------------------------------------------------------------------------------------------------
startx用法:startx [ [ client ] options ... ] [ -- [ server ] [ display ] options ... ]
----------------------------------------------------------------------------------------------------
startx三种启动方式:
1 指定client和server, 例如:startx /usr/bin/xclock -- /usr/bin/X :0
2 $HOME/.xserverrc启动server,$HOME/.xinitrc启动的client,
3 startx,启动DE
----------------------------------------------------------------------------------------------------
xinit
startx只是一个bash脚本,干活的是xinit
xinit先启动先启动X服务器,再启动基于X的应用程序
----------------------------------------------------------------------------------------------------
startx启动过程:
3.png [ 11.8 KiB | 被浏览 645 次 ]
----------------------------------------------------------------------------------------------------
GNOME启动过程:
0.png [ 52.92 KiB | 被浏览 645 次 ]
----------------------------------------------------------------------------------------------------
openbox启动过程:
1.png [ 30.45 KiB | 被浏览 645 次 ]
----------------------------------------------------------------------------------------------------
XBMC启动过程:
1 xinit
在说明startx之前,我想我们应该先了解一下xinit。因为startx就是通过调用xinit启动X的。
1.1 功能
当我们安装了Ubuntu后,默认就已经安装了xinit,它位于/usr/bin下。xinit是一个二进制文件,并非是一个脚本。它的主要功能是启动一个X服务器,同时启动一个基于X的应用程序。
1.2 用法
1.3 例子
1) xinit /usr/bin/xclock -- /usr/bin/X :0
2) 在HOME下新建.xinitrc文件,并加入以下几行:
xsetroot -solid gray &
xclock -g 50x50-0+0 -bw 0 &
xterm -g 80x24+0+0 &
xterm -g 80x24+0-0 &
twm
当xinit启动时,它会先启动X server,然后启动一个clock,两个xterm,最后启动窗口管理器twm。
最后一个命令不能后台运行,否则所有命令都后台运行的话xinit就会返回退出,同样的,除最后一个命令外都必须后台运行,否则后面的命令将只有在该命令退出后才能运行。
1.4 分析
看到这里,眼尖的人或许早以看出xinit的功能完全可以由脚本来实现,例如要启动X Server 和一个xterm,就像xinit默认启动的那样,只需要在新建一个脚本或在rc.local中加入:
2 startx脚本
用过linux的人基本上都知道linux下有个命令叫做startx,那么它到底是怎么实现的呢?
2.1 功能
当我们在终端下想启动图形界面时,我们都会通过输入startx来实现,该命令可以启动一个Xserver,而且可以启动一个漂亮的图形界面(Ubuntu下,我装的是gnome)。
2.2 用法
2.3 例子
2.4 分析
下面我们来分析一下startx脚本。startx脚本位于/usr/bin下,直接用vim打开我们可以看到它的具体实现如下:
#!/bin/bash #注意:该脚本用的是bash shell解析的
# $Xorg: startx.cpp,v 1.3 2000/08/17 19:54:29 cpqbld Exp $
# This is just a sample implementation of a slightly less primitive
# interface than xinit. It looks for user .xinitrc and .xserverrc
# files, then system xinitrc and xserverrc files, else lets xinit choose
# its default. The system xinitrc should probably do things like check
# for .Xresources files and merge them in, startup up a window manager,
# and pop a clock and serveral xterms.
# Site administrators are STRONGLY urged to write nicer versions.
# $XFree86: xc/programs/xinit/startx.cpp,v 3.16tsi Exp $
sysclientrc=/etc/X11/xinit/xinitrc
sysserverrc=/etc/X11/xinit/xserverrc
defaultclientargs=$userclientrc
elif [ -f $sysclientrc ]; then
defaultclientargs=$sysclientrc
defaultserverargs=$userserverrc
elif [ -f $sysserverrc ]; then
defaultserverargs=$sysserverrc
#将whoseargs变量赋值为字符串“client”,表示当前解析的指定client的参数。
# ‘‘ required to prevent cpp from treating "/*" as a C comment.
if [ "$whoseargs" = "client" ]; then
if [ x"$clientargs" = x ]; then
client="$1" #解析出了用户指定的Client程序
clientargs="$clientargs $1" #解析出了Client的参数
if [ x"$serverargs" = x ]; then
server="$1" #解析出了用户指定的X Server程序
serverargs="$serverargs $1" #解析出了X Server的参数
if [ "$whoseargs" = "client" ]; then
# display must be the FIRST server argument
if [ x"$serverargs" = x ] && /
expr "$1" : ‘:[0-9][0-9]*$‘ > /dev/null 2>&1; then
if [ x"$client" = x ]; then #如果client变量为空,即用户没有指定client。
# if no client arguments either, use rc file instead
client=$defaultclient #如果用户指定了client参数,就将client设定为xterm
if [ x"$server" = x ]; then #如果server变量为空,即用户没有指定server。
# if no server arguments or display either, use rc file instead
server=$defaultserver #如果用户指定了serverargs或display,就将server设定为/usr/bin/X
if [ x"$XAUTHORITY" = x ]; then #如果环境变量XAUTHORITY为空,就设定为$HOME/.Xauthority
# set up default Xauth info for this machine
if hostname --version > /dev/null 2>&1; then #如果hostname命令存在
if [ -z "$hostname" ]; then #如果hostname长度为0,就将hostname变量设定为命令hostname返回的字符串。
# create a file with auth information for the server. ‘:0‘ is a dummy.
xserverauthfile=`mktemp -p /tmp serverauth.XXXXXXXXXX`
trap "rm -f $xserverauthfile" HUP INT QUIT ILL TRAP KILL BUS TERM
xauth -q -f $xserverauthfile << EOF
serverargs=${serverargs}" -auth "${xserverauthfile}
# now add the same credentials to the client authority file
# if ‘$displayname‘ already exists do not overwrite it as another
# server man need it. Add them to the ‘$xserverauthfile‘ instead.
for displayname in $authdisplay $hostname$authdisplay; do
authcookie=`xauth list "$displayname" /
| sed -n "s/.*$displayname[[:space:]*].*[[:space:]*]//p"` 2>/dev/null;
if [ "z${authcookie}" = "z" ] ; then
removelist="$displayname $removelist"
xauth -q -f $xserverauthfile << EOF
#下面的语句通过xinit启动X server和Clients。
xinit $client $clientargs -- $server $display $serverargs
if [ x"$removelist" != x ]; then
if [ x"$xserverauthfile" != x ]; then
if command -v deallocvt > /dev/null 2>&1; then
deallocvt #释放所有未使用的虚拟终端的核心内存和数据结构
2.5 总结
3 startx默认启动过程
通过以上对startx脚本的分析,我们知道了startx的基本的启动流程,但是到目前为止,我们还不知道仅仅在终端输入startx是怎么样启动gnome那漂亮的桌面的,下面我们来看一下其启动过程。
3.1 startx的几种启动方式
由对startx脚本的分析,我们可以知道startx主要有三种启动方式:
a)、一种是自己指定要启动的client和server, 例如:startx /usr/bin/xclock -- /usr/bin/X :0;
b)、一种是通过在$HOME下新建.xinitrc文件来指定要启动的多个client和.xserverrc来指定要启动的server(注意:这两个文件本来是不存在的);
c)、还有一种是直接输入startx而不指定参数,这也就是我们启动gnome桌面的方法。这里
而/etc/X11/xinit/xinitrc文件的内容如下所示:
#!/bin/bash #注意:该脚本用的是bash shell解析的
# $Xorg: xinitrc.cpp,v 1.3 2000/08/17 19:54:30 cpqbld Exp $
# global xinitrc file, used by all X sessions started by xinit (startx)
# invoke global X session script
. /etc/X11/Xsession #在当前这个shell环境中执行Xsession脚本
而X Server的启动则是通过系统文件/etc/X11/xinit/xserverrc来指定的,这个文件的内容为:
#!/bin/sh #注意:该脚本用的是Bourne shell解析的
# $Id: xserverrc 189 2005-06-11 00:04:27Z branden $
exec /usr/bin/X11/X -nolisten tcp
3.2 Xsession
#!/bin/sh #注意:该脚本用的是Bourne shell解析的
# global Xsession file -- used by display managers and xinit (startx)
# $Id: Xsession 967 2005-12-27 07:20:55Z dnusinow $
set –e #打开errexit选项,该选项表示:如果下面有命令返回的状态非0,则退出程序。
# pretty-print messages of arbitrary length; use xmessage if it
# is available and $DISPLAY is set
echo "$MESSAGE" | fold -s -w ${COLUMNS:-80} >&2
if [ -n "$DISPLAY" ] && which xmessage > /dev/null 2>&1; then
echo "$MESSAGE" | fold -s -w ${COLUMNS:-80} | xmessage -center -file -
# pretty-print messages of arbitrary length (no trailing newline); use
# xmessage if it is available and $DISPLAY is set
echo -n "$MESSAGE" | fold -s -w ${COLUMNS:-80} >&2;
if [ -n "$DISPLAY" ] && which xmessage > /dev/null 2>&1; then
echo -n "$MESSAGE" | fold -s -w ${COLUMNS:-80} | xmessage -center -file -
# exit script with error; essentially a "THIS SHOULD NEVER HAPPEN" message
# One big call to message() for the sake of xmessage; if we had two then
# the user would have dismissed the error we want reported before seeing the
"Please report the installed version of the /"x11-common/"" /
"package and the complete text of this error message to" /
"<debian-x@lists.debian.org>."
# initialize variables for use by all session scripts
OPTIONFILE=/etc/X11/Xsession.options
SYSRESOURCES=/etc/X11/Xresources
USRRESOURCES=$HOME/.Xresources
SYSSESSIONDIR=/etc/X11/Xsession.d
USERXSESSIONRC=$HOME/.xsessionrc
ALTUSERXSESSION=$HOME/.Xsession
ERRFILE=$HOME/.xsession-errors
# attempt to create an error file; abort if we cannot
if (umask 077 && touch "$ERRFILE") 2> /dev/null && [ -w "$ERRFILE" ] &&
elif ERRFILE=$(tempfile 2> /dev/null); then
if ! ln -sf "$ERRFILE" "${TMPDIR:=/tmp}/xsession-$USER"; then
message "warning: unable to symlink /"$TMPDIR/xsession-$USER/" to" /
"/"$ERRFILE/"; look for session log/errors in" /
errormsg "unable to create X session log/error file; aborting."
# truncate ERRFILE if it is too big to avoid disk usage DoS
if [ "`stat -c%s /"$ERRFILE/"`" -gt 500000 ]; then
tail -c 500000 "$ERRFILE" > "$T" && mv -f "$T" "$ERRFILE" || rm -f "$T"
echo "$PROGNAME: X session started for $LOGNAME at $(date)"
# sanity check; is our session script directory present?
#如果/etc/X11/Xsession.d不存在或不是一个目录则打印错误信息并退出。
if [ ! -d "$SYSSESSIONDIR" ]; then
errormsg "no /"$SYSSESSIONDIR/" directory found; aborting."
# Attempt to create a file of non-zero length in /tmp; a full filesystem can
# cause mysterious X session failures. We do not use touch, :, or test -w
# because they won‘t actually create a file with contents. We also let standard
# error from tempfile and echo go to the error file to aid the user in
# determining what went wrong.
if ! echo "*" >>"$WRITE_TEST"; then
message "warning: unable to write to ${WRITE_TEST%/*}; X session may exit" /
# use run-parts to source every file in the session directory; we source
# instead of executing so that the variables and functions defined above
# are available to the scripts, and so that they can pass variables to each
#将/etc/X11/Xsession.d目录中的所有文件都读出,并存入SESSIONFILES变量中。
SESSIONFILES=$(run-parts --list $SYSSESSIONDIR)
#如果SESSIONFILES变量中的字符串不为空,即/etc/X11/Xsession.d中有文件存在
if [ -n "$SESSIONFILES" ]; then
for SESSIONFILE in $SESSIONFILES; do
. $SESSIONFILE #在当前shell环境下执行该文件
从以上的对Xsession脚本文件的分析,可以看出,Xsession脚本仅仅是执行了/etc/X11/Xsession.d目录下的所有文件,在该目录下,文件包括:
50x11-common_determine-startup
每个文件名都以数字开头,这主要是为了确保这些脚本的执行顺序,run-parts会将数字小的排在前面,这样就能确保以上文件能按数字由小到大的顺序执行。
该文件主要是调用xrdb来将/etc/X11/Xresources目录下及$HOME/.Xresources目录下的文件的内容来设置根窗口的屏幕 0 上的RESOURCE_MANAGER属性的内容。
该文件主要是判断$HOME/.xsessionrc文件是否存在,如果存在则执行该脚本文件。
4、50x11-common_determine-startup
用xdg-user-dirs-update自动生成$HOME下的文件夹,该命令主要是根据/etc/xdg/user-dirs.defaults文件的内容来为用户创建文件夹的。
gnome-session则是启动GNOME桌面环境的,这个程序一般被登入管理器gdm、xdm和脚本startx调用。(gnome-session如何启动桌面,待研究)
4 startx启动过程小结
startx 及xinit 介绍(经典)相关推荐
- startx 及xinit 介绍
X-server管理鼠标.键盘.显卡.显示器 X-client处理程序的运行 ------------------------------------------------------------- ...
- 自我介绍php一句话,面试自我介绍经典语句,经典一句话自我介绍
传统式: 达拿都斯,男,身高1.76M,体重110,初二,未婚(晕~),无不良嗜好,思想健康,好学上进,爱好编程.打篮球.打乒乓球,擅长多种乐器. 震撼式: 我乃:英俊潇洒.风流倜傥.玉树临风.年少多 ...
- linux startx xinit
startx启动过程分析 startx 及xinit 介绍(经典) startx启动过程 startx用法: startx [ [ client ] options ... ] [ -- [ serv ...
- 操作系统 - startx/xinit
了解startx/xinit 1.概述 用户可以通过 xinit 程序手动启动 Xorg 显示服务器,startx脚本是 xinit 的前端. xinit 通常用在启动 X 时执行窗口管理器 ...
- 时间序列分析及应用r语言pdf_R语言:时间序列经典分析法(二)
题记:本文是个人的读书笔记,仅用于学习交流使用.本文将深入研究时间序列技术. 01 解决什么问题? 前面一章,介绍了时间序列中涉及到的基本概念,本章将在此基础上介绍如何对时间序列的资料进行分析,怎么选 ...
- 排序算法java 简书_史上最全经典排序算法总结(Java实现)
查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗,只要熟悉了思想,灵活运用也不是难事.一般在 ...
- java 3 9 2 6数字排序_GitHub - JourWon/sort-algorithm: 史上最全经典排序算法总结(Java实现)...
史上最全经典排序算法总结(Java实现) 查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗, ...
- startx 启动过程
/usr/bin/startx,脚本 20 userclientrc=$HOME/.xinitrc21 sysclientrc=/etc/X11/xinit/xinitrc22 23 24 users ...
- ubuntu 启动、退出 startx界面
使用的是ubuntu-focal 20.04 桌面版.因为在熟悉使用ubuntu出现这个问题. 启动startx 1.首先要了解ubuntu几种运行级(参考init_百度百科),ubuntu桌面版默 ...
最新文章
- 【视频课】8小时系统性地掌握深度学习视频分类与行为识别理论+实践
- C. Longest Simple Cycle
- 设置html按钮点击事件无效果,css怎么设置按钮不能点击?
- 绘制扇形的多种方式,包括border-radius、clip裁剪显示、canvas原点变换等方式的详细理解及demo
- IT 架构之学习教材 -WSSRA
- [NSUserDefaults]的使用:登陆后不再显示登录界面。
- 重写ArrayAdapter
- html不存在模板,模板文件不存在,无法解析文档的解决方法
- 氚云后台代码-创建、更新子表以及发送消息
- 减肥记(减肥topic总结篇)
- 已知某分页系统,主存容量为 64K 字节,页面大小为 1K,对一个 4 页大的作 业,其 0、1、2、3 页分别被分配到主存的 2、4、6、7 块中,试:将十进制的逻 辑地址 1023、2500、35
- 发现一个美女,在黑夜中独自YY.
- python爬取百度天气接口【实战记录】
- 常见的agv控制系统及功能有哪些?
- 前方高能,这个语音转文字转换器超实用
- 通达信指标转python_通达信转python
- java安装有错误码咋办_java编程出现的错误对应的解决方法
- 利用组合模式来实现组件处理器的工程实践
- 小鲨鱼在51nod小学
- Qt5 bug error c2001: 常量中有换行符
热门文章
- 2021年中国互联网企业100强(附名单)
- 26_ue4进阶末日生存游戏开发[僵尸添加动画和扣血效果]
- 零知识证明 SNARKs C++库:libsnark教程
- 图像描述(image caption)历年突破性论文总结
- mailgun php版本,如何使用mailgun php API仅向bcc发送邮件?
- yum是干什么的_刨根问底:什么是yum源,yum的工作原理又是什么
- oracle数据库字符集US7ASCII,在java中处理中文问题
- 上了一堂健身课,27岁程序员尿尿像酱油!
- 四、青龙面板 Nvjdc(诺兰)安装教程
- 风控决策引擎——决策流路径规划