LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 14687|回复: 11

启动你的X Window System

[复制链接]
发表于 2003-3-10 12:16:25 | 显示全部楼层 |阅读模式
这是一篇有关xdm/gdm/kdm的一些讨论,我看了一些文献(有些文献名和作者名都不记得了,请原谅),同时也结合自己的一些经验,如果有些地方说得不对,请见量。
有关X Winow System的一些概念,你还是找相关的文献来看吧,我的目标就是讨论下如何设置和启动你的X Windows System。首先你要懂得如何配置你的X配置的文件/etc/X11/XF86Config(or XF86Config-4),这个文件配置和它的配置工具不在讨论的行列中。
   
    好多天前,我看了xdm/gdm/kdm这方面的东西,也看了些它们的man页,当然也找了点相关的资料来look look,虽然我还不很了解,但还是知道了一些,拿出来献丑了。呵呵,我的原则就是:好东西大家一起分享。

1、我们先不讨论xdm/gdm/kdm这些东西。而是先看看启动X最简直的方式。首先来认识两个重要的文件,一个是X视窗启动文件--xinitrc,另外一个就是X视窗资源文件--Xdefaults.

[1]X视窗启动文件--xinitrc

   事实上,我们一般执行startx来启动X Window System,其中startx就是xinit的前端界面[front-end].倘若我们以startx或xinit启动X,这指令会启动X server并且会执行$HOME/.xinitrc文件内的所设置的指令。倘若 $HOME没有这个文件,则系统会使用内定的的配置文件/usr/XR116/lib/X11/xinit/xinitrc。而事实上xinitrc文件一般只包含有启动X时所要执行clients的shell script,里面定义一些指令和shell script,让X启动时,可以遵照里面的shell script来启动必要的应用程序。例如我的简单而又实用的的$HOME/.xinitrc的内容如下:



  1. # more .xinitrc
  2. LANG=zh_CN.GB2312
  3. LC_ALL=zh_CN.GB2312
  4. LC_CTYPE=zh_CN.GB2312
  5. KDE_LANG=zh_CN.GB2312
  6. export LANG LC_ALL LC_CTYPE KDE_LANG
  7. export XMODIFIERS=@im=Chinput
  8. /usr/bin/chinput &
  9. exec kde3
  10. killall chinput
  11. #

复制代码


对于更为详细的$HOME/.xinitrc,你可以找更专业的书籍来看,我的目标是越简单越好。前面的大家应该都比较清楚吧。先设一些环境变量,再设下一些输入法(我用的是智能五笔), 接下来是启动视窗管理程序kde3,注意了:kde3用shell script的exec描述所执行的,这造成执行xinit程序的shell会被执行kde3的shell所取代。所以一旦kde3程序结束,就会跳出shell,相对地,xinit将会跟着结束,X Server将关闭。这正是X Window Manager执行的方式。必须确定在.xinitrc中最后执行的是指令是以exec为开头的的命令执行X Windows Manager,而且不应该加上&放在一些背景执行,不然,那些指令也毫无意义。后面的killall chinput是告诉要结束chinput,不然极有可能会因为chinput的原因,会造成一些问题。这是最为简单的桌面设置。倘若你还要启动更多的程序和设置,都可以在前面加的。只要你在你的$HOME/.xinitrc文件中稍加增加便可做到,但要记住加在X Window Manager执行段落之前。


[2]X视窗资源文件--Xdefaults

在X的文献中,resources有两种意义。第一种是指被server管理或建立桌面应用程序使用的东西,例如:视窗、光标、字体等均属于这种意义。另外的一种又是指一种可以传递预设置值、参数和其它值给应用程序的方法,比如,可以定义视窗的大小、前景颜色、显示字体、快捷键等。而在X Window System的操作应用过程中,泛指的resources的意义也局限于第二种,主要是采用resources功能。在X Window System 的资源文件Xdefaults中,主要是设置合适自己喜欢的应用程序的操作操控环境或界面。一般会执行X后,会自动读取$HOME/.Xdefaults.具体的内容我在这里不给出,因为这个东西我感觉还不是很重要。以后有时间的话再详细写写这个东西。

呵呵,在xterm视窗中按有一个小技巧:你按住Ctrl+鼠标右键会跳出一些字体等设置的东西,按住Ctrl+鼠标左键会跳出显示xterm应用程序的主菜单。另外,除了.Xdefaults资源可用处,还有一些应用程序会自己产生的的资源文件,一般放在
/usr/XR116/lib/X11/app-defaults中,并以这些程序名称的大写文件名命名。比如,Xclok时钟程序的资源文件就是Xclock。其它的你自己看一下就会明白了。你可以直接修改这些应用程序的的资源文件,作为系统内定的应用程序的样式。不一定都要非得修改.Xdefaults来完成。因为.Xdefaults通常是个人爱好而使用环境来设置的东西。

