鸟哥的 Linux 私房菜
Linux 基础篇 | Linux 服务器篇 | Linux 企业应用篇 | 安全管理
     
 
第二十四章、 X Window 设定介绍
最近更新日期:2009/08/07
在 Linux 上头的图形介面我们称之为 X Window System,简称为 X 或 X11 啰! 为何称之为系统呢?这是因为 X 视窗系统又分为 X server 与 X client ,既然是 Server/Client (主从架构) 这就表示其实 X 视窗系统是可以跨网络且跨平台的!X 视窗系统对于 Linux 来说仅是一个软件, 只是这个软件日趋重要喔!因为 Linux 是否能够在桌上型电脑上面流行,与这个 X 视窗系统有关啦! 好在,目前的 X 视窗系统整合到 Linux 已经非常优秀了,而且也能够具有 3D 加速的功能, 只是,我们还是得要了解一下 X 视窗系统才好,这样如果出问题,我们才有办法处理啊!


大标题的图示什么是 X Window System

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

事实上, X Window System 是个非常大的架构,他还用到网络功能呢!也就是说,其实 X 视窗系统是能够跨网络与跨作业系统平台的! 而鸟哥这个基础篇是还没有谈到服务器与网络主从式架构,因此 X 在这里并不容易理解的。不过,没关系! 我们还是谈谈 X 怎么来的,然后再来谈谈这 X 视窗系统的元件有哪些,慢慢来,应该还是能够理解 X 的啦!


小标题的图示X Window 的发展简史

X Window 系统最早是由 MIT (Massachusetts Institute of Technology, 麻省理工学院) 在 1984 年发展出来的, 当初 X 就是在 Unix 的 System V 这个作业系统版本上面开发出来的。在开发 X 时,开发者就希望这个视窗介面不要与硬体有强烈的相关性,这是因为如果与硬体的相关性高,那就等于是一个作业系统了, 如此一来的应用性会比较局限。因此 X 在当初就是以应用程序的概念来开发的,而非以作业系统来开发。

由于这个 X 希望能够透过网络进行图形介面的存取,因此发展出许多的 X 通讯协定,这些网络架构非常的有趣, 所以吸引了很多厂商加入研发,因此 X 的功能一直持续在加强!一直到 1987 年更改 X 版本到 X11 ,这一版 X 取得了明显的进步, 后来的视窗介面改良都是架构于此一版本,因此后来 X 视窗也被称为 X11 。这个版本持续在进步当中,到了 1994 年发布了新版的 X11R6 ,后来的架构都是沿用此一释出版本,所以后来的版本定义就变成了类似 1995 年的 X11R6.3 之类的样式。 (注1)

