综合startX

X-server管理鼠标、键盘、显卡、显示器
X-client处理程序的运行

WM管理窗口:移动、变型、关闭、装饰…
Windows manager,窗口管理器是一个特殊的图形应用程序,它对其他图行程序运行的窗口进行管理,为窗口提供装饰(标题栏、边框等)、对窗口操作提供支持(改变大小、移动、重叠)。许多窗口管理器还提供了虚拟桌面、鼠标手势等功能。Xserver一般只允许一个窗口管理器运行。如果没有窗口管理器,图行程序也可以运行的,但只有最新运行的程序在最上端,并且全屏显示,无法窗口切换

DE桌面环境:窗口管理器+面板+文件管理器+配套软件…
桌面环境(desktop),这是一个容易和窗口管理器混淆的概念。桌面环境一般自带一个窗口管理器,并提供更多的实用程序。如方便管理的控制中心、文件管理等。
发行版:特定内核+特定桌面环境+特定包管理+特定软件源…

X display manager(XDM、gdm、wdm),Display manager对多个Xserver进行管理(本地的或远程的)。Linux 机器如果以级别5启动,进入的用户登陆界面就是display manager,用户输入用户名和密码,display manager就会启动本地的Xserver,初始化一个x会话,一般还通过xsession启动本地的窗口管理器和桌面环境。如果在配置文件里设置xdmcp=true,display manager还可以通过xdmcp协议管理远程的Xserver。当在windows机器上使用Xmanager登陆linux/unix机器时,其实是用xdmcp协议登录的,用户同样输入用户名/密码登陆,xdm启动一个x会话,不过这次的Xserver是在远程的机器上。

互动关系:
X-server(鼠标、键盘)>X-client解释指令>X-server(显卡、显示器)
X-server接收指令==>X-client解释指令==>X-server落实指令
X-server<=>WM<=>X-client
xserver为图行程序提供显示服务,并接受用户界面输入,把输入事件交给图行程序(可以是windows manager)处理,并能创建、映射、删除视窗以及在视窗中写和绘图

startx用法:startx [ [ client ] options … ] [ – [ server ] [ display ] options … ]

startx三种启动方式:
1 指定client和server, 例如:startx /usr/bin/xclock – /usr/bin/X :0
2 H O M E / . x s e r v e r r c s e r v e r , HOME/.xserverrc启动server, HOME/.xinitrc启动的client,
3 startx,启动DE

xinit
startx只是一个bash脚本,干活的是xinit
xinit先启动先启动X服务器,再启动基于X的应用程序

