Linux(22):X Window 设定介绍

X Window System

X Window System 是个非常大的架构,他还用到网络功能。也就是说,其实 X 窗口系统是能够跨网络与跨操作系统平台的。

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

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

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

X Window system 是个利用网络架构的图形用户接口软件,这个架构基本上是分成 X Server 与 X Client两个组件而已。其中 X Server在管理硬件,而 X Client 则是应用程序。
在运作上,X Client 应用程序会将所想要呈现的画面告知 X Server,最终由 X server 来将结果透过他所管理的硬件绘制出来。
在这里插入图片描述
在客户端想要取得来自服务器的图形数据时,客户端使用的当然是客户端的硬设备,所以,X Server 的重点就是在管理客户端的硬件,包括接受键盘/鼠标等设备的输入信息,并且将图形绘制到屏幕上。
X Client (就是X应用程序)用来告知 X Server要绘制啥东西。远程服务器提供的是 X client 软件。

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

X Window System是要显示图形接口,因此需要一个组件来管理主机上面的所有硬设备才行,这个任务就是 X Server所负责的。
X Server管理的设备主要与输入/输出有关:包括键盘、鼠标、手写板、显示器(monitor)、屏幕分辨率与颜色深度、显示适配器(包含驱动程序)与显示的字型等等;

X Window 在 Linux 里面仅能算是【软件】,所以 X Window 有自己的配置文件,必须要针对他的配置文件设定妥当才行。也就是说,Linux 的设定与 X Server 的设定不一定要相同的。总之,X Server 的主要功能就是在管理【主机】上面的显示硬件与驱动程序。

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

X Server / X Client 的互动并非仅有 client --> server,两者其实有互动的。 X Server 还有一个重要的工作,那就是将来自输入设备(如键盘、鼠标等)的动作告知 X Client。X Server 既然是管理这些周边硬件,所以,周边硬件的动作当然是由 X Server来管理的,但是 X Server 本身并不知道接口设备这些动作会造成什么显示上的效果,因此 X Server 会将接口设备的这些动作行为告知 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 Client 不需要知道 X Server 的硬件配备与操作系统。因为 X Client 单纯就是在处理绘图的数据而己,本身是不绘图的。

X Server 客户端的操作系统与 X Client 的沟通示意:
在这里插入图片描述

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

X Client 的主要工作是将来自 X Server 的数据处理成为绘图数据,再回传给X server而已,所以 X Client 本身是不知道他在 X Server 当中的位置、大小以及其他相关信息的。
XWindow Manager (WM,窗口管理员)也是 X client ,只是他主要在负责全部 X Client 的控管,还包括提供某些特殊的功能,例如:
1.提供许多的控制元素,包括任务栏、背景桌面的设定等等;
2.管理虚拟桌面(virtual desktop);
3.提供窗口控制参数,这包括窗口的大小、窗口的重迭显示、窗口的移动、窗口的最小化等等。

在Linux底下,每套 Window Manager 都是独特存在的,不是换了桌面与显示效果而已,而是连显示的引擎都不会一样。

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:提供登入需求
在本机的文字接口底下可以输入 startx 来启动 X 系统,此时由于已经登入系统了,因此不需要重新登入即可取得 X 环境。但如果是 graphical.target 的环境呢,会发现在 tty1 或其他 tty 的地方有个 Display Manager 可以让你使用图形接口登入(输入账号密码)。
Display manager 最大的任务就是提供登入的环境,并且加载使用者选择的 Window Manager 与语系等数据。
几乎所有的大型窗口管理员项目计划都会提供 display manager 的,在CentOS 上面我们主要利用的是 GNOME 的 GNOME Display Manager (gdm) 这支程序来提供 ttyl 的图形接口登入。至于登入后取得的窗口管理员,则可以在 gdm 上面进行选择的。

X Window 的启动流程

要启动 X Window System 时,必须要先启动管理硬件与绘图的X Server,然后才加载 X Client。
基本上,目前都是使用 Window Manager 来管理窗口接口风格的。可以透过登入本机的文字接口后,输入 startx 来启动 X 窗口;也能够透过 display manager(如果有启动graphical.target)提供的登入画面,输入账号密码来登入与取得X窗口的。

在文字接口启动X:透过 startx 指令
Linux是个多人多任务的操作系统,所以 X 窗口也是可以根据不同的使用者而有不同的设定。也就是说,每个用户启动 X 时,X server 的分辨率、启动 X client 的相关软件及 Window Manager 的选择可能都不一样。
但是,如果是首次登入X,还没有建立自己的专属 X 画面时,在纯文本接口且并没有启动X窗口的情况下来输入 startx 。
startx 其实是一个 shell script ,会主动的帮忙使用者建立起他们的 X 所需要引用的配置文件。
startx最重要的任务就是找出用户或者是系统默认的 X server 与 X client 的配置文件,而使用者也能够使用 startx 外接参数来取代配置文件的内容。这个意思是说: startx可以直接启动,也能够外接参数。