1992 年 XFree86 (http://www.xfree86.org/) 计划顺利展开, 该计划持续在维护 X11R6 的功能性,包括对新硬体的支援以及更多新增的功能等等。当初定名为 XFree86 其实是根据‘ X + Free software + x86 硬体 ’而来的呢。早期 Linux 所使用的 X Window 的主要核心都是由 XFree86 这个计划所提供的,因此,我们常常将 X 系统与 XFree86 挂上等号的说。

不过由于一些授权的问题导致 XFree86 无法继续提供类似 GPL 的自由软件,后来 Xorg 基金会就接手 X11R6 的维护! Xorg (http://www.x.org/) 利用当初 MIT 发布的类似自由软件的授权, 将 X11R6 拿来进行维护,并且在 2004 年发布了 X11R6.8 版本,更在 2005 年后发表了 X11R7.x 版。 现在我们 CentOS 5.x 使用的 X 就是 Xorg 提供的 X11R7 喔! 而这个 X11R6/X11R7 的版本是自由软件,因此很多组织都利用这个架构去设计他们的图形介面喔!包括 Mac OS X v10.3 也曾利用过这个架构来设计他们的视窗呢!我们的 CentOS 也是利用 Xorg 提供的 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 来将结果透过他所管理的硬体绘制出来! 整体的架构我们大约可以使用如下的图示来作个介绍:(注2)

X Window System 的架构
图 1.2.1、 X Window System 的架构 (注2)

上面的图示非常有趣喔!我们在用户端想要取得来自服务器的图形资料时,我们用户端使用的当然是用户端的硬体设备啊, 所以,X Server 的重点就是在管理用户端的硬体,包括接受键盘/滑鼠等设备的输入资讯, 并且将图形绘制到荧幕上 (请注意上图的所有元件之间的箭头指示)。但是到底要绘制个啥东西呢? 绘图总是需要一些数据才能绘制吧?此时 X Client (就是 X 应用程序) 就很重要啦!他主要提供的就是告知 X Server 要绘制啥东西。那照这样的想法来思考,我们是想要取得远端服务器的绘图数据来我们的电脑上面显示嘛! 所以啰,远端服务器提供的是 X client 软件啊!

底下就让我们来更深入的聊一聊这两个元件吧!


  • X Server:硬体管理、荧幕绘制与提供字型功能:

既然 X Window System 是要显示图形介面,因此理所当然的需要一个元件来管理我主机上面的所有硬体设备才行! 这个任务就是 X Server 所负责的。而我们在 X 发展简史当中提到的 XFree86 计划及 Xorg 基金会,主要提供的就是这个 X Server 啦!那么 X Server 管理的设备主要有哪些呢?其实与输入/输出有关喔!包括键盘、滑鼠、手写板、显示器 (monitor) 、荧幕解析度与色彩深度、显示卡 (包含驱动程序) 与显示的字型等等,都是 X Server 管理的。

咦!显示卡、荧幕以及键盘滑鼠的设定,不是在开机的时候 Linux 系统以 /etc/sysconfig 目录下的 keyboard/mouse 等设定档就设好了吗?为何 X Server 还要重新设定啊?这是因为 X Window 在 Linux 里面仅能算是‘一套很棒的软件’, 所以 X Window 有自己的设定档,你必须要针对他的设定档设定妥当才行。也就是说, Linux 的设定与 X Server 的设定不一定要相同的!因此,你在 Linux 的 run level 3 想要玩图形介面时,就得要载入 X Window 需要的驱动程序才行~总之, X Server 的主要功能就是在管理‘主机’上面的显示硬体与驱动程序。

既然 X Window System 是以透过网络取得图形介面的一个架构,那么用户端是如何取得服务器端提供的图形画面呢? 由于服务器与用户端的硬体不可能完全相同,因此我们用户端当然不可能使用到服务器端的硬体显示功能! 举例来说,你的用户端电脑并没有 3D 影像加速功能,那么你的画面可能呈现出服务器端提供的 3D 加速吗? 当然不可能吧!所以啰 X Server 的目的在管理用户端的硬体设备!也就是说:‘每部用户端主机都需要安装 X Server,而服务器端则是提供 X Client 软件, 以提供用户端绘图所需要的数据资料’。

X Server / X Client 的互动并非仅有 client --> server,两者其实有互动的!从上图 1.2.1 我们也可以发现, X Server 还有一个重要的工作,那就是将来自输入装置 (如键盘、滑鼠等) 的动作告知 X Client, 你晓得, X Server 既然是管理这些周边硬体,所以,周边硬体的动作当然是由 X Server 来管理的, 但是 X Server 本身并不知道周边设备这些动作会造成什么显示上的效果, 因此 X Server 会将周边设备的这些动作行为告知 X Client ,让 X Client 去伤脑筋。


  • X Client:负责 X Server 要求的‘事件’之处理:

前面提到的 X Server 主要是管理显示介面与在荧幕上绘图,同时将输入装置的行为告知 X Client, 此时 X Client 就会依据这个输入装置的行为来开始处理,最后 X Client 会得到‘ 嗯!这个输入装置的行为会产生某个图示’,然后将这个图示的显示资料回传给 X Server , X server 再根据 X Client 传来的绘图资料将他描图在自己的荧幕上,来得到显示的结果。

也就是说, 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 的画面中,将滑鼠向右移动,那他是怎么告知 X Server 与 X Client 的呢? 首先, X server 会探测到滑鼠的移动,但是他不知道应该怎么绘图啊!此时,他将滑鼠的这个动作告知 X Client, X Client 就会去运算,结果得到,嘿嘿!其实要将滑鼠指标向右移动几个位素,然后将这个结果告知 X server , 接下来,您就会看到 X Server 将滑鼠指标向右移动啰~

这样做有什么好处啊?最大的好处是, X Client 不需要知道 X Server 的硬体配备与作业系统!因为 X Client 单纯就是在处理绘图的资料而已,本身是不绘图的。所以,在用户端的 X Server 用的是什么硬体?用的是哪套作业系统?服务器端的 X Client 根本不需要知道~相当的先进与优秀~对吧! ^_^ 整个运作流程可以参考下图:用户端用的是什么作业系统在 Linux 主机端是不在乎的!

X Server 用户端的作业系统与 X client 的沟通示意
图 1.2.2、 X Server 用户端的作业系统与 X client 的沟通示意


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

刚刚前面提到,X Client 的主要工作是将来自 X Server 的资料处理成为绘图数据,再回传给 X server 而已, 所以 X client 本身是不知道他在 X Server 当中的位置、大小以及其他相关资讯的。这也是上面我们谈到的, X client 彼此不知道对方在荧幕的哪个位置啊!为了克服这个问题,因此就有 Window Manager (WM, 视窗管理员) 的产生了。 视窗管理员也是 X client ,只是他主要在负责全部 X client 的管理,还包括提供某些特殊的功能,例如:

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

我们常常听到的 KDE, GNOME, XFCE 还有阳春到爆的 twm 等等,都是一些视窗管理员的专案计划啦! 这些专案计划中,每种视窗管理员所用以开发的显示引擎都不太相同,所著重的方向也不一样, 因此我们才会说,在 Linux 底下,每套 Window Manager 都是独特存在的,不是换了桌面与显示效果而已, 而是连显示的引擎都不会一样喔!底下是这些常见的视窗管理员全名与连结:

由于 Linux 越来越朝向 Desktop 桌上型电脑使用方向走,因此视窗管理员的角色会越来越重要! 目前我们 CentOS 预设提供的有 GNOME 与 KDE ,这两个视窗管理员上面还有提供非常多的 X client 软件, 包括办公室生产力软件 (Open Office) 以及常用的网络功能 (firefox 浏览器、 Thunderbird 收发信件软件) 等。 现在使用者想要接触 Linux 其实真的越来越简单了,如果不要搭建服务器,那么 Linux 桌面的使用与 Windows 系统可以说是一模一样的!不需要学习也能够入门哩! ^_^

那么你知道 X Server / X client / window manager 的关系了吗?我们举 CentOS 预设的 GNOME 为例好了, 由于我们要在本机端启动 X Window system ,因此,在我们的 CentOS 主机上面必须要有 Xorg 的 X server 核心, 这样才能够提供荧幕的绘制啊~然后为了让视窗管理更方便,于是就加装了 GNOME 这个计划的 window manager , 然后为了让自己的使用更方便,于是就在 GNOME 上面加上更多的视窗应用软件,包括输入法等等的, 最后就建构出我们的 X Window System 啰~ ^_^!所以你也会知道,X server/X client/Window Manager 是同时存在于我们一台 Linux 主机上头的啦!


  • Display Manager:提供登入需求

谈完了上述的资料后,我们得要了解一下,那么我如何取得 X Window 的控制?在本机的文字介面底下你可以输入 startx 来启动 X 系统,此时由于你已经登入系统了,因此不需要重新登入即可取得 X 环境。但如果是 runlevel 5 的环境呢?你会发现在 tty7 的地方有个可以让你使用图形介面登入 (输入帐号密码) 的咚咚,那个是啥? 是 X Server/X client 还是什么的?其实那是个 Display Manager 啦!这个 display manager 最大的任务就是提供登入的环境, 并且载入使用者选择的 Window Manager 与语系等资料喔!

几乎所有的大型视窗管理员专案计划都会提供 display manager 的,在 CentOS 上面我们主要利用的是 GNOME 的 GNOME Display Manager (gdm) 这支程序来提供 tty7 的图形介面登入喔!至于登入后取得的视窗管理员, 则可以在 gdm 上面进行选择的!我们在第五章介绍的登入环境, 那个环境其实就是 gdm 提供的啦!再回去参考看看图示吧! ^_^!所以说,并非 gdm 只能提供 GNOME 的登入而已喔!


小标题的图示X Window 的启动流程

现在我们知道要启动 X Window System 时,必须要先启动管理硬体与绘图的 X Server ,然后才载入 X Client 。 基本上,目前都是使用 Window Manager 来管理视窗介面风格的。那么如何取得这样的视窗系统呢? 你可以透过登入本机的文字介面后,输入 startx 来启动 X 视窗;也能够透过 display manager (如果有启动 runlevel 5) 提供的登入画面,输入你的帐号密码来登入与取得 X 视窗的!

问题是,你的 X server 设定档为何?如何修改解析度与显示器?你能不能自己设定预设启动的视窗管理员? 如何设定预设的使用者环境 (与 X client 有关) 等等的,这些资料都需要透过了解 X 的启动流程才能得知! 所以,底下我们就来谈谈如何启动 X 的流程吧! ^_^


  • 在文字介面启动 X :透过 startx 指令

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

事实上,当你在纯文字介面且并没有启动 X 视窗的情况下来输入 startx 时,这个 startx 的作用就是在帮你设定好上头提到的这些动作啰! startx 其实是一个 shell script ,他是一个比较亲和的程序,会主动的帮忙使用者建立起他们的 X 所需要引用的设定档而已。你可以自行研究一下 startx 这个 script 的内容,鸟哥在这里仅就 startx 的作用作个介绍。

startx 最重要的任务就是找出使用者或者是系统预设的 X server 与 X client 的设定档,而使用者也能够使用 startx 外接参数来取代设定档的内容。这个意思是说:startx 可以直接启动,也能够外接参数,例如底下格式的启动方式:

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

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

startx 后面接的参数以两个减号‘--’隔开,前面的是 X Client 的设定,后面的是 X Server 的设定。 上面的范例是让 X server 以色彩深度 16 bit 色 (亦即每一像素占用 16 bit ,也就是 65536 色) 显示, 因为色彩深度是与 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 底下的终端机软件)

根据上述的流程找到启动 X 时所需要的 X server / X client 的参数,接下来 startx 会去呼叫 xinit 这支程序来启动我们所需要的 X 视窗系统整体喔!接下来当然就是要谈谈 xinit 啰~


  • 由 startx 呼叫执行的 xinit

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

[root@www ~]# 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 的内容是这样的:(注3)

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 系统时,你就会发现 tty7 有画面了!只是.....很丑~因为我们还没有启动 window manager 啊!

从上面的说明我们可以知道, xinit 主要在启动 X server 与载入 X client ,但这个 xinit 所需要的参数则是由 startx 去帮忙找寻的。因此,最重要的当然就是 startx 找到的那些参数啦! 所以呢,重点当然就是 /etc/X11/xinit/ 目录下的 xinitrc 与 xserverrc 这两个文件的内容是啥啰~ 虽然 xserverrc 预设是不存在的。底下我们就分别来谈一谈这两个文件的主要内容与启动的方式~


  • 启动 X server 的文件: xserverrc

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

在启动 X Server 时,Xorg 会去读取 /etc/X11/xorg.conf 这个设定档。针对这个设定档的内容, 我们会在下个小节介绍。如果一切顺利,那么 X 就会顺利的在 tty7 的环境中启动了 X 。 单纯的 X 启动时,你只会看到画面一片漆黑,然后中心有个滑鼠的游标而已~

由前一小节的说明中,你可以发现到其实 X 启动的时候还可以指定启动的介面喔!那就是 :0 这个参数,这是啥? 事实上我们的 Linux 可以‘同时启动多个 X’喔!第一个 X 的画面会在 :0 亦即是 tty7 ,第二个 X 则是 :1 亦即是 tty8 。 后续还可以有其他的 X 存在的。因此,上一小节我们也有发现, xterm 在载入时,也必须要使用 -display 来说明, 这个 X 应用程序是需要在哪个 X 载入的才行呢!其中比较有趣的是, X server 未注明载入的介面时,预设是使用 :0 ~ 但是 X client 未注明时,则无法执行喔!

启动了 X server 后,接下来就是载入 X client 到这个 X server 上面啦!


  • 启动 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 。你可以参考 xinitrc 后去搜寻各个文件来了解彼此的关系。

不过分析到最后,其实最终就是载入 KDE 或者是 GNOME 而已。你也可以发现最终在 XClient 文件当中会有两个指令的搜寻, 包括 startkde 与 gnome-session 这两个,这也是 CentOS 预设会提供的两个主要的 Window Manager 啰。 而你也可以透过修改 /etc/sysconfig/desktop 内的 DESKTOP=GNOME 或 DESKTOP=KDE 来决定预设使用哪个视窗管理员的。 如果你并没有安装这两个大家伙,那么 X 就会去使用阳春的 twm 这个视窗管理员来管理你的环境啰。

Tips:
不论怎么说,鸟哥还是希望大家可以透过解析 startx 这个 script 的内容去找到每个文件, 再根据分析每个文件来找到您 distributions 上面的 X 相关文件~ 毕竟每个版本的 Linux 还是有所差异的~
鸟哥的图示

另外,如果有特殊需求,你当然可以自订 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 时,直接使用 startx 来找到 X server 与 X client 的参数或设定档, 然后再呼叫 xinit 来启动 X 视窗系统。xinit 先载入 X server 到预设的 :0 这个显示介面 (预设在 tty7),然后再载入 X client 到这个 X 显示介面上。而 X client 通常就是 GNOME 或 KDE ,这两个设定也能够在 /etc/sysconfig/desktop 里面作好设定。最后我们想要了解的是,既然 X 是可以跨网络的,那 X 启动的端口是几号?

其实,CentOS 由于考虑 X 视窗是在本机上面运作,因此将端口改为插槽档 (socket) 了,因此你无法观察到 X 启动的端口的。事实上, X server 应该是要启动一个 port 6000 来与 X client 进行沟通的! 由于系统上面也可能有多个 X 存在,因此我们就会有 port 6001, port 6002... 等等。这也就是说:

X 视窗系统显示介面号码预设终端机网络监听端口
第一个 Xhostname:0tty7port 6000
第二个 Xhostname:1tty8port 6001

在 X Window System 的环境下,我们称 port 6000 为第 0 个显示介面,亦即为 hostname:0 , 那个主机名称通常可以不写,所以就成了 :0 即可。在预设的情况下,第一个启动的 X (不论是启动在第几个 port number) 是在 tty7 ,亦即按下 [ctrl]+[Alt]+[F7] 那个画面。 而起动的第二个 X (注意到了吧!可以有多个 X 同时启动在您的系统上呢) 则预设在 tty8 亦即 [ctrl]+[Alt]+[F8] 那个画面呢!很神奇吧! ^_^

如前所述,因为主机上的 X 可能有多个同时存在,因此,当我们在启动 X Server / Client 时, 应该都要注明该 X Server / Client 主要是提供或接受来自哪个 display 的 port number 才行。


小标题的图示X 启动流程测试

好了,我们可以针对 X Server 与 X client 的架构来做个简单的测试喔! 由于鸟哥不知道你到底有没有启动过 X ,因此底下鸟哥将这个练习指定于第二个 X ,亦即是 :1 这个显示位置来显示喔! 而且,底下的指令都是在 tty1 的地方执行的,至于底下的画面则是在 tty8 的地方展现。 因此,请自行切换 tty1 下达指令与 tty8 查阅结果啰!(如果是 CentOS 之类的 Red Hat 系统,请务必要启动 xfs 这个服务喔!)

1. 先来启动第一个 X 在 :1 画面中:
[root@www ~]# X :1 &
单纯启动 X server的情况
图 1.4.1 、 单纯启动 X server的情况

上述的 X 是大写,那个 :1 是写在一起的,至于 & 则是放到背景去执行。此时系统会主动的跳到第二个图形介面终端机,亦即 tty8 上喔!所以如果一切顺利的话,你应该可以看到一个 X 的滑鼠游标可以让你移动了(如上图所示)。 该画面就是 X Server 启动的画面啰!丑丑的,而且没有什么 client 可以用啊! 接下来,请按下 [ctrl]+[alt]+[F1] 回到刚刚下达指令的终端机:

2. 输入数个可以在 X 当中执行的虚拟终端机
[root@www ~]# xterm -display :1  &
[root@www ~]# xterm -display :1  &
在 X 上面启动 xterm 终端机显示的结果
图 1.4.2 、 在 X 上面启动 xterm 终端机显示的结果

那个 xterm 是必须要在 X 底下才能够执行的终端机介面。加入的参数 -display 则是指出这个 xterm 要在那个 display 使用的。这两个指令请不要一次下完!先执行一次,然后按下 [ctrl]+[alt]+[F8] 去到 X 画面中,你会发现多了一个终端机啰~ 不过,可惜的是,你无法看到终端机的标题、也无法移动终端机,当然也无法调整终端机的大小啊!我们回到刚刚的 tty1 然后再次下达 xterm 指令,理论上应该多一个终端机,去到 tty8 查阅一下。唉~没有多出一个终端机啊? 这是因为两个终端机重叠了~我们又无法移动终端机,所以只看到一个。 接下来,请再次回到 tty1 去下达指令吧!

3. 在输入不同的 X client 观察观察,分别去到 tty8 观察喔!
[root@www ~]# xclock -display :1  &
[root@www ~]# xeyes -display :1  &
分别启动 xclock 时钟与 xeyes 眼睛的结果
图 1.4.3 、 分别启动 xclock 时钟与 xeyes 眼睛的结果

跟前面一样的,我们又多执行了两个 X client ,其中 xclock 会显示时钟,而 xeyes 则是会出现一双大眼睛来盯着游标! 你可以移动一下游标就可以发现眼睛的焦聚会跑啊 ^_^!不过,目前的四个 X client 通通不能够移动与放大缩小! 如此一来,你怎么在 xterm 底下下达指令啊?当然就很困扰~所以让我们来载入最阳春的视窗管理员吧!

4. 输入可以管理的 window manager
[root@www ~]# twm -display :1  &
视窗管理员 twm 的功能显示
图 1.4.4 、 视窗管理员 twm 的功能显示

回到 tty1 后,用最简单的 twm 这个视窗管理员来管理我们的 X 吧!输入之后,去到 tty8 看看,用滑鼠移动一下终端机看看?可以移动了吧?也可以缩小放大视窗啰~同时也出现了标题提示啰~也看到两个终端机啦! 现在终于知道视窗管理员的重要性了吧? ^_^!在黑荧幕地方按下滑鼠右键,就会出现类似上面画面最右边的选单, 你就可以进行额外的管理啰~玩玩看先!

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

很有趣的一个小实验吧~透过这个实验,你应该会对 X server 与 Window manager 及 tty7 以后的终端介面使用方式有比较清楚的了解~加油!


小标题的图示我是否需要启用 X Window System

谈了这么多 X 视窗系统方面的资讯后,再来聊聊,那么你的 Linux 主机是否需要预设就启动 X 视窗呢? 一般来说,如果你的 Linux 主机定位为网络服务器的话,那么由于 Linux 里面的主要服务的设定档都是纯文字的格式文件, 相当的容易设定的,所以啊,根本就是不需要 X Window 存在呢!因为 X Window 仅是 Linux 系统内的一个软件而已啊!

但是万一你的 Linux 主机是用来作为你的桌上电脑用的,那么 X Window 对你而言,就是相当重要的一个咚咚了!因为我们日常使用的办公室软件,都需要使用到 X Window 图形的功能呢!此外,以鸟哥的例子来说,俺之前接触到的数值分析模式,需要利用图形处理软件来将资料读取出来, 所以在那部 Linux 主机上面,我一定需要 X Window 的。

回归到主题上面,除了主机的用途决定你是否需要启用 X Window 之外, 主机的‘配备’也是你必须要考虑的一项决定性因素。因为 X Window 如果要美观,可能需要功能较为强大的 KDE 或 GNOME 等视窗管理员的协助,但是这两个庞然大物对于系统的要求又很高,除了 CPU 等级要够,RAM 要足之外,显示卡的等级也不能太差~所以,早期的主机可能对于 X Window 就没有办法具有很好的执行效率了。

也就是说,你如果想要玩 X Window 的话,特别需要考虑到这两点:

  • 稳定性

    X Window 仅是 Linux 上面的一个软件,虽然目前的 X window 已经整合得相当好了,但任何程序的设计都或多或少会有些臭虫, X 当然也不例外。此外,在你的 Linux 服务器上面启用 X 系统的话,自然多一组程序的启用 (X Window 会启动多个程序来执行各项任务) ,系统的不确定性当然可能会增加一些。 因此,鸟哥不是很建议对 Internet 开放的服务器启动 X Window 的啦!

  • 效能

    无论怎么说,程序在跑总是需要系统资源的,所以,多启用了 X 就会造成一些系统资源的损耗。 此外,上面也稍稍提到,某些 X 的软件是相当耗费系统资源的呢!所以,启动 X 可能会让你的可用系统资源 (尤其是记忆体) 降低很多,可能会造成系统效能较低落的问题。
Tips:
鸟哥刚开始接触 Linux (大约是在 1999 年左右)时,由于不熟,通常都是预设给他启用 X Window 在我的主机上面的。 不过,那个时候的图形介面与 Linux kernel 的整合度比较差, 老是挂点去,是常常造成主机上面的网络服务无法顺畅的原因之一呢!
鸟哥的图示

就鸟哥的使用经验来看, GNOME 速度稍微快一点, KDE 的介面感觉比较具有亲和力!不过,总体而言, 这个 X Window System 的速度其实并不是那么棒!如果你有其他图形介面的需求时,可以使用 yum 去安装一下 XFCE 这一套,XFCE 是比较轻量级的视窗管理员,据说使用上速度比 GNOME 还快些。 最近很火红的 Ubuntu 的分支之一 Xubuntu 据说就是使用这套视窗管理员喔!试看看吧! ^_^


大标题的图示X Server 设定档解析与设定

从前面的说明来看,我们知道一个 X 视窗系统能不能成功启动,其实与 X Server 有很大的关系的。因为 X Server 负责的是整个画面的描绘,所以没有成功启动 X Server 的话,即使有启动 X Client 也无法将图样显示出来啊。所以,底下我们就针对 X Server 的设定档来做个简单的说明,好让大家可以成功的启动 X Window System 啊。

基本上, X Server 管理的是显示卡、荧幕解析度、滑鼠按键对应等等,尤其是显示卡晶片的认识,真是重要啊。 此外,还有显示的字体也是 X Server 管理的一环。基本上,X server 的设定档都是预设放置在 /etc/X11 目录下,而相关的显示模组或上面提到的总总模组,则主要放置在 /usr/lib/xorg/modules 底下。比较重要的是字型档与晶片组,她们主要放置在:

  • 提供的荧幕字型: /usr/share/X11/fonts/
  • 显示卡的晶片组: /usr/lib/xorg/modules/drivers/

在 CentOS 底下,我们可以透过 chkfontpath 这个指令来取得目前系统有的字型文件目录。 这些都要透过一个统一的设定档来规范,那就是 X server 的设定档啦。这个设定档的档名就是 /etc/X11/xorg.conf 喔!


小标题的图示解析 xorg.conf 设定

如同前几个小节谈到的,在 Xorg 基金会里面的 X11 版本为 X11R7.xx ,那如果你想要知道到底你用的 X Server 版本是第几版,可以使用 X 指令来检查喔!(你必须以 root 的身分执行下列指令)

[root@www ~]# X -version
X Window System Version 7.1.1
Release Date: 12 May 2006
X Protocol Version 11, Revision 0, Release 7.1.1
Build Operating System: Linux 2.6.18-53.1.14.el5PAE i686 Red Hat, Inc.
Current Operating System: Linux localhost.localdomain 2.6.18-128.1.14.el5 #1 
SMP Wed Jun 17 06:40:54 EDT 2009 i686
Build Date: 21 January 2009
Build ID: xorg-x11-server 1.1.1-48.52.el5
        Before reporting problems, check http://wiki.x.org
        to make sure that you have the latest version.
Module Loader present

由上面的几个关键字我们可以知道,目前鸟哥的这部测试机使用的 X server 是 Xorg 计划所提供的 X11R7 版, 若有问题则可以到 http://wiki.x.org 去查询~因为是 Xorg 这个 X server ,因此我们的设定档档名为 /etc/X11/xorg.conf 这一个哩。所以,理解这个文件的内容对于 X server 的功能来说,是很重要的。

注意一下,在修改这个文件之前,务必将这个文件给她备份下来,免的改错了什么东西导致连 X server 都无法启动的问题啊。这个文件的内容是分成数个段落的,每个段落以 Section 开始,以 EndSection 结束, 里面含有该 Section (段落) 的相关设定值,例如:

Section  "section name"
…… <== 与这个 section name 有关的设定项目
……
EndSection

至于常见的 section name 主要有:

  1. Module: 被载入到 X Server 当中的模组 (某些功能的驱动程序);
  2. InputDevice: 包括输入的 1. 键盘的格式 2. 滑鼠的格式,以及其他相关输入设备;
  3. Files: 设定字型所在的目录位置等;
  4. Monitor: 监视器的格式, 主要是设定水平、垂直的更新频率,与硬体有关;
  5. Device: 这个重要,就是显示卡晶片组的相关设定了;
  6. Screen: 这个是在荧幕上显示的相关解析度与色彩深度的设定项目,与显示的行为有关;
  7. ServerLayout: 上述的每个项目都可以重覆设定,这里则是此一 X server 要取用的哪个项目值的设定啰。

好了,直接来看看这个文件的内容吧!这个文件预设的情况是取消很多设定值的,所以你的设定档可能不会看到这么多的设定项目。 不要紧的,后续的章节会交代如何设定这些项目的喔!

[root@www ~]# cd /etc/X11
[root@www X11]# cp -a xorg.conf xorg.conf.20090713  <== 有备份有保佑
[root@www X11]# vim xorg.conf
Section "Module"
        Load  "dbe"
        Load  "extmod"
        Load  "record"
        Load  "dri"
        Load  "xtrap"
        Load  "glx"
        Load  "vnc"
EndSection
# 上面这些模组是 X Server 启动时,希望能够额外获得的相关支援的模组。
# 关于更多模组可以搜寻一下 /usr/lib/xorg/modules/extensions/ 这个目录

Section "InputDevice"
        Identifier  "Keyboard0"
        Driver      "kbd"
        Option      "XkbModel" "pc105"
        Option      "XkbLayout" "us"  <==注意,是 us 美式键盘对应
EndSection
# 这个玩意儿是键盘的对应设定资料,重点在于 XkbLayout 那一项,
# 如果没有问题的话,我们台湾地区应该都是使用美式键盘对应按钮的。
# 特别注意到 Identifier (定义) 那一项,那个是在说明,我这个键盘的设定档,
# 被定义为名称是 Keyboard0 的意思,这个名称最后会被用于 ServerLayout 中

Section "InputDevice"
        Identifier  "Mouse0"
        Driver      "mouse"
        Option      "Protocol" "auto"
        Option      "Device" "/dev/input/mice"
        Option      "ZAxisMapping" "4 5 6 7" <==滚轮支援
EndSection
# 这个则主要在设定滑鼠功能,重点在那个 Protocol 项目,
# 那个是可以指定滑鼠介面的设定值,我这里使用的是自动探测!不论是 USB/PS2。

Section "Files"
        RgbPath      "/usr/share/X11/rgb"
        ModulePath   "/usr/lib/xorg/modules"
        FontPath     "unix/:7100"  <==使用另外的服务来提供字型定义
        FontPath     "built-ins"
EndSection
# 我们的 X Server 很重要的一点就是必须要提供字型,这个 Files 
# 的项目就是在设定字型,当然啦,你的主机必须要有字型档才行。一般字型文件在:
# /usr/share/X11/fonts/ 目录中。至于那个 Rgb 是与色彩有关的项目。
# 相关的字型说明我们会在下一小节的 xfs 在跟大家报告。

Section "Monitor"
        Identifier   "Monitor0"
        VendorName   "Monitor Vendor"
        ModelName    "Monitor Model"
        HorizSync    30.0 - 80.0
        VertRefresh  50.0 - 100.0
EndSection
# 荧幕监视器的设定仅有一个地方要注意,那就是垂直与水平的更新频率。
# 在上面的 HorizSync 与 VerRefresh 的设定上,要注意,不要设定太高,
# 这个玩意儿与实际的监视器功能有关,请查询你的监视器手册说明来设定吧!
# 传统 CRT 荧幕设定太高的话,据说会让 monitor 烧毁呢,要很注意啊。

Section "Device"   <==显示卡的驱动程序项目
        Identifier  "Card0"
        Driver      "vesa"  <==实际的驱动程序喔!
        VendorName  "Unknown Vendor"
        BoardName   "Unknown Board"
        BusID       "PCI:0:2:0"
EndSection
# 这地方重要了,这就是显示卡的晶片模组载入的设定区域。由于鸟哥使用 Virtualbox
# 模拟器模拟这个测试机,因此这个地方显示的驱动程序为通用的 vesa 模组。
# 更多的显示晶片模组可以参考 /usr/lib/xorg/modules/drivers/

Section "Screen"    <==与显示的画面有关,解析度与色彩深度
        Identifier "Screen0"
        Device     "Card0"     <==使用哪个显示卡来提供显示
        Monitor    "Monitor0"  <==使用哪个监视器
        SubSection "Display"   <==此阶段的附属设定项目
                Viewport   0 0
                Depth     16   <==就是色彩深度
		Modes    "1024x768" "800x600" "640x480" <==解析度
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     24
		Modes    "1024x768" "800x600"
        EndSubSection
EndSection
# Monitor 与实际的显示器有关,而 Screen 则是与显示的画面解析度、色彩深度有关。
# 我们可以设定多个解析度,实际应用时可以让使用者自行选择想要的解析度来呈现。
# 不过,为了避免困扰,鸟哥通常只指定一到两个解析度而已。

Section "ServerLayout"   <==实际选用的设定值
        Identifier     "X.org Configured"
        Screen      0  "Screen0" 0 0              <==解析度等
        InputDevice    "Mouse0" "CorePointer"     <==滑鼠
        InputDevice    "Keyboard0" "CoreKeyboard" <==键盘
EndSection
# 我们上面设定了这么多的项目之后,最后整个 X Server 要用的项目,
# 就通通一骨脑的给他写入这里就是了,包括键盘、滑鼠以及显示介面啊。
# 其中 screen 的部分还牵涉到显示卡、监视器荧幕等设定值呢!

上面设定完毕之后,就等于将整个 X Server 设定妥当了,很简单吧。 如果你想要更新其他的例如显示晶片的模组的话,就得要去硬体开发商的网站下载原始档来编译才行。 设定完毕之后,你就可以启动 X Server 试看看啰。基本上,如果你的 Files 那个项目用的是直接写入字型的路径, 那就不需要启动 XFS (X Font Server),如果是使用 font server 时,就要先启动 xfs :

# 1. 启动 xfs 服务:
[root@www ~]# /etc/init.d/xfs start

# 2. 测试 X server 的设定档是否正常:
[root@www ~]# startx  <==直接在 runlevel 3 启动 X 看看
[root@www ~]# X :1    <==在 tty8 单独启动 X server 看看

当然,你也可以利用 init 5 这个指令直接切换到图形介面的登入来试看看啰。

Tips:
经由讨论区网友的说明,如果你发现明明有捉到显示卡驱动程序却老是无法顺利启动 X 的话,可以尝试去官网取得驱动程序来安装, 也能够将‘Device’阶段的‘Driver’修改成预设的‘Driver "vesa"’,使用该驱动程序来暂时启动 X 内的显示卡喔!
鸟哥的图示

小标题的图示X Font Server (XFS) 与加入额外中文字形

与 X 有关的设定档主要是 /etc/X11/xorg.conf 这个主设定档,但是刚刚上头解析这个文件时,在 Files 的部分我们还提到了 X Font Server (XFS) 这个服务喔!这个是啥咚咚?这个服务的目的在提供 X server 字型库啦! 也就是说, X server 所使用的字型其实是 XFS 这个服务所提供的,因此没有启动 XFS 服务时,你的 X server 是无法顺利启动的喔!所以,我们当然就来瞧瞧这玩意儿的功能啰!

这个 XFS 的主设定档在 /etc/X11/fs/config ,而字型档则在 /usr/share/X11/fonts/ ,这里再次给他强调一下。 至于启动的脚本则在 /etc/init.d/xfs 啰!好,那我们就先来瞧瞧主设定档的内容是怎样的设定吧!

[root@www ~]# vi /etc/X11/fs/config
client-limit = 10  <==最多允许几个 X server 向我要求字型(因为跨网络)
clone-self = on    <==与效能有关,若 xfs 达到限制值,启动新的 xfs
catalogue = /usr/share/X11/fonts/misc:unscaled,
        /usr/share/X11/fonts/75dpi:unscaled,
        /usr/share/X11/fonts/100dpi:unscaled,
        /usr/share/X11/fonts/Type1,
        /usr/share/X11/fonts/TTF,
        /usr/share/fonts/default/Type1,
# 上面这些咚咚,就是字型文件的所在!如果你有新字型,可以放置在该目录。

default-point-size = 120            <==预设字型大小,单位为 1/10 点字 (point)
default-resolutions = 75,75,100,100 <==这个则是显示的字型像素 (pixel)
deferglyphs = 16                    <==延迟显示的字型,此为 16 bits 字型
use-syslog = on                     <==启动支援错误登录
no-listen = tcp                     <==启动 xfs 于 socket 而非 TCP

上面这个文件的设定重点在 catalogue 那个设定项目当中。你可以使用 chkfontpath 这个指令来列出目前支援的字型文件,也可以直接修改呢!

另外,虽然目前的 CentOS 已经是支援多国语系了,因此你可以直接在安装完毕后就看到中文, 不过预设的中文字形可能让你不太满意~此时,你可以选择额外的中文字形显示喔。比较有名的中文字形除了预设提供的文鼎字型外, 还有一种台北字型 (taipeifonts),不过这种字形是 Big5 编码的,因此预设并没有在你的字型支援之中 (因为目前大多使用万国码来显示中文了)。如果你想要测试一下这种字形,除了自行下载字型档之外, 我们可以使用 CentOS 提供的软件来处理喔!看看底下的作法吧:

# 1. 先安装中文字形软件,亦即 fonts-chinese 这个软件名
[root@www ~]# yum install fonts-chinese

# 2. 查阅 taipei 字型的所在目录位置:
[root@www ~]# rpm -ql fonts-chinese | grep taipei
/usr/share/fonts/chinese/misc/taipei16.pcf.gz  <==重点在目录!
/usr/share/fonts/chinese/misc/taipei20.pcf.gz
/usr/share/fonts/chinese/misc/taipei24.pcf.gz

# 3. 建立字型档的目录架构
[root@www ~]# cd /usr/share/fonts/chinese/misc
[root@www ~]# mkfontdir
# 这个指令在建置 fonts.dir 这个文件,提供字型文件目录的说明。

# 4. 将上述的目录加入 xfs 的支援之中:
[root@www ~]# chkfontpath -a /usr/share/fonts/chinese/misc/
[root@www ~]# chkfontpath
....(前面省略)....
/usr/share/fonts/chinese/misc:unscaled
/usr/share/fonts/chinese/misc  <==这两行会被新增出来!
[root@www ~]# /etc/init.d/xfs restart

# 5. 在 X window 底下启动终端机,测试一下有没有捉到该字型?
[root@www ~]# xlsofnts | grep taipei
# 如果顺利的话,你会看到有几个 taipeiXX 的字样在荧幕上出现!

这个时候的 X server 已经有新支援的中文字形了,很简单吧!不过如果你想要让 X client 可以使用额外的字型的话,还得要使用 fontconfig 的软件提供的 fc-cache 来建立字型快取档才行 (注4)!


  • 让视窗管理员可以使用额外的字型

如果想要使用额外的字型的话,你可以自行取得某些字型来处理的。鸟哥这边从 Windows 取得三个文件来作为测试,这边得注明一下是纯粹的测试,测试完毕后文件就给她拿掉了, 并没有持续使用喔!并没有想要违法的意思啦~大家参考看看就好了。这三个文件分别是 kaiu.ttf simsun.ttc times.ttf,代表的是中楷体、明体、times and Romans 三种字体。 那就来看看如何增加字型吧!(假设上述的三个字体档是放置在 /root 中)

# 1. 将上述的三个文件放置到系统设定目录,亦即底下的目录中:
[root@www ~]# cd /usr/share/fonts/
[root@www ~]# mkdir windows
[root@www ~]# cp /root/*.tt[fc] /usr/share/fonts/windows

# 2. 使用 fc-cache 将上述的文件加入字型的支援中:
[root@www ~]# fc-cache -f -v
....(前面省略)....
/usr/share/fonts/windows: caching, 4 fonts, 0 dirs
....(中间省略)....
fc-cache: succeeded
# -v 仅是列出目前的字型资料, -f 则是强制重新建立字型快取!

# 3. 透过 fc-list 列出已经被使用的文件看看:
[root@www ~]# fc-list : file  <==找出被快取住的档名
....(前面省略)....
/usr/share/fonts/windows/kaiu.ttf:
/usr/share/fonts/windows/times.ttf:
/usr/share/fonts/windows/simsun.ttc:
....(后面省略)....

透过 fc-cache 以及 fc-list 去确认过字型确实存在后,就能够使用视窗管理员的功能去检查字型档了。 以 GNOME 为例,在‘系统’-->‘偏好设定’-->‘字型’点选后,就会出现可以调整的字型, 接下来你就会发现多出了‘楷体_GB2312、宋体、新宋体’等字体可以选择啰!试看看吧!鸟哥调整成为‘Times and Roman’ 出现如下图的结果呢!参考看看:

中文字形的调整结果
图 2.2.1、中文字形的调整结果

小标题的图示设定档重建与显示器参数微调

如果你修改 xorg.conf 结果改错了,导致无法顺利的启动 X server 时,偏偏又忘记制作备份档!该如何是好? 没关系,我们的 Xorg 有提供不错的工具可以处理。同时 CentOS 也有提供相关的设定指令, 那就是在第二十一章提到的 setup 这个指令啦! 详细的设定请自行前往参考,在这里我们要介绍的是使用 Xorg 重新制作出设定档啦!你可以使用 root 的身份这样执行:

[root@www ~]# Xorg -configure :1

此时 X 会主动的以内建的模组进行系统硬体的探索,并将硬体与字型的探测结果写入 /root/xorg.conf.new 这个文件里面去,这就是 xorg.conf 的重制结果。不过,这个新建的文件不见得真的能够启动 X server , 所以我们必须要使用底下的指令来测试一下这个新的设定档是否能够顺利的运作:

[root@www ~]# X -config /root/xorg.conf.new :1

因为鸟哥不知道你到底是在 runlevel 几号,因此上述的测试通通是在 tty8 的终端机上面显示 (display 1), 这样就能够避免切换到不同的 runlevel 啰~如果一切顺利的话,你就可以将 /root/xorg.conf.new 复制成为 /etc/X11/xorg.conf 覆盖掉修改错误的文件,然后重新启动 X ,嘿嘿!应该就能够顺利的救回来你的 X Window System 啰!


  • 关于荧幕解析度与更新率

有些朋友偶而会这样问:‘我的显示器明明还不错,但是荧幕解析度却永远只能达到 800x600 而已, 这该如何处理?’,荧幕的解析度应该与显示卡相关性不高,而是与显示器的更新频率有关! 所谓的更新频率,指的是在一段时间内荧幕重新绘制画面的速度。举例来说, 60Hz 的更新频率, 指的是每秒钟画面更新 60 次的意思。那么关于显示器的更新频率该如何调整呢? 你得先去找到你的显示器的使用说明书 (或者是网站会有规格介绍),取得最高的更新率后,接下来选择你想要的解析度, 然后透过这个 gtf 的指令功能来调整:

[root@www ~]# gtf 水平像素 垂直像素 更新频率 [-xv]
选项与参数:
水平像素:就是解析度的 X 轴
垂直像素:就是解析度的 Y 轴
更新频率:与显示器有关,一般可以选择 60, 75, 80, 85 等频率
-x      :使用 Xorg 设定档的模式输出,这是预设值
-v      :显示探测的过程

# 1. 使用 1024x768 的解析度,75 Hz 的更新频率来取得显示器内容
[root@www ~]# gtf 1024 768 75 -x
# 1024x768 @ 75.00 Hz (GTF) hsync: 60.15 kHz; pclk: 81.80 MHz
Modeline "1024x768_75.00"  81.80  1024 1080 1192 1360  768 769 772 802  -HSync +Vsync
# 重点是 Modeline 那一行!那行给他抄下来

# 2. 将上述的资料输入 xorg.conf 内的 Monitor 项目中:
[root@www ~]# vim /etc/X11/xorg.conf
Section "Monitor"
    Identifier   "Monitor0"
    VendorName   "Monitor Vendor"
    ModelName    "Monitor Model"
    Modeline "1024x768_75.00"  81.80  1024 1080 1192 1360  768 769 772 802  -HSync +Vsync
EndSection
# 就是新增上述的那行特殊字体部分到 Monitor 的项目中即可。

然后重新启动你的 X ,这样就能够选择新的解析度啰!那如何重新启动 X 呢?两个方法, 一个是‘ init 3 ; init 5 ’从文字模式与图形模式的执行等级去切换,另一个比较简单, 如果原本就是 runlevel 5 的话,那么在 X 的画面中按下‘ [alt] + [crtl] + [backspace] ’三个组合按键, 就能够重新启动 X 视窗啰!


大标题的图示显示卡驱动程序安装范例

虽然你的 X 视窗系统已经顺利的启动了,也调整到你想要的解析度了,不过在某些场合底下,你想要使用显示卡提供的 3D 加速功能时,却发现 X 提供的预设的驱动程序并不支援!此时真是欲哭无泪啊~那该如何是好?没关系,安装官方网站提供的驱动程序即可! 目前 (2009) 世界上针对 x86 提供显示卡的厂商最大的应该是 Nvidia / AMD (ATI) / Intel 这三家 (没有照市占率排列), 所以底下鸟哥就针对这三家的显示卡驱动程序安装,作个简单的介绍吧!

由于硬体驱动程序与核心有关,因此你想要安装这个驱动程序之前,请务必先参考第二十二章第二十三章的介绍,才能够顺利的编译出显示卡驱动程序喔! 建议可以直接使用 yum 去安装‘ Development Tools ’这个软件群组以及 kernel-devel 这个软件即可。


小标题的图示NVidia

虽然 Xorg 已经针对 NVidia 公司的显示卡驱动程序提供了 nv 这个模组,不过这个模组无法提供很多额外的功能。 因此,如果你想要使用新的显示卡功能时,就得要额外安装 NVidia 提供的给 Linux 的驱动程序才行。 你可以这样作的:


  • 下载驱动程序

建议你可以到 NVidia 的官网 (http://www.nvidia.com.tw) 自行去下载最新的驱动程序,你也可以到底下的连结直接查阅给 Linux 用的驱动程序:

请自行选择与你的系统相关的环境。鸟哥选择自己的测试机是 Intel Core2 架构,因此选择 Linux AMD64/EM64T 的驱动程序版本,这个版本的驱动程序档名为: NVIDIA-Linux-x86_64-xxx.yy.zz-pkg2.run ,其中的 xxx.yy.z 就是驱动程序的版本号码。我将这个文件放置到 /root家目录中。


  • 开始安装驱动程序

安装过程有点像这样 (档名依照你的环境去下载与执行):

[root@www ~]# sh NVIDIA-Linux-x86_64-185.18.14-pkg2.run
NVidia 驱动程序安装示意
图 3.1.1、NVidia 驱动程序安装示意

上面说的是授权,你必须要接受 (Accept) 才能继续。

NVidia 驱动程序安装示意
图 3.1.2、NVidia 驱动程序安装示意

我们不预期 NVidia 会帮我们编译好核心模组,因此这里选择 No ,让我们自己编译模组吧!

NVidia 驱动程序安装示意
图 3.1.3、NVidia 驱动程序安装示意

直接按下 OK 来继续下一步即可。

NVidia 驱动程序安装示意
图 3.1.4、NVidia 驱动程序安装示意

开始进行核心模组的编译!这个过程不会太久~

NVidia 驱动程序安装示意
图 3.1.5、NVidia 驱动程序安装示意

是否要安装额外的 OpenGL 函式库?要啊!就选择 Yes 吧!

NVidia 驱动程序安装示意
图 3.1.6、NVidia 驱动程序安装示意

这个时候开始安装显示卡的驱动程序,会花费一段时间喔!然后出现下图:

NVidia 驱动程序安装示意
图 3.1.7、NVidia 驱动程序安装示意

让这支安装程序主动的去修改 xorg.conf 吧!比较轻松愉快!就按下 Yes 即可。

NVidia 驱动程序安装示意
图 3.1.8、NVidia 驱动程序安装示意

最后按下 OK 就结束安装啰!这个时候如果你去查阅一下 /etc/X11/xorg.conf 的内容,会发现 Device 的 Driver 设定会成为 nvidia 而不是原本的 nv 喔!这样就搞定啰!很简单吧! 而且这个时候你的 /usr/lib64/xorg/modules/drivers 目录内,会多出一个 nvidia_drv.so 的驱动程序文件啰! 同时这个软件还提供了一支很有用的程序来帮助我们进行驱动程序升级喔!

[root@www ~]# nvidia-installer --update
# 可以进行驱动程序的升级检查喔!

好啰,那你就赶紧试看看新的显示卡晶片的功能吧。而如果有什么疑问的话,查阅一下 /var/log/nvidia 开头的登录档看看吧! ^_^


小标题的图示ATI (AMD)

ATI 已经被 AMD 收购了,而 AMD 在近期已经宣布了 ATI 的显示卡驱动程序要开放成为 Open source , 这代表未来你可以很轻松的就取得 ATI 的显示卡驱动程序而不必要重新安装的。不过,就如同前面提到的, 若你需要某些特殊功能,建议还是手动安装一下官方提供的驱动程序吧!你必须要到 AMD 的网站去下载 ATI 显示卡驱动程序哩! 你可以到 http://www.amdtaiwan.com.tw/ 选择‘ATI 驱动程序’的连结去选择你的显示卡驱动程序版本,也可以点选底下的连结:

然后去选择你的作业系统与显示卡的型号来下载。鸟哥使用另一台含有 ATI 显示卡的主机来安装驱动程序, 该主机使用的是 Randon HD 3200 的显示卡晶片,最后下载的文件是: ati-driver-installer-9-6-x86.x86_64.run。 要安装这个驱动程序的方法与 NVidia 的方式很像的,同样的直接执行该文件即可:

[root@www ~]# sh ati-driver-installer-9-6-x86.x86_64.run
ATI 显示卡驱动程序安装示意
图 3.2.1、ATI 显示卡驱动程序安装示意

选择安装吧!

ATI 显示卡驱动程序安装示意
图 3.2.2、ATI 显示卡驱动程序安装示意

这里的目的是让我们确定一下,是否真的是安装在 x86_64 的硬体上面而已!按下 OK 去!

ATI 显示卡驱动程序安装示意
图 3.2.3、ATI 显示卡驱动程序安装示意

看完授权之后,直接给他 Exit 离开授权说明,然后会出现接受与否的字样:

ATI 显示卡驱动程序安装示意
图 3.2.4、ATI 显示卡驱动程序安装示意

要安装啊!所以当然就是 Yes 下去喔!

ATI 显示卡驱动程序安装示意
图 3.2.5、ATI 显示卡驱动程序安装示意

最后选择预设安装即可!不需要使用专家安装啦!这样就安装完毕了!也是非常快速吧!最后就会在 /usr/lib64/xorg/modules/drivers/ 里面出现 fglrx_drv.so 这个新的驱动程序啦! 与 Nvidia 相同的, ATI 也提供一支名为 aticonfig 的指令来帮忙设定 xorg.conf ,你可以直接输入‘ aticonfig -v ’来看看处理的方式即可。然后你就可以重新启动 X 来看看新的驱动程序功能啰!非常简单吧!


小标题的图示Intel

老实说,由于 Intel 针对 Linux 的图形介面驱动程序已经开放成为 Open source 了,所以理论上你不需要重新安装 Intel 的显示卡驱动程序的。除非你想要使用比预设的更新的驱动程序,那么才需要重新安装底下的驱动程序。 Intel 对 Linux 的显示卡驱动程序已经有独立的网站在运作,如下的连结就是安装的说明网页:

其实 Intel 的显示卡用的地方非常的多喔!因为只要是整合型主机板晶片组,用的是 Intel 的晶片时, 通常都整合了 Intel 的显示卡啰~鸟哥使用的一组 cluster 用的就是 Intel 的晶片,所以啰~ 这家伙也是用的到的啦!

一般来说, Intel 的显示卡都常常会使用 i810 等驱动程序,而不是这个较新的 intel 驱动程序! 你可以察看一下你系统是否有存在这些文件:

[root@www ~]# locate libdrm
/usr/lib/libdrm.so.2        <==32位元的函式库
/usr/lib/libdrm.so.2.0.0
/usr/lib64/libdrm.so.2      <==64位元放置位置不同!
/usr/lib64/libdrm.so.2.0.0
/usr/lib64/xorg/modules/linux/libdrm.so

[root@www ~]# locate intel | grep xorg
/usr/lib64/xorg/modules/drivers/intel_drv.so
# 上面这个就是 Intel 的显示卡驱动程序了!

呼呼!我们的 CentOS 有提供新的 Intel 显示卡驱动程序啦!所以不需要重新安装说~ 只是可能需要修改 xorg.conf 这个设定档的内容。基本上,要修改的地方有:

[root@www ~]# vi /etc/X11/xorg.conf
Section "Device"
        Identifier  "Videocard0"
        Driver      "intel"  <==原本可能会是使用 i810 喔
EndSection

Section "Module"
        ....(中间省略)....
        Load  "glx"    <==这两个很重要!务必要载入!
        Load  "dri"
        ....(中间省略)....
EndSection

Section "DRI"          <==这三行是新增的!让大家都能使用 DRI
       Mode 0666       <==基本上,就是权限的设定
EndSection

如果一切顺利的话,接下来就是重新启动 X 啰~使用新的 Intel 驱动程序吧!加油啰!


大标题的图示重点回顾
  • Unix Like 作业系统上面的 GUI 使用的是最初由 MIT 所开发的 X window system,在 1987 释出 X11 版,并于 1994 更改为 X11R6 ,故此 GUI 介面也被称为 X 或 X11
  • X window system 的 X server 最初由 XFree86 计划所开发,后来则由 Xorg 基金会所持续开发;
  • X window system 主要分为 X server 与 X client ,其中 X Server 在管理硬体,而 X Client 则是应用程序。
  • 在运作上,X Client 应用程序会将所想要呈现的画面告知 X Server ,最终由 X server 来将结果透过他所管理的硬体绘制出来!
  • 每一支 X client 都不知道对方的存在,必须要透过特殊的 X client ,称为 Window Manager 的, 来管理各视窗的重叠、移动、最小化等工作。
  • startx 可以探测 X server / X client 的启动脚本,并呼叫 xinit 来分别执行;
  • X 可以启动多个,各个 X 显示的位置使用 -display 来处理,显示位置为 :0, :1...
  • Xorg 是一个 X server ,设定档位于 /etc/X11/xorg.conf ,里面含有 Module, Files, Monitor, Device 等设定阶段
  • 字型管理为 X server 的重点,目前字型管理可由 xfs 及 fontconfig 来处理
 
大标题的图示本章习题
( 要看答案请将滑鼠移动到‘答:’底下的空白处,按下左键圈选空白处即可察看 )
  • 在 X 设定没问题的情况下,你在 Linux 主机如何取得视窗介面?
    如果是在 run level 3 ,可以使用 startx 进入,至于 run level 5 ,则直接进入 tty7 即可使用 display manager 登入 X Window 系统。
  • 利用 startx 可以在 run level 3 的环境下进入 X Window 系统。请问 startx 的主要功能?
    整个 X 视窗系统的重点在启动 X server 并载入 X client ,而执行 X server/X client 呼叫的任务为 xinit ,startx 只是一个较为亲和的脚本程序,可以搜寻系统上面的 X server / X client 设定值, 以提供 xinit 来执行而已。
  • 如何知道你系统当中 X 系统的版本与计划?
    最简单可以利用 root 的身份下达 X -version 即可知道!
  • 要了解为何 X 系统可以允许不同硬体、主机、作业系统之间的沟通,需要知道 X server / X client 的相关知识。 请问 X Server / X client / Window manager 的主要用途功能?
    X Server 主要负责荧幕的绘制,以及周边输入装置如滑鼠、键盘等资料的收集,并回报给 X Client ; X Client 主要负责资料的运算,收到来自 X Server 的资料后,加以运算得到图形的数据,并回传给 X Server, 让 X server 自行绘制图形。至于 Window manager 是一个比较特殊的 X Client ,他可以管理更多控制元素, 最重要的地方还是在于视窗的大小、重叠、移动等等的功能。
  • 如何重新启动 X
    最简单在 X Window System 下,直接按下 [alt]+[ctrl]+[backspace<--] 即可, 也可以 init 3 再 init 5,也可以关闭 X 后,再 startx 启动等等。
  • 试说明 ~/.xinitrc 这个文件的用途?
    当我们要启动 X 时,必须要启动 X Client 软件端。这个 ~/.xinitrc 即是在客制化自己的 X Client , 你可以在这个文件内输入你自己的 X Client 。若无此文件,则预设以 /etc/X11/xinit/xinitrc 替代。
  • 我在 CentOS 的系统中,预设使用 GNOME 登入 X 。但我想要改以 KDE 登入,该怎么办?
    首先你必须要已经安装 KDE 环境 (参考前一章的 yum grouplist 功能),然后可以藉由修改 /etc/sysconfig/desktop 内的设定值即可。但如果你不是 root 无法修订该文件时, 亦可以在自己的家目录参考 /etc/X11/xinit/xinitrc 的内容自行制作 ~/.xinitrc 文件来修改!
  • X Server 的 port 预设开放在?
    X port 预设开放在 port 6000 ,而且称此一显示为 :0
  • Linux 主机是否可以有两个以上的 X
    是的!可以!第一个 X 通常在 tty7 ,第二个在 tty8 ,第三个在 tty9 ,依序类推。 第几个是以启动的顺序来定义,并非 :0 , :1 的意思~
  • X Server 的设定档是 xorg.conf,在该文件中, Section Files 干嘛用的?
    相当重要!是设定显示字型用的。而字型一般放置目录在 /usr/lib/xorg/modules/fonts/ 当中。
  • 我发现我的 X 系统键盘所输入的字母老是打不出我所需要的单字,可能原因该如何修订?
    应该是键盘符号对应表跑掉了。可以修改 xorg.conf 文件内, 关于 Keyboard 的 Option XkbLayout 项目,将他改为 us 即可!
  • 当我的系统内有安装 GNOME 及 KDE 两个 X Widnow Manager ,我原本是以 KDE 为预设的 WM, 若想改为 GNOME 时,应该如何修改?
    修改 /etc/sysconfig/desktop 内部,成为 GNOME 即可!

大标题的图示参考资料与延伸阅读

2003/02/12:第一次完成
2005/06/29:将旧的文章移动到 这里 。如果你需要旧版的 xf86config 与相关的工具,则请前往该旧文章查阅!
2005/07/11:经历了许多的时间,将主机的设定档重复改了改,终于完成一些简单的 X 测试!
2006/11/07:经由网友x1215 这一篇的介绍,得知该网站,赶紧去处理!
2009/07/03:将旧版基于 FC4 的版本移动到此处
2009/07/15:奋战好几天,将驱动程序安装加上,同时加入字型管理功能。
2009/07/28:网友 LazyBug Chan 兄热情回报,使用 XFCE 的 Ubuntu 是 Xubuntu 这个分支!感谢回报!
2009/08/07:加入 Window Manger 的全名与连结



 
     
中国存储网 ChinaStor.com排版整理
原文作者鸟哥,主页,更多Linux学习资料在线看:Linux系统管理员手册 - Linux命令大全 - Linux调用大全- Linux专栏 - 国产Linux