Xfree86就是这样一个去根据法规实现协议的"交警"。实现X协议的软件也并不只有 XFree86,XFree86只是实现X协议的一个免费X服务器软件。商业上常用MOTIF,现在还有XORG,还有很多很小的由爱好者写的小的X服务 器软件。甚至可以在WINDOWS上有X服务器运行,这样你可以在linux系统上运行一个X应用程序然后在另一台windows系统上显示在LINUX上最常用的是XFree86(现在的linux发行版都用Xorg了)。苹果电脑的图形界面用的也是X协议,而且被认为是做的最好的X协 议图形界面,并且他对X协议的实施是做在系统内核里的,所以性能明显好很多,这就是为什么很多大型三维图形设计软件都是在苹果平台上的原因。
既然是协议,那么肯定和平台无关的,因此可以让X应用程序显示在任何装有X服务器的远程计算机上。甚至显示在装有Xnest服务器的windows系 统上。只不过在大多数情况下,X应用程序都用本机的X服务器,然后X服务器将显示结果输出到本机的显示器。这也是很多人不理解X是一种协议的原因。
X和X11R6又是什么关系?
不知道初学者有没有注意到/usr/X11R6这个目录,这是XFree的默认安装目录。X11R6 实际上是X Protocol version 11 Release 6(X协议第11版第六次发行)的意思。不同版本的X协议是不能通信的,不过不用担心,现在的X服务器软件和X应用程序都遵循X11R6
X服务器和WM(window manager 窗口管理器)之间是什么关系
平时大家起动图形界面是怎么启动的呢? 如果一开始就进入图形界面,可打开一个XTERM输入init 3,就可以安全的回到字符界面。
先输入以下命令: # startx 起动图形界面,你看到的是一个和平时使用一样的完整的图形界面操作环境。你可以最大化,最小化,移动,关闭窗口等。
按ctrl+alt+backspace反回字符界面。输入:#xinit,再次启动图形界面,你看到一个XTERM。而且不能移动。但是你可以在这 个XTERM中输入命令打开X应用程序,如果我输入:#mozilla 打开浏览器,你看到的浏览器和平时有什么不同吗?他在屏幕中间,不能移动,不能最小化,不能最大化,没有边框。
为什么同样一个X应用程序会有这样的不同呢?因为我们用startx起动图形界面的时候同时也启动了一个WM(即窗口管理器),如果你用KDE就起动 了 KDE,如果你用GNOME就起动了GNOME。但是你用xinit起动图形界面的时候却没有起动WM。现在你明白窗口管理器的作用了吗?他的作用就是最 大化,最小化,移动,关闭窗口等。而这些不是X服务器来负责完成的。
如果你用xinit起动图形界面并在xterm中输入twm,看看会有什么?xterm被加上了一个边框,你可以通过这个边框移动,最大化,最小化这 个xterm,twm就是XFree86中自带的窗口管理器,是一个比较简陋的最简单的窗口管理器,但是他具有窗口管理器的全部特征。如果你不输入twm 而输入gnome-session就可以起动GNOME 或者输入startkde起动KDE
另外在其它UNIX系统中,常常使用CDE作为这样一个环境。
其它的小型窗口管理器有: window maker,after step,blackbox,fvwm,fvwm2,等等都是常用的优秀窗口管理器。REDHAT9中有window maker 但是默认不安装,大家可以装来试试。只要xinit再wmaker & 就可以用windowmaker了

startx
1 xinit
在说明startx之前,我想我们应该先了解一下xinit。因为startx就是通过调用xinit启动X的。
1.1 功能
当我们安装了Ubuntu后,默认就已经安装了xinit,它位于/usr/bin下。xinit是一个二进制文件,并非是一个脚本。它的主要功能是启动一个X服务器,同时启动一个基于X的应用程序。
1.2 用法
xinit的用法为:xinit [[client] options ] [-- [server] [display] options]。其中client用于指定一个基于X的应用程序,client后面的options是传给这个应用程序的参数,server是用于指定启动哪个X服务器,一般为/usr/bin/X或/usr/bin/Xorg,display用于指定display number,一般为0,表示第一个display,option为传给server的参数。
如果不指定client,xinit会查找HOME(环境变量)目录下的.xinitrc文件,如果存在这个文件,xinit直接调用execvp函数执行该文件。如果这个文件不存在,那么client及其options为: xterm -geometry +1+1 -n login -display :0 。
如果不指定server,xinit会查找HOME(环境变量)目录下的.xserverrc文件,如果存在这个文件,xinit直接调用execvp函数执行该文件。如果这个文件不存在,那么server及其display为: X :0。如果系统目录中不存在X命令,那么我们需要在系统目录下建立一个名为X的链接,使其指向真正的X server命令(Ubuntu下为Xorg)。
1.3 例子
下面是几个关于xinit应用的例子:

  1.  xinit /usr/bin/xclock -- /usr/bin/X :0
    