startx [X client 参数] -- [X server 参数]

事实上启动 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窗口系统整体。

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

xunit [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 -gemotry +l+l -n login -display :0 -- X :0

在 X client 方面:那个 xterm 是 X 窗口底下的虚拟终端机,后面接的参数则是这个终端机的位置与登入与否。最后面会接一个【-display :0】表示这个虚拟终端机是启动在【第:0号的X显示接口】的意思。
至于X Server方面,而我们启动的 X server 程序就是X。其实 X 就是 Xorg 的连结档,亦即是 X Server的主程序。同时还指定X启动在第:0 个 X 显示接口。
xinit 主要在启动 X server 与加载 Xclient ,但这个xinit 所需要的参数则是由 startx去 帮忙找寻的。因此,最重要的当然就是 startx 找到的那些参数: /etc/X11/xinit/ 目录下的 xinitrc 与 xserverrc。

启动 X serve 的文件:xserverrc
X 窗口最先需要启动的就是 X server,那 X server 启动的脚本与参数是透过 /etc/X11/xinit/ 里面的xserverrc。
在启动X Server 时,Xorg 会去读取 /etc/X11/xorg.conf 这个配置文件。如果一切顺利,那么 X 就会顺利的在 tty2 以后终端环境中启动了 X。单纯的X启动时,你只会看到画面一片漆黑,然后中心有个鼠标的光标而已。
X 启动的时候还可以指定启动的接口。那就是:0这个参数。事实上 Linux可以【同时启动多个 X】。第一个 X 的画面会在 :0 亦即是tty2,第二个X则是 :1 亦即是tty3。

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

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

X 启动的埠口
在文字接口底下启动 X 时,直接使用 startx 来找到 X server 与 X client 的参数或配置文件,然后再呼叫 xinit 来启动 X 窗口系统。xinit 先载入 X server 到预设的 :0 这个显示接口,然后再加载 X client 到这个 X显示接口上。而 X client 通常就是 GNOME 或 KDE,这两个设定也能够在 /etc/sysconfig/desktop 里面作好设定。
CentOS 由于考虑 X 窗口是在本机上面运作,因此将埠口改为插槽档(socket)了,因此无法观察到 X 启动的埠口的。事实上,X server 应该是要启动一个 port 6000 来与X client进行沟通的。由于系统上面也可能有多个 X 存在,因此就会有 port 6001, port 6002…等等。这也就是说:(假设为 multi-user.target 模式,且用户仅曾经切换到 tty1 而已)。

在这里插入图片描述

在 X Window System 的环境下,称 port 6000 为第 0 个显示接口,亦即为 hostname:0 ,那个主机名通常可以不写,所以就成了:0即可。在预设的情况下,第一个启动的 X(不论是启动在第几个port number)是在 tty2 ,亦即按下[ctrl]+[Alt]+[F2]那个画面。而启动的第二个 X (可以有多个 X 同时启动在系统)。则预设在tty3 亦即[ctrl]+[Alt]+[F3]那个画面。
因为主机上的 X 可能有多个同时存在,因此,在启动 X Server / Client 时,应该都要注明该 X Server / Client 主要是提供或接受来自哪个 display 的 port number才行。

X Server 配置文件解析与设定

基本上,X Server 管理的是显示适配器、屏幕分辨率、鼠标按键对应等等,尤其是显示适配器芯片的认识。此外,还有显示的字体也是 X Server 管理的一环。基本上,X server 的配置文件都是预设放置在/etc/X11 目录下,而相关的显示模块或总总模块,则主要放置在 /usr/lib64/xorg/modules 底下。
比较重要的是字型文件与芯片组,主要放置在:
1.提供的屏幕字体:/usr/share/X11/fonts/
2.显示适配器的芯片组:/usr/lib64/xorg/modules/drivers/

解析 xorg.conf 设定

在这里插入图片描述
如果只想要加入或者是修改部份的设定,并不是每个组件都要自行设定的话,那么可以在 /etc/X11/xorg.conf.d/ 这个目录下建立文件名为 .conf 的文件,将需要的额外项目加进去即可。

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

至于常见的 section name 主要有:

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

假设是在 multi-user.targe t的环境下,那就可以这样作来产生 xorg.conf:

Xorg -configure

字型管理

Xorg 所使用的字型大部分都是放置于底下的目录中:
/usr/share/X11/fonts/
/usr/share/fonts/

不过 Xorg 默认会加载的字型则是记录于 /etc/X11/fontpath.d/ 目录中,使用链接文件的模式来进行链接的动作而已。

让窗口管理员可以使用额外的字型
如果想要使用额外的字型的话,可以自行取得某些字型来处理的。

显示器参数微调

测试目前的屏幕搭配显卡所能够处理的分辨率与更新频率(须在X环境下):
在这里插入图片描述
在这里插入图片描述

若想强迫 X server 更改屏幕的分辨率与更新频率,则需要修订xorg.conf 的设定。先来侦测:

gtf 水平像素 垂直像素 更新频率 [-xv]

在这里插入图片描述在这里插入图片描述
将上述的数据输入xorg.conf .d /*.conf 内的 Monitor 项目中。

《鸟哥的Linux私房菜-基础篇》学习笔记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/277651.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tomcat的结构分析和请求处理原理解析

目录 Tomcat服务器?Tomcat结构处理请求流程Tomcat作用其他的web服务器 Tomcat服务器? 我们经常开口闭口“服务器”、“服务器”的,其实“服务器”是个很容易引发歧义的概念 其实,Tomcat服务器 Web服务器 Servlet/JSP容器&#…

安路IP核应用举例(OSC、UART)

1.OSC(内部振荡器) 按照Project->New Project顺序新建工程后,后按照Tools->IP Generator顺序,创建IP核,如下图: 安路FPGA的内置OSC振荡模块频率可选30MHz、60MHz。 可选Verilog或VHDL语言。 如图,生成的.v文件只…

怎么把文件转成附件放在公众号里?这篇教程给你详细说清楚

文件转附件,其实就是把文件上传到某个网站,获得文件的下载链接,从而放到文章或者其他地方供读者下载使用。因为公众号并不支持直接在文章里面添加下载链接(至少订阅号不行),所以把文件转成下载链接的方式并…

HPM6750系列--总章

本栏目介绍先楫半导体出品的HPM6750芯片(基于HPM6750evkmini开发板) ​​​​​​​ 内容概述 HPM6750系列--第一篇 初识HPM6750 介绍HPM6750芯片信息,包括主频、内存、外设配置,并列举了各种开发工具和开发资源。 HPM6750系列--…

异地现场工控设备,如何实现远程配置、调试?

南京某企业专注于工业物联领域,在相关项目中往往会在各个点位部署基于Linux系统的中控主机,实现各类物联设备信息的采集、汇总。但是,由于各点位分散多地,且数量达到了上百个,虽然中控主机具备4G物联网接入能力&#x…

Qt容器QMdiArea 小部件提供一个显示 MDI 窗口的区域

## QMdiArea ## 控件简介 QMdiArea 继承 QAbstractScrollArea。QMdiArea 小部件提供一个显示 MDI 窗口的区域。QMdiArea的功能本质上类似于MDI窗口的窗口管理器。大多数复杂的程序,都使用MDI框架,在 Qt designer 中可以直接将控件 MDI Area 拖入使用。 ## 用法示例 例 qm…

利用有限制通配符来提升API的灵活性

在Java中,有限制通配符(bounded wildcard)允许你在泛型中指定一个范围,从而提升API的灵活性。通配符使得你能够编写更通用、适用于多种类型的代码。以下是一个利用有限制通配符提升API灵活性的例子: 假设有一个简单的…

Elasticsearch面试题

Elasticsearch面试题(来源:Elasticsearch) 1 、为什么要使用 Elasticsearch? 系统中的数据, 随着业务的发展,时间的推移, 将会非常多, 而业务中往往采用模糊查询进行数据的搜索&…

解决:Component name “index“ should always be multi-word

原因 要求组件名称以驼峰格式命名,自定义组件名称应该由多单纯组成,防止和html标签冲突,所以index.vue 会报错 解决 1、按照规则驼峰格式,如:appIndex.vue 2、若有.eslintrc.js文件,并在规则中(rules)关…

【最新版】PyCharm基础调试功能详解

文章目录 一、断点1. 断点的类型a. 行断点b. 异常断点 2. 设置断点a. 设置行断点b. 设置异常断点 3. 管理断点a. 删除断点b. 将断点静音 二、调试功能0. 测试代码1. 设置断点2. 调试的多种启动方式3. 观察调试控制台a. 步过b. 步入c. 单步执行代码d. 步出e. 运行到光标处f. 重新…

我可能是全中国最了解 tailwindcss 的开发者

我可能是全中国最了解 tailwindcss 的开发者 我可能是全中国最了解 tailwindcss 的开发者 前言 预设小工具转化器UI 组件库 开源起始上下求索 开发之始更多的平台继续突破 兴趣还是生计?收获和结语附录 前言 首先,我要对起这样的标题感到抱歉&#x…

ProroBuf C++笔记

一.什么是protobuf Protocol Buffers是Google的⼀种语⾔⽆关、平台⽆关、可扩展的序列化结构数据的⽅法,它可⽤于(数据)通信协议、数据存储等。Protocol Buffers 类⽐于XML,是⼀种灵活,⾼效,⾃动化机制的结…