Unix Like 操作系统不是只能进行服务器的架设而已,在美编、排版、制图、多媒体应用上也是有其 需要的。 这些需求都需要用到图形接口 (Graphical User Interface, GUI) 的操作的, 所以后来才有所 谓的 X Window System 这玩意儿。为啥图形窗口接口要称为 X 呢?因为就英文字母来看 X 是 在 W(indow) 后面,因此,人们就戏称这一版的窗口接口为 X 啰

X Window 的发展简史

X Window 系统最早是由 MIT (Massachusetts Institute of Technology, 麻省理工学院) 在 1984 年发 展出来的, 当初 X 就是在 Unix 的 System V 这个操作系统版本上面开发出来的。

由于这个 X 希望能够透过网络进行图形接口的存取,因此发展出许多的 X 通讯协议,这些网络架 构非常的有趣, 所以吸引了很多厂商加入研发,因此 X 的功能一直持续在加强!一直到 1987 年 更改 X 版本到 X11 ,这一版 X 取得了明显的进步, 后来的窗口接口改良都是架构于此一版本, 因此后来 X 窗口也被称为 X11。

我们可以知道的是:

  • 在 Unix Like 上面的图形用户接口 (GUI) 被称为 X 或 X11;
  • X11 是一个『软件』而不是一个操作系统;
  • X11 是利用网络架构来进行图形接口的执行与绘制;
  • 较著名的 X 版本为 X11R6 这一版,目前大部分的 X 都是这一版演化出来的 (包括 X11R7);
  • 现在大部分的 distribution 使用的 X 都是由 Xorg 基金会所提供的 X11 软件;
  • X11 使用的是 MIT 授权,为类似 GPL 的开放原始码授权方式。

主要组件: X Server/X Client/Window Manager/Display Manager

X Window system 是个利用网络架构的图形用户接口软件,那到底这个架构可以分成多少个组件呢?基本上是分成 X Server 与 X Client 两个组件而已喔!其中 X Server 在管理硬件,而 X Client 则是应用程序。在运作上,X Client 应用程序会将所想要呈现的画面告知 X Server , 最终由 X server 来将结果透过他所管理的硬件绘制出来!整体的架构我们大约可以使用如下的图示 来作个介绍:

X Server 的重点就是在管理客户端的硬件,包括接受键盘/鼠标等设备的 输入信息, 并且将图形绘制到屏幕上。


  • XServer:硬件管理、屏幕绘制与提供字型功能:

X Server 的主要功能就是 在管理『主机』上面的显示硬件与驱动程序。

每部客户端主机都需要安装 X Server,而服务器端则是提供 X Client 软件, 以 提供客户端绘图所需要的数据数据

X Server 还有一个重要的工作,那就是将来自输入设备 (如键盘、鼠标等) 的动作告知 X Client, 你晓得, X Server 既然是管理这些周边硬件,所以,周边硬件的动作当然是由 X Server 来 管理的, 但是 X Server 本身并不知道接口设备这些动作会造成什么显示上的效果, 因此 X Server 会将接口设备的这些动作行为告知 X Client ,让 X Client 去伤脑筋。


  • X Client:负责 X Server 要求的『事件』之处理:

X Client 最重要的工作就是处理来自 X Server 的动作,将该动作处理成为绘图数据, 再 将这些绘图数据传回给 X Server。由于 X Client 的目的在产生绘图的数据,因此我们也称呼 X Client 为 X Application (X 应用程序)。而且,每个 X Client 并不知道其他 X Client 的存在, 意思 是说,如果有两个以上的 X client 同时存在时,两者并不知道对方到底传了什么数据给 X Server , 因此 X Client 的绘图常常会互相重迭而产生困扰喔!


  • X Window Manager:特殊的 X Client ,负责管理所有的 X client 软件

Window Manager (WM, 窗口管理员) 主要在负责全部 X client 的控管,还包括提供某些特殊的功能,例如:

  • 提供许多的控制元素,包括任务栏、背景桌面的设定等等;
  • 管理虚拟桌面 (virtual desktop);
  • 提供窗口控制参数,这包括窗口的大小、窗口的重迭显示、窗口的移动、窗口的最小化等等。

  • Display Manager:提供登入需求

图形接口登入 (输入账号密码)那是个 Display Manager 啦!这个 display manager 最大的任务就是提供登入的环境, 并且加载使用者选择 的 Window Manager 与语系等数据喔!

X Window 的启动流程

  • 在文字接口启动 X :透过 startx 指令

我们都知道 Linux 是个多人多任务的操作系统,所以啦,X 窗口也是可以根据不同的使用者而有不 同的设定! 这也就是说,每个用户启动 X 时, X server 的分辨率、启动 X client 的相关软件及 Window Manager 的选择可能都不一样! 但是,如果你是首次登入 X 呢?也就是说,你自己还没有 建立自己的专属 X 画面时,系统又是从哪里给你这个 X 预设画面呢?而如果你已经设定好相关的 信息,这些信息又是存放于何处呢?