该例子将启动X server, 同时将会启动xclock。请注意指定client或server时,需要用绝对路径,否则xinit将因无法区别是传给xterm或server的参数还是指定的client或server而直接当成是参数处理。
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中加入:
X&
export DISPLAY=:0.0
xterm
这个实现完全正确,然而却并没有完全实现xinit所具有的功能,xinit所有的一项功能就是当最后一个启动的client(如上面第二个例子中的twm窗口管理器)退出后,X服务器也会退出。而我们的脚本实现中当我们退出xterm后并不会退出X server。
2 startx脚本
用过linux的人基本上都知道linux下有个命令叫做startx,那么它到底是怎么实现的呢?
2.1 功能
当我们在终端下想启动图形界面时,我们都会通过输入startx来实现,该命令可以启动一个Xserver,而且可以启动一个漂亮的图形界面(Ubuntu下,我装的是gnome)。
2.2 用法
Startx的用法和xinit的基本一样:startx [ [ client ] options … ] [ – [ server ] options … ]。为什么呢?这是因为startx其实就是一个脚本,它启动X server就是通过调用xinit命令实现的,startx的参数将全部传给xinit。因此,这些参数的意义和xinit的参数是一样的。
2.3 例子
下面是两个关于startx命令的简单例子:
1) startx – -depth 16
该例子主要是以16位色启动X 服务器。
2) startx – -dpi 100
该例子主要是以100的dpi启动X 服务器。
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 $

#下面主要是对一些变量进行赋值。
userclientrc=$HOME/.xinitrc
sysclientrc=/etc/X11/xinit/xinitrc

userserverrc=$HOME/.xserverrc
sysserverrc=/etc/X11/xinit/xserverrc
defaultclient=xterm
defaultserver=/usr/bin/X
defaultclientargs=""
defaultserverargs=""
clientargs=""
serverargs=""

#下面的语句主要是说:如果 H O M E / . x i n i t r c d e f a u l t c l i e n t a r g s HOME/.xinitrc文件存在,并且不是一个目录,那么就将defaultclientargs赋值为 HOME/.xinitrc,否则,如果/etc/X11/xinit/xinitrc存在并且不是一个目录,就将defaultclientargs赋值为/etc/X11/xinit/xinitrc。

if [ -f u s e r c l i e n t r c ] ; t h e n d e f a u l t c l i e n t a r g s = userclientrc ]; then defaultclientargs= userclientrc
elif [ -f s y s c l i e n t r c ] ; t h e n d e f a u l t c l i e n t a r g s = sysclientrc ]; then defaultclientargs= sysclientrc
fi

#下面的语句主要是说:如果 H O M E / . x s e r v e r r c d e f a u l t c l i e n t a r g s HOME/.xserverrc文件存在,并且不是一个目录,那么就将defaultclientargs赋值为 HOME/.xserverrc,否则,如果/etc/X11/xinit/xserverrc存在并且不是一个目录,就将defaultclientargs赋值为/etc/X11/xinit/xserverrc。
if [ -f u s e r s e r v e r r c ] ; t h e n d e f a u l t s e r v e r a r g s = userserverrc ]; then defaultserverargs= userserverrc
elif [ -f s y s s e r v e r r c ] ; t h e n d e f a u l t s e r v e r a r g s = sysserverrc ]; then defaultserverargs= sysserverrc
fi
#将whoseargs变量赋值为字符串“client”,表示当前解析的指定client的参数。
whoseargs=“client”
#当startx的一个参数不为空时就进入while循环。
while [ x"$1" != x ]; do
case “KaTeX parse error: Expected 'EOF', got '#' at position 11: 1" in #̲ ‘‘ required to…whoseargs” = “client” ]; then
if [ x"$clientargs" = x ]; then
client=“KaTeX parse error: Expected 'EOF', got '#' at position 4: 1" #̲解析出了用户指定的Client…clientargs KaTeX parse error: Expected 'EOF', got '#' at position 5: 1" #̲解析出了Client的参数 …serverargs” = x ]; then
server=“KaTeX parse error: Expected 'EOF', got '#' at position 5: 1" #̲解析出了用户指定的X Serv…serverargs KaTeX parse error: Expected 'EOF', got '#' at position 4: 1" #̲解析出了X Server的参数…whoseargs” = “client” ]; then
clientargs="$clientargs KaTeX parse error: Expected 'EOF', got '#' at position 15: 1" else #̲ display must b…serverargs" = x ] && /
expr " 1 &quot; : : [ 0 9 ] [ 0 9 ] 1&quot; : ‘:[0-9][0-9]* ‘ > /dev/null 2>&1; then
display=“KaTeX parse error: Expected 'EOF', got '#' at position 4: 1" #̲解析出display …serverargs $1”
fi
fi
;;
esac #case语句结束
shift #将参数列表左移一位,即解析下个参数.
done

