zoukankan      html  css  js  c++  java
  • Linux学习-什么是 X Window System

    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 Window System 的架构

    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 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
    
  • 相关阅读:
    Python+Selenium学习笔记8
    Python+Selenium学习笔记7
    Python+Selenium学习笔记6
    Python+Selenium学习笔记5
    Python+Selenium学习笔记4
    java类为什么是单继承。类的继承,实现接口。
    类,对象之间的关系
    java 向上转型 向下转型
    jsp 中 request.getHeader() 相关详细
    MyEclipse使用经验总结
  • 原文地址:https://www.cnblogs.com/uetucci/p/7794080.html
Copyright © 2011-2022 走看看