事实上,当你在纯文本接口且并没有启动 X 窗口的情况下来输入 startx 时,这个 startx 的作用就 是在帮你设定好上头提到的这些动作啰!startx 其实是一个 shell script ,他是一个比较亲和的程序, 会主动的帮忙使用者建立起他们的 X 所需要引用的配置文件而已。

startx 最重要的任务就是找出用户或者是系统默认的 X server 与 X client 的配置文件,而使用者也 能够使用 startx 外接参数来取代配置文件的内容。

[root@study ~]# startx [X client 参数] -- [X server 参数]

# 范例:以颜色深度为 16 bit 启动 X
[root@study ~]# startx -- -depth 16

startx 后面接的参数以两个减号『--』隔开,前面的是 X Client 的设定,后面的是 X Server 的设定。

startx 都是提到如何找出 X server / X client 的设定值而已! 没错,事实 上启动 X 的是 xinit 这支程序, startx 仅是在帮忙找出设定值而已!那么 startx 找到的设定值可用 顺序为何呢?基本上是这样的:

  • X server 的参数方面:

    1. 使用 startx 后面接的参数;
    2. 若无参数,则找寻用户家目录的文件,亦即 ~/.xserverrc
    3. 若无上述两者,则以 /etc/X11/xinit/xserverrc
    4. 若无上述三者,则单纯执行 /usr/bin/X (此即 X server 执行档)
  • X client 的参数方面:

    1. 使用 startx 后面接的参数;
    2. 若无参数,则找寻用户家目录的文件,亦即 ~/.xinitrc
    3. 若无上述两者,则以 /etc/X11/xinit/xinitrc
    4. 若无上述三者,则单纯执行 xterm (此为 X 底下的终端机软件)

  • 由 startx 呼叫执行的 xinit

事实上,当 startx 找到需要的设定值后,就呼叫 xinit 实际启动 X 的。他的语法是:

[root@study ~]# xinit [client option] -- [server or display option]

那个 client option 与 server option 如何下达呢?其实那两个咚咚就是由刚刚 startx 去找出来的。在我们透过 startx 找到适当的 xinitrc 与 xserverrc 后,就交给 xinit 来执行。在预设的情况下 (使 用者尚未有 ~/.xinitrc 等文件时),你输入 startx , 就等于进行 xinit /etc/X11/xinit/xinitrc -- /etc/X11/xinit/xserverrc 这个指令一般!但由于 xserverrc 也不存在,因 此实际上的指令是:xinit /etc/X11/xinit/xinitrc -- /usr/bin/X。

那为什么不要直接执行 xinit 而是使用 startx 来呼叫 xinit 呢?这是因为我们必须要取得一些参数 嘛! startx 可以帮我们快速的找到这些参数而不必手动输入的。因为单纯只是执行 xinit 的时候,系 统的默认 X Client 与 X Server 的内容是这样的:

xinit xterm -geometry +1+1 -n login -display :0 -- X :0

在 X client 方面:那个 xterm 是 X 窗口底下的虚拟终端机,后面接的参数则是这个终端机的位置 与登入与否。 最后面会接一个『 -display :0 』表示这个虚拟终端机是启动在『第 :0 号的 X 显示 接口』的意思。至于 X Server 方面, 而我们启动的 X server 程序就是 X 啦!其实 X 就是 Xorg 的 连结档,亦即是 X Server 的主程序啰! 所以我们启动 X 还挺简单的~直接执行 X 而已,同时还 指定 X 启动在第 :0 个 X 显示接口。


  • 启动 X server 的文件: xserverrc

X 窗口最先需要启动的就是 X server 啊,那 X server 启动的脚本与参数是透过 /etc/X11/xinit/ 里面 的 xserverrc 。不过我们的 CentOS 7.x 根本就没有 xserverrc 这个文件啊! 那用户家目录目前也没 有 ~/.xserverrc ,这个时候系统会怎么做呢?其实就是执行 /usr/bin/X 这个指令啊! 这个指令也是 系统最原始的 X server 执行档啰。

在启动 X Server 时,Xorg 会去读取 /etc/X11/xorg.conf 这个配置文件。

我们的 Linux 可以『同时启动多个 X』喔!第一个 X 的画面会在 :0 亦即 是 tty2 ,第二个 X 则是 :1 亦即是 tty3 。X server 未注明加载的接口时,默认是使用 :0 ~ 但是 X client 未 注明时,则无法执行喔!


  • 启动 X Client 的文件: xinitrc