个人的一些小经验,不知道对否?如果$HOME中存在.xsession这个文件而没有.xinitrc这个文件是,你用startx启动也会读取.xsession,但当存在这两个文件是,就会读取.xsinitrc这个文件。可能是它优先的原因吧(知道的出来说说吧)。


2、启动我们的X Window System

X Window System的启动方法很多,最学常用的还是上面得到的startx,除此外,还要先执行"X"启动X视窗系统,或者执行xinit启动X。现在的发行版本一般都是以xdm(X Display Manager)/gdm(GNOME Display Manager)/kdm(KDE Display Manager)启动X,让Linux系统一启动就立即进入X Window System,并以图形模式让用用户来登录(呵呵,像Ms Windows吧,这样启动起来)。倘若你想退出X Window Manager,你可以xterm中执行init 3离开。

[1]以xinit/startx来启动X

这是一般的方法:我在Debain也是经常以这种方式来启动X的。就是执行/usr/XR116/bin/startx.事实上这个方法就是与直接执行/usr/X11R6/bin/xinit或是/usr/X11R6/bin/X是无异的。差别在于xinit和"X"并不会去执行读取读资源文件而去执行X Window Manager,所以一般的情况你得到的X视窗系统是个非常简朴的的一个X型鼠标指针与简朴的xterm而已。但xinit就是最标准的X启动方法,估计是绝大部分的系统X Window System都会支持。它是X Window System核心的程序,而startx仅是个启动xinit的shell script而已,里面同样定义执行xinit命令以启动X视窗系统。当一般执行startx时,X启动的过程大约就是这些东西了:

1)xinit启动X server程序;

2)X server会寻找$HOME/.xinintrc文件,有就执行它,没有就会转到/etc/X11/xinit/xinitrc读取系统内定的启动文件。

3)接着就会读取$HOME/.Xdefaults,倘若没有,就会转到/usr/X11/xinit/Xcilents。从文件名Xclients看来,这个是用来设置时执行哪些X应用的程序的文件。性质和xinitrc类似,同样是个shell script。但要注意的是:.Xdefaults是的权限具有755,即可执行。

4)在正常的情况下,$HOME/.xinintrc是用来指派可以让X Window System正常运行的应用程序了。而.Xdefaults则被建议用来载入X资源设置和应用应用,以适合每个用户本身的喜爱程度而已。

5)X server建立一个属于它自己的根视窗(Root windows),并设置视窗的背景与执行所指定的应用程序,显示一个大的"X"光标,便完成启动了。

6)在X server执行的期间,它一直控制着你的鼠标的键盘。

这就是你能在屏幕上移动光标的原因,但由于目前还没有任何X client程序要求键盘和鼠标的输入。所以X server只是和鼠标一直移动而已。而其它的键盘或鼠标输入虽然都经过X server处理,但均被视为无作用(因为没有什么x clinet程序所接收)。这也是X启动的初期,按键盘或鼠标都没有反应的原因。但如果你是送信号能X server而X client的话,这下就有会作用了。比如:Ctrl+Alt+Backspace即是送给X Server的中断信号,当X启动到中途或者是执行时,只要按下这组合键,便会立即结束X server,跳回到command prompt terminal的状态。

7)接下来,在xinitrc唤起X server后,xinit会启动xterm程序。呵呵,xterm就是X Window terminal的缩写吧。它对X server而言是一个X Clietn程序而已。要求X server建立一个视窗,而且会行告知X server在这个视窗中的鼠标和键盘的输入状态(Event),因而启动xterm时便会视窗执行一个shell,内定的就是bash。当指标被移至视窗之内时,xterm便准备接受输入。键盘输入会被关到xterm中的shell就如同真的终端机输入一般。而从shell本身或其副程序的输出则借着xterm显示在视窗上,xterm也接受输入,便得你能设置不同的程序操作参数和进行文本的一些操作,比如copy或paste.对于这些操作,你可以通过在xterm中执行ps auxw命令来观察到系统执行这些命令的详细步骤。

[2]以xdm/gdm来启动你的X。

上面说到了以startx来启动你的X,也可通过xdm/gdm来启动你的X来启动你的X,这正是其它一些发行版本的采用的方式。比如Redhat是gdm,而Mandrake用kdm。一般的情况,如果你要用调整你系统的run-level。比如修改你的/etc/inittab,把id:3:initdefault中的3改为5。

当系统以xdm/gdm来启动X Windows System。大约的步骤就是这些了:

1)执行/etc/X11/xdm/Xserver启动X出现console登录的界面(是执行/etc/X11/xdm/GiveConsole&TakeConsole所产生的)

