2012年3月18日星期日

Xwindow 的相关概念



X 就像http,ftp一样是个网络协议,目前的版本是11,release号是7。该协议同样具有Server和Client的概念。X Server的作用是接收客户的请求,绘制客户请求的图形,并把客户的消息传递给X Client端。即X Server的用途是绘图,具体该如何绘制,则是由X Client端提供了绘图数据。根据X Server接收请求和绘制图形这两个功能,可以清楚的看出X Server管理的是客户的输入设备(鼠标键盘)和输出设备(显示器)。所以运行在本地机器上的程序是X Server,远程服务器上的程序是X Client。

设想如下情况:用户点击了FireFox的关闭按钮之后的事情:X Server 通知 FireFox(Client端),客户点击关闭按钮了,你不打算做点神马事情?FireFox 于是开始执行退出命令,并告诉X Server,让我消失吧。于是X Server 不再显示FireFox的窗口。

再设想如下情况:用户通过ssh到远程服务器A,启动一个 X Client 程序(比如FireFox),让该程序通过网络连接到本地的X Server绘制图形;然后用户通过ssh到远程服务器B,启动一个X Client程序(比如xterm),也让该程序通过网络连接到本地的X Server绘制图形。这时,用户可以在自己的终端上同时看到A机器的FF和B机器的xterm。

X Client只提供了绘图数据,至于窗口在显示器的什么位置,X Client是完全不知道的。同时启动两个X client后,X Server 该如何排列窗口呢?这就需要Window Manage了。 最简单的Window Manage是twm。

以上是概念,openSUSE 使用的 XServer是 Xorg,配置文件在/etc/X11/xorg.conf.d,使用的WM是Kwin。X client 就很明显了,进行图形输出的程序都是X client。

可以运行 startx 启动 X server。 startx 是个shell脚本,主要用来读取 Xserver 和 X Client 的配置,然后调用 xinit 启动X server 和 X Client。读取参数的顺序:
  • X server 的参数方面:
    1. 使用 startx 后面接的参数;
    2. 若无参数,则找寻使用者HOME目录的文件,亦即 ~/.xserverrc
    3. 若无上述两者,则以 /etc/X11/xinit/xserverrc
    4. 若无上述三者,则运行 /usr/bin/X
  • X client 的参数方面:
    1. 使用 startx 后面接的参数;
    2. 若无参数,则找寻使用者家目录的文件,亦即 ~/.xinitrc
    3. 若无上述两者,则以 /etc/X11/xinit/xinitrc
    4. 若无上述三者,则运行 xterm
分析openSUSE的 /etc/X11/xinit/xserverc 文件,可以看出实际就是调用X命令来启动X Server的,只是在调用命令前,又通过读取一些文件,配置了环境变量。调用 X 启动 X Server 后,Xorg 会去读取 /etc/X11/xorg.conf 这个配置文件。单纯的 X 启动时,会看到画面漆黑,中心有个可以移动的鼠标的光标。

分析openSUSE的 /etc/X11/xinit/xinitrc 文件,可以看出最后实际调用startkde 或者 gnome-session 来启动桌面环境。

直接调用 X 命令自行启动X Server:X :1 &。:1 表示将X Server启动在哪个终端上,调用该命令后,通过切换终端可以看到一个黑色背景加一个光标。
运行 xterm -display :1 &,可以在终端上看到一个xterm,但是这个xterm没有标题栏,无法移动,可以在里面敲几个命令观察一下。
再次运行 xterm -display :1 &,可以在终端上看到一个全新的xterm,这个xterm覆盖了第一次启动的xterm,同样没有标题栏,无法移动,第一次启动的xterm找不到了。
可以通过启动一个窗口管理器(如twm)来解决此问题。运行twm -display :1 &,可以看到xterm有了标题栏,可以关闭,拖动等等。
这就是X Server,X Client 和 WM 之间的关系。

本地的 X Server 和 X Client 通过socket来通讯,因此6000端口默认是看不到开放的。

更详细的可以参考鸟哥:http://vbird.dic.ksu.edu.tw/linux_basic/0590xwindow.php



没有评论:

发表评论