假设你的家目录并没有 ~/.xinitrc ,则此时 X Client 会以 /etc/X11/xinit/xinitrc 来作为启动 X Client 的预设脚本。xinitrc 这个文件会将很多其他的文件参数引进来, 包括 /etc/X11/xinit/xinitrc-common 与 /etc/X11/xinit/Xclients 还有 /etc/sysconfig/desktop 。

你也可以发现最终在 XClient 文 件当中会有两个指令的搜寻, 包括 startkde 与 gnome-session 这两个,这也是 CentOS 预设会提供 的两个主要的 Window Manager 啰。 而你也可以透过修改 /etc/sysconfig/desktop 内的 DESKTOP=GNOME 或 DESKTOP=KDE 来决定默认使用哪个窗口管理员的。

另外,如果有特殊需求,你当然可以自定义 X client 的参数!这就得要修改你家目录下的 ~/.xinitrc 这 个文件啰。 不过要注意的是,如果你的 .xinitrc 配置文件里面有启动的 x client 很多的时候,千万 注意将除了最后一个 window manager 或 X Client 之外,都放到背景里面去执行啊!举例来说,像 底下这样:

xclock -geometry 100x100-5+5 &
xterm -geometry 80x50-50+150 &
exec /usr/bin/twm

意思就是说,我启动了 X ,并且同时启动 xclock / xterm / twm 这三个 X clients 喔! 如此一来, 你的 X 就有这三个咚咚可以使用了!如果忘记加上 & 的符号,那就..... 会让系统等待啊,而无法

一次就登入 X 呢!


  • X 启动的埠口

既然 X 是可以跨网络的,那 X 启动的埠口是几号?

其实,CentOS 由于考虑 X 窗口是在本机上面运作,因此将埠口改为插槽档 (socket) 了,因此你无 法观察到 X 启动的埠口的。事实上, X server 应该是要启动一个 port 6000 来与 X client 进行沟 通的! 由于系统上面也可能有多个 X 存在,因此我们就会有 port 6001, port 6002... 等等。这也就 是说:(假设为 multi-user.target 模式, 且用户仅曾经切换到 tty1 而已)

X 窗口系统 显示接口号码 默认终端机 网络监听端口
第一个 X hostname:0 tty2 port 6000
第二个 X hostname:1 tty3 port 6001

X 启动流程测试

好了,我们可以针对 X Server 与 X client 的架构来做个简单的测试喔! 这里假设你的 tty1 是multi-user.target 的,而且你也曾经在 tty2 测试过相关的指令,所以你的 X :1 将会启用在 tty3 喔!而且,底下的指令都是在 tty1 的地方执行的,至于底下的画面则是在 tty3 的地方展现。 因此,请 自行切换 tty1 下达指令与 tty3 查阅结果啰!

1. 先来启动第一个 X 在 :1 画面中:
[dmtsai@study ~]$ X :1 &

上述的 X 是大写,那个 :1 是写在一起的,至于 & 则是放到背景去执行。此时系统会主动的跳到 第二个图形接口终端机,亦即 tty3 上所以如果一切顺利的话,你应该可以看到一个 X 的鼠标 光标可以让你移动了。接下来,请按下 [ctrl]+[alt]+[F1] 回到刚刚下达指令的终端机:

2. 输入数个可以在 X 当中执行的虚拟终端机
[dmtsai@study ~]$ xterm -display :1 &
[dmtsai@study ~]$ xterm -display :1 &

去到 tty3 查阅一下。唉~没有多出一个终端机啊? 这是因为两个终端机 重迭了~我们又无法移动终端机,所以只看到一个。 接下来,请再次回到 tty1 去下达指令吧!(可能需要 yum install xorg-x11-apps 喔!)

3. 在输入不同的 X client 观察观察,分别去到 tty3 观察喔!
[dmtsai@study ~]$ xclock -display :1 &
[dmtsai@study ~]$ xeyes -display :1 &

加载窗口管理员

4. 输入可以管理的 window manager,我们这边先以 root 来安装 twm 喔!
[root@study ~]# yum install http://ftp.ksu.edu.tw/FTP/CentOS/6/os/x86_64/\
> Packages/xorg-x11-twm-1.0.3-5.1.el6.x86_64.rpm
# 真要命!CentOS 7 说 twm 已经没有在维护,所以没有提供这玩意儿了!鸟哥只好拿旧版的 twm 来安装!
# 请您自行到相关的网站上找寻这个 twm 啰!因为版本可能会不一样!
[root@study ~]# yum install xorg-x11-fonts-{100dpi,75dpi,Type1} 5. 接下来就可以开始用 dmtsai 的身份来玩一下这玩意儿了!
[dmtsai@study ~]$ twm -display :1 &

玩玩看先!

6. 将所有刚刚建立的 X 相关工作全部杀掉! [dmtsai@study ~]# kill %6 %5 %4 %3 %2 %1