2)执行/etc/X11/xdm/Xsessions来启动xdm或者是gdm。如果启动的是xdm,则装入用户家目录上的配置文件,.xsession和.Xclients。如果是gdm,则装载入/etc/X11/gdm/Sesseion与.Xclients。到此为止,就会出现X视窗的登录的界面选项。

3)gdm则会检查/etc/X11/gdm/Session目录的Session操作。比如Fvwm,Wmaker,Default,Failsafe,Gnome,Kde与Default等。并将显示给用户选择进入那个那个X Window Manager。其实这些Sessions都是Shell Script file。如果你选择Kde,就进入KDE DeskTop environment,选择Gnome就会进入GNOME  DeskTop environment了。

4)用户如果选择是的Gnome,在输入用户名和password后,gdm GNOME Session就会找gnomerc script,$HOME/.gnomerc,如果没有这个文件,就会读会系统文件内定的GNOME resource file:/etc/X11/gdm/gnomerc,并且启动/usr/bin/gnome-session.

这就完成了一个xdm/gdm的过程。但细心的人会发现,startx会读取$HOME/.xinitrc,而xdm/gdm为什么不会读取这个呢,它又是如何设置根视窗口背景及你的logo和X Window Manager的呢。其中的原因是因为xdm/gdm改用了/etc/X11/xdm/Setup_0来设置的,例如我的Mandrake90的内容大致如下:

  1. # more Xsetup_0
  2. #!/bin/sh
  3. # (C) MandrakeSoft
  4. # Chmouel Boudjnah <chmouel@mandrakesoft.com>
  5. #
  6. # $Id: Xsetup_0,v 1.8 2001/09/19 18:49:29 flepied Exp $

  7. if [ -f /etc/profile.d/kde.sh ];then

  8. . /etc/profile.d/kde.sh
  9. fi

  10. [ -z "$KDEDIR" ] && KDEDIR=/usr

  11. if [ -x $KDEDIR/bin/kdmdesktop ];then
  12.      $KDEDIR/bin/kdmdesktop
  13.      else
  14.      /usr/X11R6/bin/xsetroot -solid "#21449C"
  15.     /usr/X11R6/bin/xconsole -geometry 480x130-0-0 -daemon -notify -verbose -fn fixed -exitOnFail
  16.     fi
  17.     if [ -x /etc/X11/xinit/fixkeyboard ]; then
  18.      /etc/X11/xinit/fixkeyboard
  19.     fi
复制代码


其中详细的内容我就不说了,请你自己找资料来看。其中xsetroot是设置根视窗颜色的,并执行xconsole设置系统登录画面的登录位置(geometry)。

如果你想修改xdm/gdm执行时所采用的color depth(色深?),可以修改/etc/X11/xdm/Xservers中的内容。我的Mandrake90中的是这样的:



  1. m# more Xservers
  2. # $XConsortium: Xserv.ws.cpp,v 1.3 93/09/28 14:30:30 gildea Exp $
  3. #
  4. #
  5. # $XFree86: xc/programs/xdm/config/Xserv.ws.cpp,v 1.1.1.1.12.2 1998/10/04 15:23:
  6. 14 hohndel Exp $
  7. #
  8. # Xservers file, workstation prototype
  9. #
  10. # This file should contain an entry to start the server on the
  11. # local display; if you have more than one display (not screen),
  12. # you can add entries to the list (one per line).  If you also
  13. # have some X terminals connected which do not support XDMCP,
  14. # you can add them here as well.  Each X terminal line should
  15. # look like:
  16. #       XTerminalName:0 foreign
  17. #
  18. :0 local /bin/nice -n -10 /usr/X11R6/bin/X -deferglyphs 16

复制代码


显然我的是采用16 bites颜色的。当然,你没有必要那么复杂,可以简单点儿,比如,我有时采用:



  1. ###使用16色
  2. :0 local /usr/X11R6/bin/X -bpp 16
  3. ###使用24色
  4. :0 local /usr/X11R6/bin/X -bpp 24
  5. ###使用32色
  6. :0 local /usr/X11R6/bin/X -bpp 32

复制代码



5)对于使用何种X Window Manager与载入方式,并不属于Display Manager的范围。Display Manager只要负责启动各种Sessions即可。总这一句话,X Display Manager只管理sessins,想要实现更外层的工作,则可以让sessions自己去做哦。

6)如果你喜欢那种方式Display Manager,你都可以选择嘛,修改成自己喜欢的东西。例如我的mandrake90中有/etc/X11/prefdm是目前系统内定使用的Disk Manager。你看到它是只是一个/usr/bin/gdm一个连接而已。你还可以在/etc/inittab文件中最后定义像下面的,



  1. #hehe,Run gdm in runlevel 5
  2. #gdm is now for pk'Mandrake separate server
  3. x:5:respawn:/etc/X11/prefdm -nodaemon
复制代码