process client arguments

if [ x"KaTeX parse error: Expected 'EOF', got '#' at position 21: …t" = x ]; then #̲如果client变量为空,即用…clientargs" = x ]; then #如果用户没有指定client参数 就将client设为前面设定的默认的rc文件(为 H O M E / . x i n i t r c / e t c / X 11 / x i n i t / x i n i t r c c l i e n t = &quot; HOME/.xinitrc,或/etc/X11/xinit/xinitrc) client=&quot; defaultclientargs"
else
client=$defaultclient #如果用户指定了client参数,就将client设定为xterm
fi
fi

process server arguments

if [ x"KaTeX parse error: Expected 'EOF', got '#' at position 21: …r" = x ]; then #̲如果server变量为空,即用…serverargs" = x -a x"KaTeX parse error: Expected 'EOF', got '#' at position 22: …y" = x ]; then #̲如果serverargs为空,…HOME/. xserverrc,或/etc/X11/xinit/ xserverrc)
server=" d e f a u l t s e r v e r a r g s &quot; e l s e s e r v e r = defaultserverargs&quot; else server= defaultserver #如果用户指定了serverargs或display,就将server设定为/usr/bin/X
fi
fi

if [ x"KaTeX parse error: Expected 'EOF', got '#' at position 25: …Y" = x ]; then #̲如果环境变量XAUTHORIT…HOME/.Xauthority
XAUTHORITY=$HOME/.Xauthority
export XAUTHORITY
fi

removelist=

set up default Xauth info for this machine

check for GNU hostname

if hostname --version > /dev/null 2>&1; then #如果hostname命令存在
if [ -z “hostname --version 2>&1 | grep GNU” ]; then #如果hostname –version中不包含GNU 就将hostname变量设定为命令hostname –f返回的字符串。
hostname=hostname -f
fi
fi
if [ -z "KaTeX parse error: Expected 'EOF', got '#' at position 19: …tname" ]; then #̲如果hostname长度为0,…{display:-:0}
mcookie=/usr/bin/mcookie
dummy=0

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 x s e r v e r a u t h f i l e &lt; &lt; E O F a d d : xserverauthfile &lt;&lt; EOF add : dummy . m c o o k i e E O F s e r v e r a r g s = mcookie 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 h o s t n a m e hostname authdisplay; do
authcookie=xauth list "$displayname" / | sed -n "s/.*$displayname[[:space:]*].*[[:space:]*]//p" 2>/dev/null;
if [ “z${authcookie}” = “z” ] ; then
xauth -q << EOF
add $displayname . m c o o k i e E O F r e m o v e l i s t = &quot; mcookie EOF removelist=&quot; displayname r e m o v e l i s t &quot; e l s e d u m m y = removelist&quot; else dummy= (($dummy+1));
xauth -q -f x s e r v e r a u t h f i l e &lt; &lt; E O F a d d : xserverauthfile &lt;&lt; EOF add : dummy . a u t h c o o k i e E O F f i d o n e e c h o &quot; c l i e n t = authcookie EOF fi done echo &quot;client= client,clientargs=$clientargs,server= $server, display= d i s p l a y , s e r v e r a r g s = display, serverargs= serverargs"

#下面的语句通过xinit启动X server和Clients。
xinit $client $clientargs – $server $display $serverargs