Linux学习-什么是 X Window System的更多相关文章

  1. Linux X Window System运行原理和启动过程

    本文主要说明X Window System的基本运行原理,其启动过程,及常见的跨网络运行X Window System. 一) 基本运行原理 X Window System采用C/S结构,但和我们常见 ...

  2. linux学习第一天(X window 及 语系查询设置)

    前言: 在写这篇博文之前,我已经详细阅读了<鸟哥的Linux私房菜>,但是实践并不深入,只是单纯的为了了解常用的命令,扩展自己的知识广度.看过一遍感觉收获还是有的,但是并不是很精通.因此, ...

  3. Linux学习-Linux历史(总结篇)

    Linux之前,Unix的历史 1969年以前,一个伟大的梦想:Bell,MIT与GE的Multics系统 在此之前的计算机主机少,用户从多,程序是在读卡纸上打洞,光是等待.为了更加强化大型主机的功能 ...

  4. linux学习心得之目录树开端与/etc(图文)

    linux学习心得之目录树开端与/etc(图文) linux中“一切皆文件”,学习linux一年了,在学习过程中对目录树的一点心得,分享给大家,有不对的地方敬请斧正. 不多说了,先上图: 根目录: / ...

  5. Linux学习之Centos(三)------系统文件目录及含义详解

    Linux学习之Centos 之三------文件目录及含义 在了解了每个文件的相关种类与属性,以及了解了如何更改文件属性/权限的相关信息后,再来要了解的就是, 为什么每套Linux distribu ...

  6. Linux学习之CentOS(五)--CentOS下VMware-Tools安装

    已经进入到了Linux学习之CentOS的第六篇随笔了,所以这里就介绍一下VMware-Tools的安装. VMware-Tools的安装 VMware-Tools 主要的功能就是让用户在虚拟机和真实 ...

  7. Linux学习之CentOS(三)--初识linux的文件系统以及用户组等概念

    Linux学习之CentOS(三)--初识linux的文件系统以及用户组等概念 进入到了Linux学习之CentOS第三篇了,这篇文章主要记录下对linux文件系统的初步认识,以及用户组.用户权限.文 ...

  8. linux学习:【第3篇】远程连接及软件安装

    狂神声明 : 文章均为自己的学习笔记 , 转载一定注明出处 ; 编辑不易 , 防君子不防小人~共勉 ! linux学习:[第3篇]远程连接及软件安装 远程连接 xshell , xftp软件官网 : ...

  9. Linux 学习笔记之超详细基础linux命令 Part 5

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 4----------------- ...

随机推荐

  1. PHP&Java 调用C#的WCF

    步骤一:用C#声明WCF [ServiceContract] public interface IService1 { [OperationContract] void DoWork(); [Oper ...

  2. java ReentranLock锁

    1.效果和synchronized一样,都可以同步执行,lock方法获得锁,unlock方法释放锁 使用示例: package com.test; import java.util.concurren ...

  3. 选择控件js插件和使用方法

    记录一下 选择控件js插件 /* * 滚动控件,包含地址选择.时间选择.自定义单选 */ //js_inputbox input 输入框 //js_pickviewselect 下拉单项选择 //js ...

  4. Mind must be master of the body, strong mind can separate the body from its suffering.

    Mind must be master of the body, strong mind can separate the body from its suffering.意志是身体的主人,有顽强的意 ...

  5. canvas雪花特效-jQuery插件实现

    这是一款效果十分逼真的html5 canvas下雪场景动画特效插件.这款下雪特效是基于Jason Brown的Snowfall jquery plugin的基础上制作的.在Snowfall jquer ...

  6. Locust安装教程与使用

    Locust安装教程与使用官网地址:https://github.com/locustio/locust 如果是python3+以上的环境,需要下载locust项目源码进行安装 因Centos7.2环 ...

  7. MyEclipse Update Progress Error解决方法

    MyEclipse Update Progress Error现象:频繁弹出Update Progress(Time of error:……)窗口..log文件里 org.eclipse.swt.SW ...

  8. CodeForces 52C Circular RMQ (线段树)

    线段树区间更新维护最小值...记得下放标记... 如果线段树上的一个完整区间被修改,那么最小值和最大值增加相应的值后不变, 会改变是因为一部分改变而另外一部分没有改变所以维护一下就好. 询问的时候也要 ...

  9. Spark Job调优(Part 2)

    原文链接:https://wongxingjun.github.io/2016/05/11/Spark-Job%E8%B0%83%E4%BC%98-Part-2/ 这篇文章将会完成Part 1中留下的 ...

  10. linux readahead

    blockdev --getra /dev/sda blockdev --setra 2048 /dev/sda 必须将其写入配置文件/etc/rc.local,否则重启就会失效.[root@loca ...