但还未搞清楚gnome是怎么起来的!gnome当然属于X client了,看上面启动过程第(3)步。
这里分两种情况看吧,第一种是用系统的xinitrc文件。看/etc/X11/xinit/xinitrc文件。里面只包含了. /etc/X11/Xsession一句话。接着看/etc/X11/Xsession这个脚本,只看关键部分吧。最后面有:
if [ -n "$SESSIONFILES" ]; then
for SESSIONFILE in $SESSIONFILES; do
. $SESSIONFILE
done
fi
exit 0
接着看run_parts(),位于本文件中间:
# until run-parts --noexec is implemented
if [ -z "$1" ]; then
internal_errormsg "run_parts() called without an argument."
fi
if [ ! -d "$1" ]; then
internal_errormsg "run_parts() called, but \"$1\" does not exist or is" \
"not a directory."
fi
for F in $(ls $1); do
if expr "$F" : '[[:alnum:]_-]\+$' > /dev/null 2>&1; then
if [ -f "$1/$F" ]; then
echo "$1/$F"
fi
fi
done
}
大概意思就是run_parts () 把$SYSSESSIONDIR目录下的文件名取出来赋值给$SESSIONFILES,然后循环运行该目录下的文件。看看该目录,即 /etc/X11/Xsession.d目录,可以看到几个以数字开头的文件,实际上这些数值就表示了这几个文件被运行的优先级,数字小的优先级高,因为在上面的run_parts () 里是用ls命令显示该目录下的文件,所以前面数字小的被ls时显示在前面,所以被
. $SESSIONFILE
done
这个for循环执行时也先被执行。看到/etc/X11/Xsession.d目录下有个55gnome-session_gnomerc文件,里面提到了STARTUP变量。然后运行:
/etc/X11/Xsession.d $ grep STARTUP *
看到50xfree86-common_determine-startup文件。里面有
if [ -x /usr/bin/x-session-manager ]; then
STARTUP=x-session-manager
elif [ -x /usr/bin/x-window-manager ]; then
STARTUP=x-window-manager
elif [ -x /usr/bin/x-terminal-emulator ]; then
STARTUP=x-terminal-emulator
fi
fi
即设置启动程序,实际上设置STARTUP变量,如果以上程序都没有找到,则会报错退出,即X环境没有被启动。再运行
/etc/X11/Xsession.d$ grep STARTUP *
看到优先级最低也即最后被运行的99xfree86-common_start文件,里面只有一句话:
好了,到这里就启动X client了。总结下这第一种方式的启动过程,简单的说就是依次顺序查找/usr/bin/x-session-manager ,x-window-manager,/usr/bin/x-terminal-emulator 这三个文件。如果存在则启动之,也即X client。如果三个都不存在则报错退出了。看/usr/bin/x-session-manager文件可以看到是个符号连接,最终连接到 /usr/bin/gnome-session,也就是gnome 了。至于在gnome 启动时可能会设置启动输入法等程序,那就归gnome-session管了。可以试着把/usr/bin/x-session- manager 改为指向xfce4-session(如果安装了的话) ,再startx就会启动xfce4环境了。
下面看第二种情况,即用户目录的 xinitrc文件$HOME/.xinitrc。对比hiweed-debian-desktop_0.55_i386,存在$ HOME/.xinitrc文件,在里面有exec xfce4-session。故其X client可以说最主要的x-session-manger是从$HOME/.xinitrc启动的。也就不会经过上面第一种情况的执行过程了。
xinit 程序同时启动X server和X client,这在单机上还可。要是位于网络上的两台电脑分别是client和server,则xinit就无能为力了。这时就得靠纯“手工”来启动X 了。下面简单的“手工”启动X server和X client:在CUI模式下运行命令:
X :1&
看到了一个灰色的全屏幕和一个鼠标指针,这就是X server了,其屏幕编号为1。下面构造X client,按Ctrl+Alt+F1回到刚才的CUI(Ctrl+Alt+F7对应本机的第一个启动的X server,Ctrl+Alt+F8对应第二个,有人说F7对应屏幕编号为0的X server实际上是不对的,如果第一个启动的屏幕编号为1,第二个启动的编号为0,则F7对应1屏幕,F8对应0屏幕),运行命令: xeyes -display localhost:1&
然后按Ctrl+Alt+F7,将看到X client也就是xeyes。再回到CUI,运行
X&
开启一个屏幕编号0的X server,CUI下再运行
xterm&
这时Ctrl+Alt+F7对应屏幕编号1;而F8对应屏幕编号0,且其X client为xterm。先退出上面的两个X server,下面复杂点手动启动gnome;首先
X&
然后
gnome-session
看到的就和用startx 启动的X一样了,这时X server是X这个程序,X client是gnome-session及其启动的窗口管理器等程序
对于X Window System,搞清楚X server与X client关系很重要。一般X server很简单,就是/usr/bin/X11/X程序;X client则花样繁多,从高级的CDE,GNOME,KDE,到低级一点的只有twm,Window Maker,blackbox等窗口管理器,再到最简陋的只有xterm,rxvt,xeyes等单个x程序。正是由于X client的各种搭配,使得的X Window System看起来多样化。
三) 跨网络运行X Window System
一般用来做服务器的系统(Linux,FreeBSD,Solaris等等) 都不会装X server,甚至很多都没有显示器。这样可以在这些系统里安装简单的X client,以GUI的方式远程显示在管理员们所坐的X server里。一般在本地机器起个X server,然后ssh或telnet上运行X client程序显示在本地显示器上,当然,也可用XDMCP(X Display Manager Control Protocol),man xsession里提到/etc/X11/Xsession一般被startx或display manager调用,但有的display manager只调用Xsession而不是xinitrc,故为了startx和display manager两种方式下都可正常启动GUI,最好把X client启动的程序放在Xsession文件里。远程运行X client程序需要设置DISPLAY环境变量,设置为 主机名称:屏幕编号(如192.168.1.2:0,则表示X server是192.168.1.2这台机器上的0号屏幕);或是给X client程序加个—display参数。
1) Windows系统做X server
a) 用ssh或telnet方式
Windows下面的X server软件有很多种,例如X-win32。在Windows里运行X-win32程序,则相当于本地机器是个X server。远程登录上Debian,运行:
export DISPLAY=192.168.1.2:0
xterm&
这时即在Windows里的X server里看到了xterm了,至于X client还运行什么程序就看你的需要了,文件管理器阿,资源查看器,gnome-session等。当然,这里X-win32要设置好授权,好像默认是禁止接入控制。
b) XDMCP方式
常见的Display Manager有xdm,gdm,kdm等。需要修改gdm的配置文件/etc/X11/gdm/gdm.conf,修改[xdmcp]段的Enable=true,使得可以远程登录,在X client运行gdm。
在X-win32里建一个XDMCP的session,查询方式,填入IP为运行gdm的机器地址。连接,即可看到登录界面)
2) Linux与Linux互联
a) ssh或telnet方式
在linux 本地起个X server,需要注意授权问题,建立文件/etc/X0.hosts,填入X client的IP192.168.1.1,其中X0.hosts表示本地第0个屏幕允许连接的X client地址,建立X1.hosts文件则是本地第1个屏幕允许连接的X client地址,以此类推,man xserver里有。运行
X&
运行该程序时别加-nolisten参数,否则不会在网络上侦听。
这个时候Ctrl+Alt+F7是X server,返回Ctrl+Alt+F1还可以ssh上X client机器上。
然后登录上X client,运行
xterm –display 192.168.1.2:0
即可在本地的X server里看到xterm了,如果有的话,还可把gnome-session也显示在本地来。
b) XDMCP方式
在X client里运行gdm(别忘了修改gdm.conf),然后在本地X server的CUI下面运行X -query 192.168.1.1(X client开gdm机器的地址)。
在linux 里的VMware里做的测试: 在Ctrl+Alt+F1的CUI下正常运行startx&启动GUI,这时 Ctrl+Alt+F7即为X server,X client启动的gnome,然后在这里运行VMware打开Debian虚拟机,并运行gdm。然后回到Ctrl+Alt+F1,运行X :1 -query 192.168.1.1。看到登录界面了吧。这时Ctrl+Alt+F7为我的0号屏幕,里面运行了虚拟机。Ctrl+Alt+F8为1号屏幕,在远程 GUI登录X client。相当于在本地起了两个X server。









评论人