你自己做过你系统有的xdm/gdm的连接就可以了。(不过,我在Mandrake linux里面用的kdm,而没有装到其它的,所以,好像prefdmp这个文件并不连接的内容。)

这里也费话一下吧,如果你是以kdm来管理你的X的启动的,他只是sessions不同而已,我已经写了这样的一个帖子"配置kdm",如果你想看,就找下吧。道理差不多的。

3。结束我们X Window Manager.

这个大家都会了吧。最简单的就是选择X Window Manager中的exit或logout或相关的就可以了。

呵呵,还记前面介绍的个#HOME/.xinitrc文件吧,是就在结束.xinitrc文件吧,执行了一个叫exec kde3的程序,这样的好处就是结束X Window Manager的时候,会连同x-server一起结束。另外的就是按CRTL+ALT+Backspace来结束你的X Window Manager吧,它就是把中断信号送给X-server结束X回到console terminal。

上面的情况是针对用startx启动X的,如果你是用xdm/kdm/gdm来启动你的X的话,你按上面的方法是又会回到X视窗的登录界面的,X-server并不会结束。你可以在console下,运行init 3就会结束你的X-server,如果你是init 5的话,那X-server又回来了。爽吧?

好了,这就是我对这方面的一些了解,如果你知道还有更好更为详细的方法,请您告诉大家吧。大家一起来分享你的经验。
发表于 2003-3-10 12:20:06 | 显示全部楼层
精华
 楼主| 发表于 2003-3-10 12:22:03 | 显示全部楼层
由于我在Debian下只用了gdm,没有装到kdm,如果你用到kdm,可以参考下我在Mandrake下所写的那个帖子。
http://www.linuxsir.cn/forum.php?mod=viewthread&tid=27373
发表于 2003-3-10 13:29:39 | 显示全部楼层
精采!faint兄辛苦了,为faint兄鼓掌!
发表于 2003-3-10 20:40:46 | 显示全部楼层
谢谢faint兄弟,这么辛苦,是我们菜鸟的 榜样
发表于 2003-4-30 15:04:23 | 显示全部楼层
Good~~~
我看了看startx文件,有些地方不明白,有了这好文章,太好啦~~
发表于 2003-5-2 04:34:43 | 显示全部楼层
写的好啊!
x真是够复杂的
发表于 2003-5-4 10:20:40 | 显示全部楼层

定制你的GDM菜单0.1v(GPL)

我们知道三种不同的起动方法,x,xinit,gdm/xdm/kdm/...
x一般测试用,xinit需要配置文件~/.xinitrc,gdm/xdm/kdm是我要说的重点!(废话:dpkg --listfiles pkgname,查找/etc/部分--debian)
gdm-----/etc/X11/gdm/Sessions/里面的session可以自由更改)
起动过程!
gdm is Ok!
  select session
   if 存在 see configure file
           if config file isn't in home
               exec /etc/X11/Xsession
            else exec ~/.xsession
   else false!
中间的每个过程都可定制,包括文件名!看看默认的。session
1,配置当前用户环境变量
2,起动一些用户的程序,(比如输入法,终端。。。)
3,起动窗口管理器!
为了方便,一般不直接用/et/X11/gdm/Sessions/里起动窗口管理器!直接在home里定制!举例子!要起动自己定制的一个windows2000
1.注册
    cd /etc/X11/gdm/Sessions/
    touch windows2000
    chmod +rx windows2000
    vi windows2000
        #!/bin/sh
          exec  /etc/X11/XsessionWin2000
     ---#上面都注册到gdm管理器里以便我们选择!
2.编辑XsessionWin2000
   我们可以拷贝/etc/X11/Xsesion来用
   cp Xsession XsessionWin2000
    然后修改
   vi XsessionWin2000
   将这几行改了
   STARTUP=$HOME/.xsession-->.xsessionWin2000
   ALTSTARTUP=$HOME/.xsession-->.xseesionWin2000
   其他可以不改!
3.创建自己的/xsession
   cd
    touch .xsessionWin2000
    chmod o+x .xsessionWin2000
    vi .xseesionWin2000
          设置环境
          设置程序(输入法)
          起动窗口管理器
      例如:
LANG=zh_CN.GB2312
LC_ALL=zh_CN.GB2312
LC_CTYPE=zh_CN.GB2312
export LANG LC_ALL LC_CTYPE
export XMODIFIERS="@im=chinput"
/usr/bin/chinput &
/usr/bin/fluxbox

这样就完全可以定制了!
发表于 2004-4-24 13:21:46 | 显示全部楼层
startx只是一个shell脚本,大家可以打开来看一下,那些所谓优先级以及前端的疑问就很容易理解了。
发表于 2004-4-24 16:04:30 | 显示全部楼层
最初由 home_king :beat  发表
startx只是一个shell脚本,大家可以打开来看一下,那些所谓优先级以及前端的疑问就很容易理解了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表