下午看了会儿Linux下X Window的工作方式,可能X Window的工作方式和我们平时所想了还是有些不一样,记录一下自己的假设。等些日子自己熟悉了,再回来看看自己的假设是否正确。
先说些概念:GNU/Linux,X Server,X Client(xterm),Window Manager。
通常,我们所说的Linux是指Linux的发行版,比如Ubuntu,Fedora,Redhat等等。其实从概念上说Linux指得应该是Linux的内核。
有了内核,再有了Bash这样的命令行解释器(加上一些命令工具)。一个可以工作的Linux也就形成了。但是不是所有人都可以/喜欢用命令行工作。世界是多彩的,Linux也需要一个图形界面。
但Linux的图形界面,只是作为内核之外的一个工具提供的。你可以使用图形界面来完成工作,你也可以使用命令行来完成工作。图形界面只是Linux下一个普通的应用程序。
从概念上来讲这个应用程序是C/S架构的一个应用程序,通常由一个X Server和一些X Client组成。我们的X Client可以请求X Server帮忙显示一些界面,比如说窗口啊,按钮啊,给用户。我们从概念上来张图,解释一下。
不同的Client端通常X11协议和X Server通信,并将自己的需求通过X11协议传给X Server。X Server在接到X Client的请求后,在与X Server相连的显示器上显示相关的窗口,按钮,等等。由上图可以看出,一个X Server可以同时满足几个X Client的需求,同时显示在显示器上。
X Client的请求需求大概是:我想画一个窗口(200*200),在窗口上有一个按钮(12*8),相对位置是……。X Server接到要求绘出这样的界面给用户。
但还有两个问题没有解决:首先,X Server要采用什么颜色呢,要不要一些标准组件呢(比如类似Windows应用程序右上角的最小化,最大化,关闭按钮)。这是一个问题。
其次,显示问题解决了,但怎么处理交互呢。比如一个用户按下了按钮,X Client怎么知道呢。
针对上面的问题Window Manager(窗口管理器)出现了。X Client的请求,交给X Server。X Server经过处理后,再将请求交给Window Manager。Window Manager根据相应的配置来显示请求中的那个窗口——不单单显示了200*200的窗口和按钮,显示了默认的标题,添加了窗口标准按钮,等等。如果X Client想显示自己的标题怎么办,给X Server发消息时指明标题不就可以了嘛 :)
当用户在窗口按下按钮后,Window Manager根据用户在窗口上的动作,产生一个点击事件/消息。比如,按钮A已经被点击,点击的相对坐标为(2, 5)。这个消息打包发给X Server,再由X Server通过X11协议传给X Client。类似:嗨,X Clinet 5兄,你的鼠标被点了,你看着办吧。等X Client处理好点击消息后,比如X Client接到消息后,需要显示一个文本框。那么X Client会再次呼叫X Server。整个过程,如此反复。
还有一点需要注意的是通常意义上的Server(服务器),可能在X Server-X Client通信中,是一个X Client的角色。比如我们在自己的Laptop上需要管理3台服务器,我们可以在自己的Laptop上打开X Server和Window Manager。然后不同的服务器通过X11协议,将自己的应用程序窗口显示在Laptop上。此时这台Laptop显示三个服务器应用程序的窗口,并可以通过窗口来管理服务器的配置。
上面只是由目前我了解到的信息和我个人的的猜想,可能并不正确。我们可以做一下替换,将技术替换成具体的应用程序。
Linux发行版->Ubuntu,Fedora, SUSE….
X Server –> XFree86, XOrg,….
X Client –> Xterm.
Window Manager –> FVWM, GNU/Window Maker,….
我要抽些时间在我自己的Linux发行版上,找找这些东西都在什么地方 :)
X Windows 系统于1984年在麻省理工学院(MIT)电脑科学研究室开始开发的,当时Bob Scheifler正在发展分散式系统(distributed system),同一时间 DEC公司的 Jim Gettys 正在麻省理工学院做 Athena 计划的一部分。两个计划都需要一个相同的东西——一套在UNIX机器上运行优良的视窗系统。因此合作关系开始展开,他们从斯坦福(Stanford)大学得到了一套叫做W的实验性视窗系统。因为是根据W视窗系统的基础开始发展的,当发展到了足以和原先系统有明显区别时,他们把这个新系统叫做X。
X Windows 系统也是一个基于客户/服务器(Client/Server)结构的窗口系统,在诞生之初是UNIX系统上使用的图形用户界面,没有PC版,它允许在任一台UNIX主机(客户端)上运行程序,而在基于X的终端(服务器)上显示出来。X Windows 系统系统是目前最常用的免费图形系统,配置在大多数的UNIX系统、DEC的VAX/VMS操作系统以及Linux系统中,在后期又有了XFree86开发计划,其主要目的就是提供一个PC版的X窗口,主要移植到Intel的x86体系架构的处理器上,所以也称作是XFree86计划,它虽然不是以GPL授权,但是也可以自由拷贝以及传播,也可以使用在商业用途上。
X Windows 系统版本11,也就是X11图形系统,产生与1987年,X11图形系统是X Windows 系统发展的一个重要里程碑.X11是一个对网络透明的客户/服务器架构的图形显示系统,它支持应用程序在你的屏幕上绘制象素,线条,文字,图象等等。X11还包括一些其它的辅助的函数库,使得它可以容易地绘制用户界面,例如:按钮,文本输入区等等,其组成主要有三部分:客户端;服务器和X协议。
严格地说,X Windows 系统并不是一个软件,而是一个协议(protocal),这个协议定义一个系统成品所必需具备的功能(就如同 TCP/IP, DECnet或IBM的SNA,这些也都是协议,定义软件所应具备的功能)。任何系统能满足此协议及符合X协会其他的规范,便可称为X。
X11是Unix的图形系统标准(X Window System)。Linux、各种 BSD版本和多数的商用Unix都采用它。Linux下的桌面图形系统已经发展的相当完善了,其GUI由窗口系统,窗口管理器,工具包和风格等几个部分组成,目前的桌面环境主要有两种:
1.KDE(K Desktop Environment);
2.Gnome(GNU Network Object Model Environment)。
二者的界面非常相似。KDE以Qt作为其底层库,而Gnome采用的是GTK库,Qt最初并不遵从GPL协议,而GTK是完全遵守GPL宣言的,这也使得Gnome现在已经成为大多数Linux发行版本的首选,有关GTK和Qt会在后面的部分有详细的介绍。
Linux默认安装使用了安全的配置以限制远程图形化登陆到桌面。本指南描述的配置将修改成允许使用X-Windows的XDMCP和GDM远程登陆。
GUI登陆的Linux配置: |
通常Linux在初始化脚本配置文件/etc/inittab中配置选择文本控制台登陆或图形界面登陆 。为了允许远程GUI登陆,系统本身必须配置成X11 GUI登陆。
-
# Default runlevel. The runlevels used by RHS are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS (The same as 3, if you do not have networking) # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # id:5:initdefault:
(文件部分内容)
注意这里显示运行级别5,是针对Red Hat / Fedora / CentOS的配置。
Ubuntu:
- 使用命令手动启动GDM: /etc/init.d/gdm
(可以加入系统初始化过程: ln -s /etc/init.d/gdm /etc/rc2.d/S13gdm)
或者
- 加入 /etc/inittab or /etc/rc.local
-
x:2:respawn:/usr/sbin/gdm
Ubuntu使用运行级别2-5表示正常的多用户模式。
-
关于初始化过程可参见 YoLinux.com Linux init process tutorial.
授权微软Windows用户远程登陆到系统图形桌面: |
XDM登陆管理:
- 编辑文件:
- Red Hat: /etc/X11/xdm/Xaccess
- Suse: /usr/X11R6/lib/X11/xdm/Xaccess
将配置文件中的下一行:
-
# * #any host can get a login window
修改为:
-
* #any host can get a login window
- 编辑文件: /etc/X11/xdm/xdm-config
将最后一行:
-
!DisplayManager.requestPort: 0
修改为:
-
DisplayManager.requestPort: 0
系统默认针对RHEL4/FC3.
-
GDM登陆管理:
- 编辑问及爱你:
- Red Hat Enterprise 5, CentOS 5: /etc/gdm/custom.conf
注意: RHEL5仅仅使用该文件,XDM不再被支持。
增加两个项目:
-
[xdmcp] Enable=true [security] DisallowTCP=false
也可以使用图形化配置工具/usr/sbin/gdmsetup.
-
- Red Hat Enterprise 3/4, CentOS 3/4, Fedora 1-6: /etc/X11/gdm/gdm.conf
将最后一行:
-
[xdmcp] Enable=false
修改为:
-
[xdmcp] Enable=true
也可以使用图形化配置工具gdmsetup.
-
- Red Hat Enterprise 5, CentOS 5: /etc/gdm/custom.conf
- 重启X-Windows:
- [root]# init 3
- [root]# init 5
注意:
- 可以使用配置工具 /usr/sbin/gdmsetup 来配置GDM。
- 可以在本地测试GDM登陆屏幕: X -query localhost :1
gdmsetup: 该图形界面将编辑GDM配置文件。
- Red Hat Enterprise 5, CentOS 5: /etc/gdm/custom.conf
- Red Hat Enterprise 3/4, CentOS 3/4, Fedora 1-6: /etc/X11/gdm/gdm.conf
选择 "Enable XDMCP":
MS Windows下远程登陆X Server: |
开源软件:
- Xming - [instructions] - X-Windows for MS/Windows - 我的最爱!
- Cygwin/X: 参见 YoLinux Tutorial - Linux for a Microsoft Windows Environment and Network 配置cygwin.
商业软件:
参见 accessing Linux from Microsoft Windows 获取更多的远程X-Windows配置信息.
Linux下远程登陆X Server: |
使用 X-Windows Xnest 命令进行连接.
- /usr/bin/X11/Xnest -query computer-node-name -geometry 1280×1024 :1
使用选项 "-geometry 850×680" 的例子。
[潜在陷阱]: 如果你得到如下的错误消息:
-
Fatal server error: Server is already active for display 0
意味着你忘记了在命令最后写上 ":1",默认是 :0,使用当前桌面窗口,因而导致冲突.
Red Hat / Fedora / CentOS 发行版本需要xorg-x11-Xnest包。
配置陷阱: |
- 确认系统防火墙规则允许XDMCP协议通过.
- 显示防火墙规则: iptables -L
- 刷新防火墙规则: iptables -F
下面的端口和协议必须被允许通过防火墙:
- UDP: 177 (XDMCP)
- TCP: 6000-6005 (X11协议)
- TCP: 7100 (xfs: X字体服务