##############概念篇(待整理)
Xwindow是工作站图形系统的工业标准,它有多种不同的实现,Ubuntu系统中使用的为Xorg。
(比较前卫的图形界面系统XGL,实际代替X服务器的作用,另外还有与之配套的窗口管理器)
历史
当然,Xwindow有悠久的历史和传统,不过那不在我们讨论的范围。您要注意的有两点:
* Xwindow 和 Xbox 中的“X”本意是不同的, X 只是 W 后的一个字母,差不多应该这样理解,Xwindow
是 Window 的接班人 (注意,Window不是Windows)
* 同样,也不要把 Xwindow 说成是 Xwindows,那是一种亵渎!一切伟大的创造,都应得到应有的理解和
尊重。
基本运行原理
X Window System采用C/S结构,但和我们常见的C/S不同。常见的C/S结构中,称提供服务的一方为server,即服务
器端(如HTTP服务,FTP服务等),使用服务的称为client,即客户端。但在 X Window System中,client是执行程
序的一方,在上面执行各种X程序,而server则是负责显示client运行程序的窗口的一方。
X Window System的组成可以分为 X server,X client,X protocol三部分。X server主要控制输入输出,维护字
体,颜色等相关资源。它接受输入设备的输入信息并传递给X client,X client将这些信息处理后所返回的信息,
也由X server负责输出到输出设备(即我们所见的显示器)上。 X server传递给X client的信息称为Event,主要是
键盘鼠标输入和窗口状态的信息。X client传递给X server的信息则称为Request,主要是要求X server建立窗口
,更改窗口大小位置或在窗口上绘图输出文字等。X client主要是完成应用程序计算处理的部分,并不接受用户的
输入信息,输入信息都是输入给X server,然后由X server以Event的形式传递给X client(这里感觉类似 Windows
的消息机制,系统接收到用户的输入信息,然后以消息的形式传递给窗口,再由窗口的消息处理过程处理)。X
client对收到的Event 进行相应的处理后,如果需要输出到屏幕上或更改画面的外观等,则发出Request给X
server,由X server负责显示。
常见的情况是X server与X client都在同一台电脑上运行,但他们也可分别位于网络上不同的电脑上。在X Window
System 中,X client是与硬件无关的,它并不关心你使用的是什么显卡什么显示器什么键盘鼠标,这些只与X
server相关。我们平常安装完 XFree86后运行xf86config或xf86cfg进行的配置实际上只是与X server有关,可以
说就是配置X server吧,不配置照样可以运行X client程序(如:xeyes -display xserver:0就可以在xserver这台
机器上的0号屏幕(屏幕编号 displaynumber为0)上显示那对大眼睛了)。
X protocol就是X server于X client之间通信的协议了。X protocol支持现在常用的网络通信协议。我只能测试
TCP/IP,可以看到X server侦听在tcp 6000端口上。那X protocol就是位于运输层以上了,应该属于应用层吧?。
总结下运行过程吧:
(1) 用户通过鼠标键盘对X server下达操作命令
(2) X server利用Event传递用户操作信息给X client
(3) X client进行程序运算
(4) X client利用Request传回所要显示的结果
(5) X server将结果显示在屏幕上
什么是窗口管理器?
很多人不知道窗口管理器是怎么回事。他们认为 Gnome 和 KDE 是窗口管理器,认为窗口管理器就是能够提供一个
工具条,能够配置桌面背景,能够设置很多菜单的东西。而其实,窗口管理器只是 Gnome 和 KDE 的一部分,它的
主要功能是你平时根本没有注意,但是却非常重要的操作。窗口管理器的主要功能是:移动窗口,改变窗口大小,
图标化(最小化)窗口,改变窗口层叠顺序……
有人把 Gnome 和 KDE 叫做窗口管理器,甚至还有人把它们叫做 Xwindow。经常看到有人问:“装哪种 Xwindow 好
啊?Gnome 还是 KDE?” 其实你不安装 Gnome 和 KDE 也可以使用 Xwindow.
Gnome 和 KDE 是“桌面系统”,一种很多程序和函数库的集合。
什么是gdm?
更新中。。。。。。
##############原理篇
1,关于屏幕编号:
在CUI模式下运行命令:
:1&
看到了一个灰色的全屏幕和一个鼠标指针,这就是X server了,其屏幕编号为1。有人说F7对应屏幕编号为0的X
server实际上是不对的,如果第一个启动的屏幕编号为1,第二个启动的编号为0,则F7对应1屏幕,F8对应0屏幕),
运行命令:xdkui@Debian:~$xeyes -display localhost:1&
然后按Ctrl+Alt+F7,看到我们的X client也就是xeyes了吧。再回到CUI,运行
&
开启一个屏幕编号0的X server,CUI下再运行
&
这时Ctrl+Alt+F7对应屏幕编号1;而F8对应屏幕编号0,且其X client为xterm。
2,跨网络运行X Window System
一般用来做服务器的系统(Linux,FreeBSD,Solaris等等)都不会装X server,甚至很多都没有显示器。这样可以在
这些系统里安装简单的X client,以GUI的方式远程显示在管理员们所坐的X server里。假设实验室用FreeBSD做网
关,提供WWW,FTP服务,一般在管理员的本地机器起个X server,然后ssh或telnet上网关运行X client程序显示在
本地显示器上,当然,也可用 XDMCP(X Display Manager Control Protocol),man xsession里提到/etc/X11
/Xsession一般被startx(我的/etc/X11/xinit/xinitrc里调用Xsession脚本)或 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参数。
##############实践篇(做过的标上"ok")
-----------阶段1
1.启动你的 X server:
在 Linux 下,你可以直接输入: $X&
让一个 X server 在后台运行。这样,一个占据整个屏幕的布满斜纹的窗口(根窗口)就出现了。如果是 Exceed
或者 X-win32,你需要把屏幕设置为 "single window" 才能看到这个窗口。
2.给的 X server 设置一个密码:
输入:$xauth add :0 . 'mcookie'
Linux 用户需要用 xauth 给你的 X server 设置一个密码,这样别人就不能非法连接你的 X server。你需要
Ctrl-Alt-F1切换到tty1才能输入这个命令。Exceed 和 X-win32 的用户不需要这步。
3.启动一个 xterm 到这个 X server 上:
输入:xterm -display :0
按 Alt-F7 切换到 X,你将看到一个不受窗口管理器管理的 xterm。无法移动。若再切换到 tty1 启动另一个
xterm,两个 xterm 重合了。
4.启动一个窗口管理器,比如 twm:
输入:$twm&
xterm的窗口都被加上了标题栏,按钮和边框,现在可以移动它们了。若把 twm 杀死,那些标题栏,按钮,边框又
都消失了(按理说如果不知定哪个窗口的话,可能会启动不起来)
-----------阶段2
1.设置最简单的X server+ X client:(设置starx脚本调用的文件)
1)在.xserverrc里写入/usr/bin/X11/X :1
2).xinitrc里写入 /usr/bin/X11/xeyes -display localhost:1
这就是最简单的X server+ X client了,只不过把屏幕编号从默认的0改为了1,这里X server即是/usr/bin/X11/X
程序,X client即是/usr/bin/X11 /xeyes 程序。
3)输入:$startx
这样可以看到,只启动了1)2)两步设置的程序。
2.设置启动环境(方法1):(例如设置为gnome环境了)
1)修改(或者看看再添加)$HOME/.xinitrc的内容为exec gnome-session(即/usr/bin/gnome-session)
2)输入:$startx
3.设置启动环境(方法2):(结果同上)
1)把链接/usr/bin/x-session-manager修改为指向gnome-session
2)输入:startx
注意:假设不存在$HOME/.xinitrc文件,因为它的优先级高,有它就不执行/etc/X11/xinit/xinitrc了,因此也不
会掉用到x-session-manager了。x-session-managermanager是指向gnome-session的链接。这
里/etc/X11/Xsession.d/50xfree86-common_determine-startup,找到"STARTUP"变量的判断执行部分,有:
if [ -x /usr/bin/x-session-manager ]; then
STARTUP=x-session-manager
指明了x-session-manager的启动。如果删掉,则会执行后面指定的X客户端。
------------阶段3
1,开启一个屏幕编号0的X server:
输入:$X :0&
按Ctrl+Alt+F1回到刚才的CUI(Ctrl+Alt+F7对应本机的第一个启动的 X server,Ctrl+Alt+F8对应第二个,有人说
F7对应屏幕编号为0的X server实际上是不对的,如果第一个启动的屏幕编号为1,第二个启动的编号为0,则F7对应
1屏幕,F8对应0屏幕)
2,在屏幕0上运行xterm
输入:xterm -display localhost:0&
如果只运行xterm不指定屏幕,好像就加载到第一次启动的了?。
3,“手动”启动gnome:
1)输入:$X&
2)$gnome-session
感觉xinit用处并不大(??不知是否正确)
4,ssh或telnet方式远程登录运行xterm客户端程序显示在本地:
1)远程在X client机器输入:$export DISPLAY=192.168.1.2:0
设置环境变量,确定远程主机客户程序的显示屏幕,或者X client程序加个 "—display"参数即$xterm --display :0
2)远程在X client机器输入:$xterm&
假设自己的机器是192.168.1.2,以上是windows的,如果linux下另需要注意授权问题,建立文件/etc/X0.hosts,填入 X client的IP192.168.1.1,其中X0.hosts表示本地第0个屏幕允许连接的X client地址,建立X1.hosts文件则是本地第1个屏幕允许连接的X client地址,以此类推,man xserver里有。
5,XDMCP方式远程登录并显示在本地
1)修改X client机器gdm的配置文件/etc/X11/gdm/gdm.conf:[xdmcp]段的Enable=true。
这样使得可以远程登录,这里X client是请求X server的机器
2)远程在X client机器输入:$gdm
3)本地X server的CUI输入:X -query 192.168.1.1
这里,192.168.1.1是X client开gdm机器的地址,至此即可看到登录界面。
........to be continued
##############配置篇
------阶段1
.Xdefaults 文件:
几乎所有的 X 客户程序都可以从 .Xdefaults 文件得到配置信息,比如前景色,背景色,字体…… 这样你可以在同
一个文件里配置所有 X 程序的样式,而不用写那么多 shell script。
------阶段2
1,$HOME/.xinitrc: 用户的client定义文件
2,/etc/X11/xinit/xinitrc:系统的client
里面包含了". /etc/X11/Xsession"这句话
3,$HOME/.xserverrc:用户的server定义文件
4,/etc/X11/xinit/xserverrc:系统的server
对于1-4四个文件,startx 设置X client的位置是先搜寻$HOME/.xinitrc,然后是/etc/X11/xinit/xinitrc;设置
X server的位置是先搜寻$HOME/.xserverrc,然后是/etc/X11/xinit/xserverrc。启动X Window时用户目录下
的.xinitrc和.xserverrc文件优先级要高。startx命令启动X时,如果用户目录存在.xinitrc和.xserverrc文件,
则实际上等价于命令:
init $HOME/.xinitrc -- $HOME/.xserverrc 。如果用户目录不存在那两个文件,则等价于 xinit
/usr/X11R6/lib/X11/xinit/xinitrc -- /usr/X11R6/lib/X11/xinit /xserver。
5,/etc/X11/Xsession:
运行目录"/etc/X11/Xsession.d"下的文件
6,/etc/X11/Xsession.d:
该目录中可以看到几个以数字开头的文件,实际上这些数值就表示了这几个文件被运行的优先级,数字小的优先级
高。因为在Xsession脚本中,用到ls命令以名字作为运行次序。
7,/etc/X11/Xsession.d/50xfree86-common_determine-startup:
设置启动程序,实际上设置其中的"STARTUP"变量."STARTUP"变量在55gnome-session_gnomerc中提到,在
99xfree86-common_start文件有"exec $STARTUP "来执行它。
简单的说就是依次顺序查找/usr/bin/x-session-manager ,x-window-manager,/usr/bin/x-terminal-emulator
这三个文件,如果存在则启动之,也即X client。如果三个都不存在则报错退出了。
8,/usr/bin/x-session-manager:
该文件可以看到是个符号连接,最终连接到/usr/bin/gnome-session,也就是gnome。
把/usr/bin/x-session-manager 改为指向xfce4-session(如果安装了的话) ,再startx就会启动xfce4环境了。
再删掉/usr/bin/x-session-manager ,再startx,只启动了/usr/bin/x-window-manager 所指向的window
manager,例如blackbox。
对于5-8四个文件,如果用户目录的xinitrc文件$HOME/.xinitrc里面有exec xfce4-session。那么X client可以说
最主要的x-session-manger是从$HOME/.xinitrc启动的。也就不会经过/etc/X11/xinit/xserverrc的执行过程了.
........to be continued
##############过程篇
1,启动过程
我们从控制台进入X一般是用startx命令。下面就从startx分析起。首先man startx和man xinit可以看到staratx
和xinit的使用方法:
startx [[client] options .....] [-- [server] options ....]
xinit [[client] options ] [-- [server] [display] options]
把上面[client]和[server]分别称为client程序和server程序。man手册里写明其必须以/或者./开头。
startx这个脚本,是安装x-window-system-core后得到的,都是XFree86,不同发行版的linux里该脚本应该大同小
异.
根据它的代码可以得出startx主要是置X client和X server所在的位置,并处理相关参数,最后交给xinit处理。
可以看出startx 设置X client的位置是先搜寻$HOME/.xinitrc,然后是/etc/X11 /xinit/xinitrc;设置X server
的位置是先搜寻$HOME/.xserverrc,然后是/etc/X11/xinit /xserverrc。这就解释了我们平常为什么说启动X
Window时用户目录下的.xinitrc和.xserverrc文件优先级要高。所以我们用startx命令启动X时,如果用户目录存
在.xinitrc和.xserverrc文件,则实际上等价于命令 xinit $HOME/.xinitrc -- $HOME/.xserverrc 。如果用户目
录不存在那两个文件,则等价于xinit /usr /X11R6/lib/X11/xinit/xinitrc --
/usr/X11R6/lib/X11/xinit/xserver。别的情况类推。
至于xinit,则根据startx传过来的参数启动X server,成功后根据xinitrc启动X client。
以上即为X Window System的启动过程,startx只是负责一些参数传递,真正的X启动由xinit实现。实际上可以分
为启动 X server和启动X client两部分。下面在用户目录下构造.xinitrc(即X client)和.xserverrc(即 X
server)文件。在.xserverrc里写入/usr/bin/X11/X :1。.xinitrc里写入/usr/bin/X11 /xeyes -display
localhost:1。这就是最简单的X server+ X client了,只不过把屏幕编号从默认的0改为了 1,这里X server即是
/usr/bin/X11/X 程序,X client即是/usr/bin/X11/xeyes 程序。
总结下单机用startx启动过程吧:
(1) startx置X client和X server的位置,处理参数并调用xinit
(2) xinit根据传过来的参数启动X server,成功后呼叫X client
(3) 根据xinitrc设置相关资源,启动窗口管理器,输入法和其他应用程序等X client程序.