Unix/Linux 桌面环境相关知识备忘

多年前认识几位 Unix 下的资深开发人员,例如老许,随意兄等,当时正在对 Windows 下的用户界面相关领域做研究,比如 win32k.sys 里面的东西,DirectUI/NetUI 的实现原理,如何做外挂式的窗口风格切换器(类似于 WindowBlinds 那样的机制在一个应用内或者整个系统内的应用),为了做知识延展,曾经请教过他们 Unix/Linux 下 X 窗口系统的知识。尽管他们专注的领域并不在这方面,但还是解决了我不少疑问,很可惜的是,这么多年过去后,那些曾经知道的东西又淡忘了。

从 2011 年末,又开始接触 Linux,了解了一些 shell 和 ssh 相关的粗浅知识,昨天下午突然又对 X 的体系结构和发展历史产生了疑惑,因此 google 到深夜。以下为简要的记录,以作备忘。因为不是这个领域内的专家,而且有的信息并没有做严格的考证和验证,所以不能保证所有信息均正确无误,欢迎指正和补充。

在 *nix 下,尤其是 Linux 下,桌面环境是个笼统的称呼,通常包括了一个使用了某个图形开发库的窗口管理器,以及若干可供使用的常用软件(例如终端模拟程序、文本编辑器、文件管理器、控制中心、浏览器甚至开发工具等等)。

长期以来,*nix 系统的图形化界面基础是 X 窗口系统(X Window System),这个系统主要由 X 服务器(X Server),X 客户端(X Client)和 X 协议(X Protocol)组成。X 服务器负责在绘图设备(通常是屏幕)上绘图、与输入设备(通常是鼠标和键盘)交互以及处理窗口的创建销毁等。通常用到的 X 协议是 X11R6,意为 X protocol version 11 release 6(写本文时最新的 release 是 X11R7.6)。X 窗口系统里,窗口是个相对抽象的概念,其包含的信息只是窗口的相关属性,并不涉及到具体的视觉呈现方面等的细节。这后一部分的工作,由专门的组件负责,称作窗口管理器(Window Manager)。

根据以上的基本信息,我们来了解一下最常用的两个桌面环境,KDE 和 GNOME。KDE 的全称是 K Desktop Environment,GNOME 的全称是 GNU Network Object Model Environment。KDE 使用到了称作 Qt 的图形开发库(目前为 Nokia 所有),它带的窗口管理器叫做 KWin,文件管理器实用工具是 Dolphin;GNOME 使用的图形开发库则是 GTK+,其自带窗口管理器的名字是 Metacity,文件管理器是 Nautilus。

除了上述的两个桌面环境,还有两个桌面环境也比较常用,分别是 Xfce 和 LXDE。相比较而言,它们要轻量级一些,因为它们在开发之时,选择了一个比较高的出发点,即使用和 GNOME 相同的底层图形开发库 GTK+(其实 Xfce 是后来才从 XForms 转过来的),在此基础上,提供了不同的窗口管理器以及少量应用。GTK+ 图形库(以及 Qt)的底层,是 X11 的开发库 Xlib,直接使用 Xlib 提供的 API 进行开发是一件繁冗的事情。

由于整个 X 体系架构的灵活性很强,因此除了像 KDE、GNOME、Xfce、LXDE 这样的图形化操作全面解决方案(即桌面环境)之外,还存在着大量单独的窗口管理器可供使用。比较常见的如 IceWM 和 FVWM 等等,还有现在风头很劲的 Enlightenment。后者基于的图形库也很有意思,并没有选择 GTK+ 或者 Qt,而是一个叫做 Elementary 的库。以 Enlightenment 为窗口管理器的 E17 桌面环境也正在成长。 与之情形类似的还有 OpenBox 这个窗口管理器。这些窗口管理器往往可以代替 KDE 或者 GNOME 自己的窗口管理器进行工作。我们还经常看到,有的 Linux 发行版的桌面有很多的显示特效,这个是由一个叫做 Compiz 的窗口管理器(它的更精准的分类是组合型窗口管理器,Compositing Window Manager,参见 http://en.wikipedia.org/wiki/Compositing_window_manager)做到的。它的独特之处在于,底层依赖于一个不同于传统的 X 环境:Xgl,更底层的绘图等操作则使用了称为 Glitz 的 OpenGL。

X 体系里还有个东西叫显示管理器(X Display Manager,如 XDM、gdm、wdm),可以对本地的或远程的多个 X Server 进行管理。Linux 系统如果以级别 5 启动,进入的用户登录界面就是显示管理器,用户输入用户名和密码后,它就会启动本地的 X Server,初始化一个 X 会话(X Session),一般还会通过 X 会话启动本地的窗口管理器和桌面环境。如果在配置文件里设置 xdmcp 为 true,显示管理器就可以通过 xdmcp 协议管理远程的 X Server。当在 Windows 机器上使用 X manager 登录 Linux/Unix 机器时,其实是用 xdmcp 协议登录的,用户同样输入用户名/密码登陆,xdm 启动一个 X 会话,不过这次的 X Server 是在远程(相对于 X Client 而言,也即 Windows 上)的机器上。X 显示管理器也有了新的发展,之前通常就是 XDM 或者基于 XDM 的变种,现在,一个叫做 LightDM 的跨桌面显示管理器正在试图成为 X 服务器的标准显示管理器。

出于各种目的,有的人希望所使用的 Linux 的外观和 Windows 或者 Mac OS X 保持一致。这样做的初始目的可能是为了好玩,做到最后则往往是因为追求尽善尽美的信念。如果你希望桌面看起来像是 Windows,有一个叫做 Win2-7 Pack 的软件可以做到(应用于 GNOME),如果是想类似于 Mac OS X,则 Macbuntu 可以应用 Ubuntu 上。

很有意思的是,最近 *nix 上的变革有爆发的趋势,可能是科技发展到一定程度时的必然现象吧。连 X 窗口系统的权威地位,目前也受到了后来者的挑战和威胁。Wayland(http://wayland.freedesktop.org)就是这样的一个后来者。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注