if [ x"$removelist" != x ]; then
xauth remove r e m o v e l i s t f i i f [ x &quot; removelist fi if [ x&quot; xserverauthfile" != x ]; then
rm -f $xserverauthfile
fi
if command -v deallocvt > /dev/null 2>&1; then
deallocvt #释放所有未使用的虚拟终端的核心内存和数据结构
fi

2.5 总结
由以上对startx脚本的分析,我们可以知道:startx将会先解析用户的参数,如果该用户指定了该参数(即解析结果不为空),那么startx就会以该参数来启动xinit,否则就会解析(与其说是解析,还不如说是执行)$HOME目录下的rc文件,如果该文件不存在,就会解析系统目录下(/etc/X11/xinit/)的rc文件,如果这个文件也不存在,那startx就将以默认的client(xterm)和server(/usr/bin/X)为参数来启动xinit。

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桌面的方法。这里我们主要介绍最后一种启动方法。
在c这种启动方法中,我们可以知道,startx脚本会先去看系统目录(/etc/X11/xinit/)下的rc文件是否存在,如果不存在就会用默认的xterm和/usr/bin/X来启动xinit。显然,startx启动的不是xterm,而是gnome桌面,因此gnome的启动是通过系统文件/etc/X11/xinit/xinitrc来指定的。
而/etc/X11/xinit/xinitrc文件的内容如下所示:
#!/bin/bash #注意:该脚本用的是bash shell解析的

$Xorg: xinitrc.cpp,v 1.3 2000/08/17 19:54:30 cpqbld Exp $

/etc/X11/xinit/xinitrc

global xinitrc file, used by all X sessions started by xinit (startx)

invoke global X session script

. /etc/X11/Xsession #在当前这个shell环境中执行Xsession脚本
因此,gnome的启动应该在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
下面是Xsession脚本的内容:
#!/bin/sh #注意:该脚本用的是Bourne shell解析的

/etc/X11/Xsession

global Xsession file – used by display managers and xinit (startx)

$Id: Xsession 967 2005-12-27 07:20:55Z dnusinow $

set –e #打开errexit选项,该选项表示:如果下面有命令返回的状态非0,则退出程序。
PROGNAME=Xsession
#下面四个是信息输出函数,可以不管
message () {

pretty-print messages of arbitrary length; use xmessage if it

is available and $DISPLAY is set

MESSAGE="$PROGNAME: &quot; e c h o &quot; *&quot; echo &quot; MESSAGE" | fold -s -w KaTeX parse error: Expected 'EOF', got '&' at position 16: {COLUMNS:-80} >&̲2 if [ -n "DISPLAY" ] && which xmessage > /dev/null 2>&1; then
echo “$MESSAGE” | fold -s -w ${COLUMNS:-80} | xmessage -center -file -
fi
}
message_nonl () {

pretty-print messages of arbitrary length (no trailing newline); use

xmessage if it is available and $DISPLAY is set

MESSAGE="$PROGNAME: &quot; e c h o n &quot; *&quot; echo -n &quot; MESSAGE" | fold -s -w KaTeX parse error: Expected 'EOF', got '&' at position 16: {COLUMNS:-80} >&̲2; if [ -n "DISPLAY" ] && which xmessage > /dev/null 2>&1; then
echo -n “$MESSAGE” | fold -s -w ${COLUMNS:-80} | xmessage -center -file -
fi
}
errormsg () {

exit script with error

message “$*”
exit 1
}
internal_errormsg () {

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

request to report it.

errormsg “$*” /
“Please report the installed version of the /“x11-common/”” /
“package and the complete text of this error message to” /
[email protected].”
}

initialize variables for use by all session scripts

OPTIONFILE=/etc/X11/Xsession.options
SYSRESOURCES=/etc/X11/Xresources
USRRESOURCES= H O M E / . X r e s o u r c e s S Y S S E S S I O N D I R = / e t c / X 11 / X s e s s i o n . d U S E R X S E S S I O N = HOME/.Xresources SYSSESSIONDIR=/etc/X11/Xsession.d USERXSESSION= HOME/.xsession
USERXSESSIONRC= H O M E / . x s e s s i o n r c A L T U S E R X S E S S I O N = HOME/.xsessionrc ALTUSERXSESSION= HOME/.Xsession
ERRFILE=$HOME/.xsession-errors

attempt to create an error file; abort if we cannot

if (umask 077 && touch “KaTeX parse error: Expected 'EOF', got '&' at position 24: …) 2> /dev/null &̲& [ -w "ERRFILE” ] &&
[ ! -L “ E R R F I L E &quot; ] ; t h e n c h m o d 600 &quot; ERRFILE&quot; ]; then chmod 600 &quot; ERRFILE”
elif ERRFILE= ( t e m p f i l e 2 &gt; / d e v / n u l l ) ; t h e n i f ! l n s f &quot; (tempfile 2&gt; /dev/null); then if ! ln -sf &quot; ERRFILE" “ T M P D I R : = / t m p / x s e s s i o n {TMPDIR:=/tmp}/xsession- USER”; then
message “warning: unable to symlink /“ T M P D I R / x s e s s i o n TMPDIR/xsession- USER/” to” /
“/“ E R R F I L E / &quot; ; l o o k f o r s e s s i o n l o g / e r r o r s i n &quot; / &quot; / &quot; ERRFILE/&quot;; look for session log/errors in&quot; / &quot;/&quot; TMPDIR/xsession-$USER/”.”
fi
else
errormsg “unable to create X session log/error file; aborting.”
fi

truncate ERRFILE if it is too big to avoid disk usage DoS

if [ “stat -c%s /"$ERRFILE/"” -gt 500000 ]; then
T=mktemp -p "$HOME"
tail -c 500000 “ E R R F I L E &quot; &gt; &quot; ERRFILE&quot; &gt; &quot; T” && mv -f “ T &quot; &quot; T&quot; &quot; ERRFILE” || rm -f “ T &quot; f i e x e c &gt; &gt; &quot; T&quot; fi exec &gt;&gt;&quot; ERRFILE” 2>&1
echo “$PROGNAME: X session started for $LOGNAME at $(date)”

sanity check; is our session script directory present?

#如果/etc/X11/Xsession.d不存在或不是一个目录则打印错误信息并退出。
if [ ! -d “ S Y S S E S S I O N D I R &quot; ] ; t h e n e r r o r m s g &quot; n o / &quot; SYSSESSIONDIR&quot; ]; then errormsg &quot;no /&quot; SYSSESSIONDIR/” directory found; aborting."
fi

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.

WRITE_TEST= ( t e m p f i l e ) i f ! e c h o &quot; &quot; &gt; &gt; &quot; (tempfile) if ! echo &quot;*&quot; &gt;&gt;&quot; WRITE_TEST"; then
message “warning: unable to write to KaTeX parse error: Expected '}', got 'EOF' at end of input: …ror" fi rm -f "WRITE_TEST”

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

other

#将/etc/X11/Xsession.d目录中的所有文件都读出,并存入SESSIONFILES变量中。
SESSIONFILES=$(run-parts --list KaTeX parse error: Expected 'EOF', got '#' at position 16: SYSSESSIONDIR) #̲如果SESSIONFILES变…SESSIONFILES" ]; then
set +e #关闭errexit选项
for SESSIONFILE in $SESSIONFILES; do
. KaTeX parse error: Expected 'EOF', got '#' at position 13: SESSIONFILE #̲在当前shell环境下执行该文…HOME/.Xresources目录下的文件的内容来设置根窗口的屏幕 0 上的RESOURCE_MANAGER属性的内容。
3、40x11-common_xsessionrc
该文件主要是判断 H O M E / . x s e s s i o n r c 4 50 x 11 c o m m o n d e t e r m i n e s t a r t u p / e t c / X 11 / X s e s s i o n . o p t i o n s 使 x s e s s i o n / e t c / X 11 / X s e s s i o n . o p t i o n s a l l o w u s e r x s e s s i o n HOME/.xsessionrc文件是否存在,如果存在则执行该脚本文件。 4、50x11-common_determine-startup 该文件主要先查看配置文件/etc/X11/Xsession.options中是否允许使用用户的xsession,如果/etc/X11/Xsession.options中存在allow-user-xsession字段,则查看 HOME/.xsession是否存在并有执行权限,如果是,则将STARTUP变量设置为该文件,如果没有执行权限就将STARTUP变量设置为“sh 该xsession文件”。如果此时STARTUP变量仍然为空,则将其设置为x-session-manager,x-window-manager或x-terminal-emulator。注意:这个STARTUP将会在后面的脚本中被启动。
5、55gnome-session_gnomerc
该文件会先得到STARTUP的basename,如:STARTUP=/usr/bin/x-session-manager,则其basename为x-session-manager。再判断该basename 是否为gnome-session,或者为x-session-manager并且x-session-manager是个符号链接,它指向/usr/bin/gnome-session,如果是则执行$HOME/.gnomerc(如果该文件存在并且可读)。
6、60seahorse
将STARTUP重新赋值为“/usr/bin/seahorse-agent S T A R T U P s e a h o r s e a g e n t s e a h o r s e G N O M E s e a h o r s e a g e n t s e a h o r s e 7 60 x d g u s e r d i r s u p d a t e x d g u s e r d i r s u p d a t e STARTUP”,这个可能只是为安全考虑才这么做的,具体的我也不是很清楚,只是看了一下seahorse-agent的帮助,知道seahorse是一个GNOME的应用程序,它用于为用户的输入进行暂时的安全存储,而seahorse-agent则是seahorse的一个代理而已。 7、60xdg-user-dirs-update 用xdg-user-dirs-update自动生成 HOME下的文件夹,该命令主要是根据/etc/xdg/user-dirs.defaults文件的内容来为用户创建文件夹的。
8、80im-switch
该文件主要用于设置输入法。具体的请自己参考文件内容。
9、90-console-kit
如果环境变量$XDG_SESSION_COOKIE为空,并且/usr/bin/ck-launch-session可执行,则将STARTUP重新赋值为” /usr/bin/ck-launch-session S T A R T U P c k l a u n c h s e s s i o n s e s s i o n 10 90 x 11 c o m m o n s s h a g e n t / e t c / X 11 / X s e s s i o n . o p t i o n s 使 s s h a g e n t / e t c / X 11 / X s e s s i o n . o p t i o n s u s e s s h a g e n t / u s r / b i n / s s h a g e n t STARTUP”。至于ck-launch-session的功能,我也不是很清楚,估计是和session有关。 10、90x11-common_ssh-agent 该文件主要先查看配置文件/etc/X11/Xsession.options中是否使用ssh agent,如果/etc/X11/Xsession.options中存在use-ssh-agent字段,则判断/usr/bin/ssh-agent是否可执行,并且环境变量 SSH_AUTH_SOCK和$SSH2_AUTH_SOCK是否都为空,如果是,这将STARTUP重新赋值为” /usr/bin/ssh-agent S T A R T U P 11 99 x 11 c o m m o n s t a r t e x e c STARTUP”。 11、99x11-common_start 它仅仅是用exec启动 STARTUP。关于exec,在Bourne shell中,它与fork的区别就在于它执行一个新的脚本不需创建sub-shell,而它与Source和Dot的区别就在与在这条语句后面的语句将不会再被执行。此时,我们可以发现变量$STARTUP的值为:“startup=/usr/bin/ssh-agent /usr/bin/ck-launch-session /usr/bin/seahorse-agent --execute x-session-manager”, 因此,最终将会被执行的就是这么一条语句。而x-session-manager在Ubuntu8.04中仅仅是个符号链接,它最终指向的是gnome-session。
gnome-session则是启动GNOME桌面环境的,这个程序一般被登入管理器gdm、xdm和脚本startx调用。(gnome-session如何启动桌面,待研究)

4 startx启动过程小结
综上所述,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这个用于启动GNOME桌面环境的程序

**较新版本的linux系统都已经没有xorg.conf文件,但是有时候为了对显示做微调或为了支持多屏显示等原因,还需要手工生成一个xorg.conf,然后根据情况做些修改设置。这种情况下我们如何有一个基本的xorg.conf模板呢?当然可以从网上去找一个,然后手工修改,但是还有一种方式可以生成xorg.conf,而且更符合你实际的系统环境,步骤如下:

  1. 在命令行下切换到root身份;
  2. 执行命令“ cp /var/log/Xorg.0.log /var/log/Xorg.1.log";
  3. 执行命令” Xorg -configure :1";
  4. 执行命令3后 xorg.conf.new 在 /root/ 目录下生成,该文件可以做为当前系统的xorg.conf的基本模板使用了**

猜你喜欢

转载自blog.csdn.net/seaship/article/details/89172580
今日推荐