From:? http://blog.csdn.net/hustwarhd/article/details/3069066
startx 啟動過程分析
?
?
JiananHe
09/19/2008
?
目錄
1 ????? xinit
1.1 ?????? 功能
1.2 ?????? 用法
1.3 ?????? 例子
1.4 ?????? 分析
2 ????? startx 腳本
2.1 ?????? 功能
2.2 ?????? 用法
2.3 ?????? 例子
2.4 ?????? 分析
2.5 ?????? 總結(jié)
3 ????? startx 默認啟動過程
3.1 ?????? startx 的幾種啟動方式
3.2 ?????? Xsession
4 ????? startx 啟動過程小結(jié)
?
1 ??????? xinit
在說明 startx 之前,我想我們應該先了解一下 xinit 。因為 startx 就是通過調(diào)用 xinit 啟動X的。
1.1 ???? 功能
當我們安裝了 Ubuntu 后,默認就已經(jīng)安裝了 xinit ,它位于 /usr/bin 下。 xinit 是一個二進制文件,并非是一個腳本。它的主要功能是啟動一個 X 服務器,同時啟動一個基于 X 的應用程序。
1.2 ???? 用法
xinit 的用法為: xinit [[client] options ] [-- [server] [display] options] 。其中 client 用于指定一個基于 X 的應用程序, client 后面的 options 是傳給這個應用程序的參數(shù), server 是用于指定啟動哪個 X 服務器,一般為 /usr/bin/X 或 /usr/bin/Xorg , display 用于指定 display number ,一般為0,表示第一個 display , option 為傳給 server 的參數(shù)。
?
如果不指定 client , xinit 會查找 HOME (環(huán)境變量)目錄下的 .xinitrc 文件,如果存在這個文件, xinit 直接調(diào)用 execvp 函數(shù)執(zhí)行該文件。如果這個文件不存在,那么 client 及其 options 為: ?xterm -geometry +1+1 -n login -display :0? 。
?
如果不指定 server , xinit 會查找HOME(環(huán)境變量)目錄下的 .xserverrc 文件,如果存在這個文件, xinit 直接調(diào)用execvp函數(shù)執(zhí)行該文件。如果這個文件不存在,那么 server 及其display為:?X :0。如果系統(tǒng)目錄中不存在X命令,那么我們需要在系統(tǒng)目錄下建立一個名為X的鏈接,使其指向真正的X? server 命令(Ubuntu下為Xorg)。
?
1.3 ???? 例子
下面是幾個關(guān)于 xinit 應用的例子:
1) ?????? xinit /usr/bin/xclock -- /usr/bin/X :0
該例子將啟動X? server ,?同時將會啟動xclock。請注意指定client或 server 時,需要用絕對路徑,否則 xinit 將因無法區(qū)別是傳給xterm或 server 的參數(shù)還是指定的client或 server 而直接當成是參數(shù)處理。
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的功能完全可以由腳本來實現(xiàn),例如要啟動X? Server ?和一個xterm,就像xinit默認啟動的那樣,只需要在新建一個腳本或在rc.local中加入:
X&
export DISPLAY=:0.0
xterm
這個實現(xiàn)完全正確,然而卻并沒有完全實現(xiàn) xinit 所具有的功能, xinit 所有的一項功能就是當最后一個啟動的client(如上面第二個例子中的twm窗口管理器)退出后,X服務器也會退出。而我們的腳本實現(xiàn)中當我們退出xterm后并不會退出X? server 。
?
?
2 ??????? startx 腳本
用過linux的人基本上都知道linux下有個命令叫做startx,那么它到底是怎么實現(xiàn)的呢?
2.1 ???? 功能
當我們在終端下想啟動圖形界面時,我們都會通過輸入startx來實現(xiàn),該命令可以啟動一個X server ,而且可以啟動一個漂亮的圖形界面(Ubuntu下,我裝的是gnome)。
2.2 ???? 用法
Startx的用法和 xinit 的基本一樣: startx ?[ [? client ?]? options ?... ] [? -- ?[? server ?]? options ?... ]。為什么呢?這是因為startx其實就是一個腳本,它啟動X? server 就是通過調(diào)用 xinit 命令實現(xiàn)的,startx的參數(shù)將全部傳給 xinit 。因此,這些參數(shù)的意義和 xinit 的參數(shù)是一樣的。
2.3 ???? 例子
下面是兩個關(guān)于startx命令的簡單例子:
1) ?? startx -- -depth 16
該例子主要是以16位色啟動X?服務器。
2) ?? startx -- -dpi 100
該例子主要是以100的dpi啟動X?服務器。
2.4 ???? 分析
下面我們來分析一下startx腳本。startx腳本位于/usr/bin下,直接用vim打開我們可以看到它的具體實現(xiàn)如下:
?
#!/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=""
?
#下面的語句主要是說:如果$HOME/.xinitrc文件存在,并且不是一個目錄,那么就將defaultclientargs賦值為$HOME/.xinitrc,否則,如果/etc/X11/xinit/xinitrc存在并且不是一個目錄,就將defaultclientargs賦值為/etc/X11/xinit/xinitrc。
?
if [ -f $userclientrc ]; then
????defaultclientargs=$userclientrc
elif [ -f $sysclientrc ]; then
????defaultclientargs=$sysclientrc
?
?
?
?
?
?
fi
?
#下面的語句主要是說:如果$HOME/.xserverrc文件存在,并且不是一個目錄,那么就將defaultclientargs賦值為$HOME/.xserverrc,否則,如果/etc/X11/xinit/xserverrc存在并且不是一個目錄,就將defaultclientargs賦值為/etc/X11/xinit/xserverrc。
?
if [ -f $userserverrc ]; then
????defaultserverargs=$userserverrc
elif [ -f $sysserverrc ]; then
????defaultserverargs=$sysserverrc
fi
#將whoseargs變量賦值為字符串“client”,表示當前解析的指定client的參數(shù)。
whoseargs="client"
#當startx的一個參數(shù)不為空時就進入while循環(huán)。
while [ x"$1" != x ]; do
????case "$1" in
????# '' required to prevent cpp from treating "/*" as a C comment.
????/''*|/./''*)
?if [ "$whoseargs" = "client" ]; then
?????if [ x"$clientargs" = x ]; then
??client="$1" #解析出了用戶指定的Client程序
?????else
??clientargs="$clientargs $1"??#解析出了Client的參數(shù)
?????fi
?else
?????if [ x"$serverargs" = x ]; then
??server="$1"??#解析出了用戶指定的X Server程序
?????else
??serverargs="$serverargs $1" #解析出了X Server的參數(shù)
?????fi
?fi
?;;
????--)????#遇到“- -”就解析server
?whoseargs="server"
?;;
????*)
?if [ "$whoseargs" = "client" ]; then
?????clientargs="$clientargs $1"
?else
?????# display must be the FIRST server argument
?????if [ x"$serverargs" = x ] && /
???expr "$1" : ':[0-9][0-9]*$' > /dev/null 2>&1; then
??display="$1" #解析出display
?????else
??serverargs="$serverargs $1"
?????fi
?fi
?;;
????esac?????#case語句結(jié)束
shift??#將參數(shù)列表左移一位,即解析下個參數(shù).
done
?
# process client arguments
if [ x"$client" = x ]; then #如果client變量為空,即用戶沒有指定client。
????# if no client arguments either, use rc file instead
????if [ x"$clientargs" = x ]; then #如果用戶沒有指定client參數(shù)?就將client設(shè)為前面設(shè)定的默認的rc文件(為$HOME/.xinitrc,或/etc/X11/xinit/xinitrc)
?client="$defaultclientargs"
????else
?client=$defaultclient #如果用戶指定了client參數(shù),就將client設(shè)定為xterm
????fi
fi
?
# process server arguments
if [ x"$server" = x ]; then #如果server變量為空,即用戶沒有指定server。
????# if no server arguments or display either, use rc file instead
????if [ x"$serverargs" = x -a x"$display" = x ]; then #如果serverargs為空,并且display為空,就將server設(shè)為前面設(shè)定的默認的rc文件(為$HOME/. xserverrc,或/etc/X11/xinit/ xserverrc)
?server="$defaultserverargs"
????else
?server=$defaultserver?#如果用戶指定了serverargs或display,就將server設(shè)定為/usr/bin/X
????fi
fi
?
if [ x"$XAUTHORITY" = x ]; then #如果環(huán)境變量XAUTHORITY為空,就設(shè)定為$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變量設(shè)定為命令hostname –f返回的字符串。
??hostname=`hostname -f`
???????fi
fi
?
if [ -z "$hostname" ]; then #如果hostname長度為0,就將hostname變量設(shè)定為命令hostname返回的字符串。
hostname=`hostname`
fi
?
authdisplay=${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 $xserverauthfile << EOF
add :$dummy . $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 $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 . $mcookie
EOF
?removelist="$displayname $removelist"
????else
????????dummy=$(($dummy+1));
????????xauth -q -f $xserverauthfile << EOF
add :$dummy . $authcookie
EOF
????fi
done
echo "client=$client,clientargs=$clientargs,server= $server, display= $display, serverargs=$serverargs"
?
# 下面的語句通過xinit 啟動X server 和Clients 。
xinit $client $clientargs -- $server $display $serverargs
?
?
if [ x"$removelist" != x ]; then
????xauth remove $removelist
fi
if [ x"$xserverauthfile" != x ]; then
????rm -f $xserverauthfile
fi
?
?
?
?
?
if command -v deallocvt > /dev/null 2>&1; then
????deallocvt??#釋放所有未使用的虛擬終端的核心內(nèi)存和數(shù)據(jù)結(jié)構(gòu)
fi
?
?
2.5 ???? 總結(jié)
由以上對 startx 腳本的分析,我們可以知道: startx 將會先解析用戶的參數(shù),如果該用戶指定了該參數(shù)(即解析結(jié)果不為空),那么 startx 就會以該參數(shù)來啟動 xinit ,否則就會解析(與其說是解析,還不如說是執(zhí)行) $HOME 目錄下的 rc 文件,如果該文件不存在,就會解析系統(tǒng)目錄下( /etc/X11/xinit/ )的 rc 文件,如果這個文件也不存在,那 startx 就將以默認的 client ( xterm )和 server ( /usr/bin/X )為參數(shù)來啟動 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 而不指定參數(shù),這也就是我們啟動 gnome 桌面的方法。這里
?
我們主要介紹最后一種啟動方法。
?
在c這種啟動方法中,我們可以知道, startx 腳本會先去看系統(tǒng)目錄( /etc/X11/xinit/ )下的 rc 文件是否存在,如果不存在就會用默認的 xterm 和 /usr/bin/X 來啟動 xinit 。顯然, startx 啟動的不是 xterm ,而是 gnome 桌面,因此 gnome 的啟動是通過系統(tǒng)文件 /etc/X11/xinit/xinitrc 來指定的。
?
而 /etc/X11/xinit/xinitrc 文件的內(nèi)容如下所示:
?
#!/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環(huán)境中執(zhí)行Xsession腳本
?
?
因此, gnome 的啟動應該在Xsession里。
?
而X Server的啟動則是通過系統(tǒng)文件 /etc/X11/xinit/xserverrc 來指定的,這個文件的內(nèi)容為:
?
#!/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腳本的內(nèi)容:
#!/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選項,該選項表示:如果下面有命令返回的狀態(tài)非0,則退出程序。
?
PROGNAME=Xsession
?
#下面四個是信息輸出函數(shù),可以不管
message () {
??# pretty-print messages of arbitrary length; use xmessage if it
??# is available and $DISPLAY is set
??MESSAGE="$PROGNAME: $*"
??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 -
??fi
}
?
message_nonl () {
??# pretty-print messages of arbitrary length (no trailing newline); use
??# xmessage if it is available and $DISPLAY is set
??MESSAGE="$PROGNAME: $*"
??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 -
??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" /
???????????"<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
USERXSESSION=$HOME/.xsession
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" ] &&
??[ ! -L "$ERRFILE" ]; then
??chmod 600 "$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" /
?????????????"/"$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 "$ERRFILE" > "$T" && mv -f "$T" "$ERRFILE" || rm -f "$T"
fi
?
exec >>"$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 "$SYSSESSIONDIR" ]; then
??errormsg "no /"$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=$(tempfile)
if ! echo "*" >>"$WRITE_TEST"; then
??message "warning: unable to write to ${WRITE_TEST%/*}; X session may exit" /
??????????"with an error"
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 $SYSSESSIONDIR)
#如果SESSIONFILES變量中的字符串不為空,即/etc/X11/Xsession.d中有文件存在
if [ -n "$SESSIONFILES" ]; then
??set +e #關(guān)閉errexit選項
??for SESSIONFILE in $SESSIONFILES; do
????. $SESSIONFILE #在當前shell環(huán)境下執(zhí)行該文件
??done
??set –e #打卡errexit選項
fi
exit 0
?
從以上的對Xsession腳本文件的分析,可以看出,Xsession腳本僅僅是執(zhí)行了/etc/X11/Xsession.d目錄下的所有文件,在該目錄下,文件包括:
20x11-common_process-args
30x11-common_xresources
40x11-common_xsessionrc
50x11-common_determine-startup
55gnome-session_gnomerc
60seahorse
60xdg-user-dirs-update
80im-switch
90-console-kit
90x11-common_ssh-agent
99x11-common_start
?
每個文件名都以數(shù)字開頭,這主要是為了確保這些腳本的執(zhí)行順序,run-parts會將數(shù)字小的排在前面,這樣就能確保以上文件能按數(shù)字由小到大的順序執(zhí)行。
?
1、20x11-common_process-args
????這個文件主要是處理傳給/etc/X11/xinit/ xinitrc腳本文件的參數(shù)的。該參數(shù)個數(shù)只能為0或一個,否則將不進行任何處理。如果該參數(shù)是failsafe,則該腳本將執(zhí)行x-terminal-emulator,否則就執(zhí)行該參數(shù)。需要說明的是,x-terminal-emulator是一個符號鏈接,指向/etc/alternatives/x-terminal-emulator,同時,/etc/alternatives/x-terminal-emulator也是一個符號鏈接,它指向/usr/bin/gnome-terminal.wrapper,而gnome-terminal.wrapper則是一個perl腳本,它最終是調(diào)用了gnome-terminal。
?
2、30x11-common_xresources
????該文件主要是調(diào)用xrdb來將/etc/X11/Xresources目錄下及$HOME/.Xresources目錄下的文件的內(nèi)容來設(shè)置根窗口的 屏幕?0?上的 RESOURCE_MANAGER 屬性的內(nèi)容。
?
3、40x11-common_xsessionrc
????該文件主要是判斷$HOME/.xsessionrc文件是否存在,如果存在則執(zhí)行該腳本文件。
?
4、50x11-common_determine-startup
????該文件主要先查看配置文件/etc/X11/Xsession.options中是否允許使用用戶的xsession,如果/etc/X11/Xsession.options中存在allow-user-xsession字段,則查看$HOME/.xsession是否存在并有執(zhí)行權(quán)限,如果是,則將STARTUP變量設(shè)置為該文件,如果沒有執(zhí)行權(quán)限就將STARTUP變量設(shè)置為“sh?該xsession文件”。如果此時STARTUP變量仍然為空,則將其設(shè)置為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,如果是則執(zhí)行$HOME/.gnomerc(如果該文件存在并且可讀)。
?
6、60seahorse
???將STARTUP重新賦值為“/usr/bin/seahorse-agent $STARTUP”,這個可能只是為安全考慮才這么做的,具體的我也不是很清楚,只是看了一下seahorse-agent的幫助,知道seahorse是一個 GNOME的應用程序,它用于為用戶的輸入進行暫時的安全存儲,而 seahorse-agent 則是 seahorse 的一個代理而已。
?
7、60xdg-user-dirs-update
???用xdg-user-dirs-update自動生成$HOME下的文件夾,該命令主要是根據(jù)/etc/xdg/user-dirs.defaults文件的內(nèi)容來為用戶創(chuàng)建文件夾的。
?
8、80im-switch
???該文件主要用于設(shè)置輸入法。具體的請自己參考文件內(nèi)容。
?
9、90-console-kit
???如果環(huán)境變量$XDG_SESSION_COOKIE為空,并且/usr/bin/ck-launch-session可執(zhí)行,則將STARTUP重新賦值為” /usr/bin/ck-launch-session $STARTUP”。至于ck-launch-session的功能,我也不是很清楚,估計是和session有關(guān)。
?
10、90x11-common_ssh-agent
???該文件主要先查看配置文件/etc/X11/Xsession.options中是否使用ssh agent,如果/etc/X11/Xsession.options中存在use-ssh-agent字段,則判斷/usr/bin/ssh-agent是否可執(zhí)行,并且環(huán)境變量$SSH_AUTH_SOCK和$SSH2_AUTH_SOCK是否都為空,如果是,這將STARTUP重新賦值為” /usr/bin/ssh-agent $STARTUP”。
?
11、99x11-common_start
????它僅僅是用exec啟動$STARTUP。關(guān)于exec,在Bourne shell中,它與fork的區(qū)別就在于它執(zhí)行一個新的腳本不需創(chuàng)建sub-shell,而它與Source和Dot的區(qū)別就在與在這條語句后面的語句將不會再被執(zhí)行。此時,我們可以發(fā)現(xiàn)變量$STARTUP的值為:“startup=/usr/bin/ssh-agent??/usr/bin/ck-launch-session /usr/bin/seahorse-agent --execute x-session-manager”,?因此,最終將會被執(zhí)行的就是這么一條語句。而x-session-manager在Ubuntu8.04中僅僅是個符號鏈接,它最終指向的是gnome-session。
????gnome-session則是啟動GNOME桌面環(huán)境的,這個程序一般被登入管理器gdm、xdm和腳本startx調(diào)用。(gnome-session如何啟動桌面,待研究)
?
?
?
4 ??????? startx 啟動過程小結(jié)
綜上所述, startx 的默認啟動過程為: startx 調(diào)用并將系統(tǒng)文件 /etc/X11/xinit/xinitrc 和 /etc/X11/xinit/xserverrc ?作為參數(shù)傳給 xinit , xinit 就會先執(zhí)行系統(tǒng)文件 /etc/X11/xinit/xserverrc 以啟動 X Server ,然后執(zhí)行 /etc/X11/xinit/xinitrc ,而xinitrc則會執(zhí)行腳本 /etc/X11/Xsession ,而 Xsession 則會按順序調(diào)用執(zhí)行 /etc/X11/Xsession.d 目錄下的文件,從而最終調(diào)用了 gnome-session 這個用于啟動 GNOME 桌面環(huán)境的程序。
更多文章、技術(shù)交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
