Linux 之旅 23:X Window System

Linux 之旅 23:X Window System

image-20210916101310629

图源:pexels

X Window System

虽然现代人接触的大部分电子产品都具有良好的图形界面,而Apple公司的电子产品更是以此为傲,那个5岁孩子第一次见到iPad就可以自己摸索着操作的梗更是享誉业界。

但这并非计算机世界的本来面貌,在苹果推出Apple I以前,计算机都是以字符交互的系统存在于世的,使用者不得不用一些抽象的命令和字符与系统交互,当然,相比于更早期的纸带来说这已经是相当了不起的进步了。但是对于普通人来说,这依然是一个很高的门槛,阻止了计算机的进一步推广,直到Apple I出现。

其实苹果的图形交互也并非原创,当乔帮主在办公室里质问盖茨抄袭Mac OS的时候,盖茨回怼回去——“这就像我们的邻居有一个电视,你和我都想偷回家,只不过你先动手罢了”。感兴趣的可以阅读《史蒂夫·乔布斯传》

之后的故事已经广为人知,盖茨的Windows横空出世,将PC的使用门槛拉低,虽然很多人不了解GUI(Graphical User Interface)这个词,但这个词已经深入电子产品的方方面面。

虽然Linux的易用性一直不及Windows,使用门槛相对来说高很多,但也并非完全没有为个人用户考虑,它也具有自己的图形界面——X Window System。

发展简史

X Window System最早由MIT在1984年研发,其目的是为UNIX(当时Linux尚未问世)提供一个可以独立运行的图形界面。

1987年,X Window发展到X11版本,取得了长足的进步,后来的改进都是基于这个版本,所以现在X Window又称为X11。

1992年,XFree86计划(X+Free Software+x86)展开,旨在将X Window与X86硬件和类Unix系统完美结合。

1994年发布X11R6,此后X Window都使用这版本的架构。

2004年发布X11R6.8。

2005年发布X11R7.x,目前CentOS 7使用的正是Xorg提供的X11R7.x。

关于X Window,你需要知道的是:

  • X Window是UNIX-like系统上使用的GUI界面,也被称作X或X11。
  • X11是一个程序而非操作系统。
  • X11可以通过网络架构来独立于操作系统运行。
  • 目前大部分Linux发行版均使用Xorg提供的X11。
  • X11使用MIT授权。

主要组件

X11在结构上与Windows的GUI最大的不同是它是与操作系统松耦合的,我们都知道,Windows的图形界面引发的一些问题会导致Windows崩溃,而X11并不会,如果X11发生问题,只要重启X11即可,操作系统本身是不会受到重大影响的。

X Window的结构可以用下图表示:

X Window System 的架構

图源:鸟哥的Linux私房菜

X Window主要分为两部分:X Server和X Client。

如果是一个网络分布的X11,则用户使用的终端电脑(通常叫做用户端)上会部署X Server,而远程Linux主机(通常称为服务端)上会部署X Client。

我一开始也有点迷糊,这是不是哪里搞错了,好像搞反了一样。其实不然,X Server和X Client是从图像渲染的职责来区分的,而非是网络访问的服务端和用户端的关系。

在我们使用X Window通过网络访问服务器上的应用时,用户端上的X Server会管理本地电脑的大部分硬件(最关键的当然是键鼠和屏幕),将接收用户输出并进行最终显示结果的渲染工作。而真正的数据处理工作将由服务器上的相应应用来执行。之所以可以做到这一点,就是因为X Server可以在收到用户输入后,通过网络将请求数据发送给服务器上的相应X Client,而X Client就可以调用具体的应用(X Application,X应用程序)来处理数据,产生结果后再将结果返回给客户端上的X Server,X Server收到数据后再进行结果渲染。

其实大部分看似是本地服务,其实依赖于网络的设计都和上面的这种架构类似,比如Java的Remote Object。

上面这种设计的好处是,不仅实现了Linux主机操作系统和X的松耦合,只要服务端的主机支持X接口可以部署X Client即可。而且在这种设计下,多个运行X Server的客户端可以同时通过X访问服务端,这也很好的契合了Linux多用户多任务的特点。

当然上面这种网络部署X11的情况并不多见,更多的是将X Server与X Client都部署在一台主机上。

Window Manager

虽然通过上边的X Server和X Client可以实现图形化的数据处理,但是缺少一个统一的应用来管理X Client。

在X中,一个X Client就代表一个运行在X中的图形应用,想象一下,你在Windows中打开了多个应用,但每个应用都仅有内容,没有标题栏,即无法拖动也无法最大最小化,那会是一副怎样的场景。

Window Manager(WM,窗口管理器)正是执行这样的工作,它本身也是一个X Client,但它可以管理其他的X Client,会记录它们在屏幕上的位置、大小等信息,此外还可以控制任务栏、桌面等,以及提供虚拟桌面的功能。

其实用户在桌面看到的大部分内容都是WM提供的,而X可用的WM也有很多种,比如KDE、GNOME、Xfce、twm等。每种WM的显示引擎都不同,侧重点也不同。

下面是主要的WM及其官网:

  • GNOME (GNU Network Object Model Environment):http://www.gnome.org/
  • KDE (K Desktop Enviroment):http://kde.org/
  • twm (Tab Window Manager):http://xwinman.org/vtwm.php
  • XFCE (XForms Common Environment):http://www.xfce.org/
Display Manager

Display Manager最大的用途是提供登录环境,以及加载用户选择的WM与语言设置等。

CentOS中使用的是GNOME Display Manager(gdm)。

启动流程

要启动X,可以在开机后的命令行模式下输入startx来启动,也可以通过图形界面下使用Display Manager登录来启动。

startx

因为Linux是多用户多任务系统,所以其实X可以根据登录用户的不同有不同的配置。startx是一个shell脚本,会根据启动的用户来初始化或加载相应的配置。

startx命令的使用方式为:

[root@study ~]# startx [X client 參數] -- [X server 參數]

# 範例:以色彩深度為 16 bit 啟動 X
[root@study ~]# startx  --  -depth 16

参数部分使用--分隔为两部分,前边是X Client的设置,后边是X Server的设置。

X加载的配置遵循以下原则:

  • X Server的配置:
    • 优先使用startx的参数
    • 若没有参数,从~/.xserverrc加载
    • 若没有参数也没有~/.xserverrc,则从/etc/X11/xinit/xserverrc加载
    • 前边的配置项都没有,直接执行/usr/bin/X
  • X Client的配置:
    • 优先使用startx的参数
    • 如果没有参数,从~/.xinitrc加载
    • 如果没有参数也没有~/.xinitrc,从/etc/X11/xinit/xinitrc加载
    • 前边的配置项都没有,直接执行xterm
xinit

startx加载到配置项后,就会调用xinit来启动X,其使用方式为:

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

参数同样被--分隔为两部分,其实际调用命令大概是这样的:

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

-display :0 -- X :0表示的意思是将xterm显示在第0个X Server的第0个X Client。

默认情况下x :0指的是tty2终端,x :1指的是tty3终端。

xserverrc

事实上在CentOS 7中,是不存在X Server的配置脚本的:

[icexmoon@xyz ~]$ sudo find /etc /home /root -name '*xserver*'
/etc/security/console.apps/xserver
/etc/pam.d/xserver
/etc/selinux/targeted/active/modules/100/xserver

也就是说不存在/etc/X11/xinit/xserverrc,所以xinit会直接执行/usr/bin/X来启动X Server

xinitrc

默认情况下是不存在~/.xinitrc的,仅会存在/etc/x11/xinit/xinitrc

[icexmoon@xyz ~]$ sudo find /etc /home /root -name '*xinit*'
/etc/X11/xinit
/etc/X11/xinit/xinitrc
/etc/X11/xinit/xinitrc-common
/etc/X11/xinit/xinitrc.d

所以默认情况下都会通过/etc/x11/xinit/xinitrc来加载X Client的配置:

[icexmoon@xyz ~]$ cat /etc/X11/xinit/xinitrc | grep -v '^#' | grep -v '^$'
. /etc/X11/xinit/xinitrc-common
if [ -f $HOME/.Xclients ]; then
    exec $CK_XINIT_SESSION $SSH_AGENT $HOME/.Xclients || \
    exec $CK_XINIT_SESSION $SSH_AGENT $HOME/.Xclients
elif [ -f /etc/X11/xinit/Xclients ]; then
    exec $CK_XINIT_SESSION $SSH_AGENT /etc/X11/xinit/Xclients || \
    exec $CK_XINIT_SESSION $SSH_AGENT /etc/X11/xinit/Xclients
else
    # Failsafe settings.  Although we should never get here
    # (we provide fallbacks in Xclients as well) it can't hurt.
    [ -x /usr/bin/xsetroot ] && /usr/bin/xsetroot -solid '#222E45'
    [ -x /usr/bin/xclock ] && /usr/bin/xclock -geometry 100x100-5+5 &
    [ -x /usr/bin/xterm ] && xterm -geometry 80x50-50+150 &
    [ -x /usr/bin/twm ] && /usr/bin/twm
fi

事实上该脚本加载了/etc/X11/xinit/xinitrc-common,并通过/etc/X11/xinit/xinitrc-common加载了/etc/X11/xinit/xinitrc.d/*下的其它脚本,最后启动了一些默认启动的X Application

如果因为某种需要,要自定义X Client加载脚本,可以创建~/.xinitrc,需要注意的是其中启动X Application部分需要参考/etc/X11/xinit/xinitrc中的做法,前边的X Application需要使用&在后台执行,最后的WM需要在前台执行:

    [ -x /usr/bin/xclock ] && /usr/bin/xclock -geometry 100x100-5+5 &
    [ -x /usr/bin/xterm ] && xterm -geometry 80x50-50+150 &
    [ -x /usr/bin/twm ] && /usr/bin/twm
X启动的端口

虽然前面已经说过了,X11是可以通过网络部署的,此时自然需要通过启动相应的端口来实现网络通信,但是在CentOS中,X11都是部署在本地的,所以并不会实际启用端口,而是通过Socket文件的方式进行通信。

如果是通过网络部署,相关的端口情况如下:

X Window System显示接口默认终端网络监听端口
第一個 Xhostname:0tty2port 6000
第二個 Xhostname:1tty3port 6001
总结

现在总结一下,在命令行下启动X时,会经过以下步骤:

  1. 通过startx来确定需要加载的配置项或配置脚本。
  2. 通过xinit启动X Window System
  3. xinit加载X Server到默认的:0这个显示接口。
  4. xinit加载X Client到对应的X显示接口。

X启动流程测试

tty1中执行:

[icexmoon@xyz ~]$ X :1 &
[1] 5717

如果是tty1是图形界面,就在终端软件中执行。

X :1 &将会在tty2中启动X,此时是一片黑屏,啥都没有。可以使用Ctrl+Alt+F1切换回tty1

tty1中使用命令启动在X中启动一个xterm

[icexmoon@xyz ~]$ xterm -display :1 &

可能会显示不能加载某种字体的错误,不过不影响运行。

此时切换到tty2就能看到:

image-20210916150450336

这就是一个没有标题栏的终端程序。可以随便输入几个字符或者命令,再切换到tty1中输入:

[icexmoon@xyz ~]$ xterm -display :1 &

就能在tty2中看到一个全新的xterm,并会遮挡住之前的。

下面再尝试启动几个其它的X Application,启动前先安装相关的软件:

[root@xyz ~]# yum install xorg-x11-apps

tty1中执行:

[icexmoon@xyz ~]$ xclock -display :1 &
[icexmoon@xyz ~]$ xeyes -display :1 &

tty2中就能看到:

image-20210916151254647

xclock是一个时钟程序,xeyes则显示一对眼睛,并会注释鼠标所在的方向。所有这些应用都会以原始大小堆叠在屏幕左上方,并且都没有标题栏,我们也没办法重新放置这些程序。

下面在X上启动一个Window Manager来看看效果,这里使用的是最简单的WM:twm。

启动前先安装,因为CentOS 7已经不再支持twm了,所以我们需要安装CentOS 6中使用的版本,这里从网上找了一个rpm软件包,不过安装时候提示没有签名,需要谨慎安装,不过我们是虚拟机的学习环境,所以无所谓:

[root@xyz ~]# cd /tmp
[root@xyz tmp]# wget ftp://ftp.pbone.net/mirror/vault.centos.org/6.1/os/x86_64/Packages/xorg-x11-twm-1.0.3-5.1.el6.x86_64.rpm
...省略
2021-09-16 15:29:24 (56.2 KB/s) - “xorg-x11-twm-1.0.3-5.1.el6.x86_64.rpm” 已保存 [103264]

[root@xyz tmp]# rpm -ivh xorg-x11-twm-1.0.3-5.1.el6.x86_64.rpm
警告:xorg-x11-twm-1.0.3-5.1.el6.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID c105b9de: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:xorg-x11-twm-1:1.0.3-5.1.el6     ################################# [100%]
[root@xyz tmp]# rpm -qa | grep twm
xorg-x11-twm-1.0.3-5.1.el6.x86_64

因为资源是ftp协议,所以没法直接使用yum install进行下载并安装,这里只能先通过wget下载到本地,再进行安装。

此外还需要安装twm配套的字体:

[root@xyz tmp]# yum install xorg-x11-fonts-{100dpi,75dpi,Type1}
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 ...省略

和之前的操作一样,在tty1中执行:

[icexmoon@xyz ~]$ twm -display :1 &

然后切换到tty2中:

image-20210916153941619

这些X Applications都具有标题栏了,我们可以进行拖动摆放(虽然黑背景依然挺丑就是了)。

到这里就全部测试完毕了,最后回到tty1中结束掉测试中开启的任务:

[icexmoon@xyz ~]$ jobs
[1]   运行中               X :1 &
[2]   运行中               xterm -display :1 &
[3]   运行中               xterm -display :1 &
[4]   运行中               xclock -display :1 &
[5]-  运行中               xeyes -display :1 &
[6]+  运行中               twm -display :1 &
[icexmoon@xyz ~]$ kill -9 %1 %2 %3 %4 %5 %6
[1]   已杀死               X :1
[2]   已杀死               xterm -display :1
[3]   已杀死               xterm -display :1
[4]   已杀死               xclock -display :1
[5]-  已杀死               xeyes -display :1
[6]+  已杀死               twm -display :1
[icexmoon@xyz ~]$ jobs

是否需要使用X

一般来说,作为网络服务器的Linux主机是不需要X的,因为无论是其上运行的程序还是我们进行的相关管理活动,都可以通过字符终端来完成,不依赖于GUI,如果安装并使用X,反而对主机性能是一种拖累和浪费。

但个人电脑就不一样了,不说影音娱乐方面的需要,单纯一个上网就没法通过纯字符终端解决,现在又不是20年前,哪个网站不是使用web2.0甚至3.0技术,各种交互和js脚本都不是字符终端所能承载的,而要使用chrome或firefox之类的现代浏览器,那肯定是需要一个GUI的。

就我不多的使用经验来看,除了纯作为网络服务器的用途以外,个人电脑,或者用于娱乐中枢,抑或是NAS之类的,都可以装一个X Window,至少我的树莓派4B(4G版)上跑Raspbian的桌面+命令行版本是一点问题都没有的,而跑Ubuntu桌面版就比较拉跨了,或许Ubuntu桌面版还是适合正式的笔记本,微型电脑跑起来很吃力。总之X搭配Linux还是挺自由的,性能强劲就跑个KDE之类的华丽的WM,性能捉急就跑个twm之类的简陋WM,这也算某种程度上的丰俭由人了吧。

X Server配置文件解析与设置

X Server的配置文件默认保存在/etc/X11目录,相关的显示模块保存在/usr/lib64/xorg/modules,主要包括:

  • 字体:/usr/share/X11/fonts/
  • 显卡驱动:/usr/lib64/xrog/modules/drivers/
  • 主配置文件:/etc/X11/xorg.conf

分析xorg.conf设置

要查看当前使用的X Server的版本及相关信息:

[root@xyz tmp]# X -version

X.Org X Server 1.20.4
X Protocol Version 11, Revision 0
Build Operating System:  3.10.0-957.1.3.el7.x86_64
Current Operating System: Linux xyz.icexmoon.centos 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64
Kernel command line: BOOT_IMAGE=/vmlinuz-3.10.0-1160.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto spectre_v2=retpoline rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet elevator=deadline
Build Date: 01 April 2020  05:04:29AM
Build ID: xorg-x11-server 1.20.4-10.el7
Current version of pixman: 0.34.0
        Before reporting problems, check http://wiki.x.org
        to make sure that you have the latest version.

可以看到,使用的是Xorg提供的1.20.4X Server

事实上,从CentOS 6开始(包括CentOS 7),X Server在每次启动后会自动检测系统使用的显卡、屏幕等相关硬件信息,并依据相关硬件来自动加载驱动。因此已经不再依赖主配置文件/etc/X11/xorg.conf了,这个文件已经不存在于CentOS 7中。

但如果你不想让X Server自动检测硬件,可以手动创建该配置文件。如果只是想在自动检测的基础上修改部分设置,可以在/etc/X11/xorg.conf.d/目录下创建.conf命名的配置文件。

虽然现在已经不存在主配置文件了,但是我们依然可以使用相关命令生成一个主配置文件,用于学习:

[root@xyz tmp]# systemctl isolate multi-user.target
[root@xyz tmp]# Xorg -configure

X.Org X Server 1.20.4
X Protocol Version 11, Revision 0
Build Operating System:  3.10.0-957.1.3.el7.x86_64
Current Operating System: Linux xyz.icexmoon.centos 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64
Kernel command line: BOOT_IMAGE=/vmlinuz-3.10.0-1160.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto spectre_v2=retpoline rd.lvm.lv=centos/root rd.lvm.lv=centos/swap ...省略

Your xorg.conf file is /root/xorg.conf.new

To test the server, run 'X -config /root/xorg.conf.new'

(EE) Server terminated with error (2). Closing log file.

Xorg -configure会根据自动检测的结果来生成一个X Server主配置文件:/root/xorg.conf.new。当然这个文件现在只能用来分析和学习,要让其生效还要移动到主配置档应该保存的目录,并重命名。最后还提示我们可以使用x -config /root/xorg.conf.new命令进行测试。

下面我们来查看该文件:

[root@xyz tmp]# cat /root/xorg.conf.new
Section "ServerLayout"
        Identifier     "X.org Configured"
        Screen      0  "Screen0" 0 0
        InputDevice    "Mouse0" "CorePointer"
        InputDevice    "Keyboard0" "CoreKeyboard"
EndSection

Section "Files"
        ModulePath   "/usr/lib64/xorg/modules"
        FontPath     "catalogue:/etc/X11/fontpath.d"
        FontPath     "built-ins"
EndSection

Section "Module"
        Load  "glx"
EndSection

Section "InputDevice"
        Identifier  "Keyboard0"
        Driver      "kbd"
EndSection

Section "InputDevice"
        Identifier  "Mouse0"
        Driver      "mouse"
        Option      "Protocol" "auto"
        Option      "Device" "/dev/input/mice"
        Option      "ZAxisMapping" "4 5 6 7"
EndSection

Section "Monitor"
        Identifier   "Monitor0"
        VendorName   "Monitor Vendor"
        ModelName    "Monitor Model"
EndSection

Section "Device"
        ### Available Driver options are:-
        ### Values: <i>: integer, <f>: float, <bool>: "True"/"False",
        ### <string>: "String", <freq>: "<f> Hz/kHz/MHz",
        ### <percent>: "<f>%"
        ### [arg]: arg optional
        #Option     "HWcursor"                  # [<bool>]
        #Option     "Xinerama"                  # [<bool>]
        #Option     "StaticXinerama"            # <str>
        #Option     "GuiLayout"                 # <str>
        #Option     "AddDefaultMode"            # [<bool>]
        #Option     "RenderAccel"               # [<bool>]
        #Option     "DRI"                       # [<bool>]
        #Option     "DirectPresents"            # [<bool>]
        #Option     "HWPresents"                # [<bool>]
        #Option     "RenderCheck"               # [<bool>]
        Identifier  "Card0"
        Driver      "vmware"
        BusID       "PCI:0:15:0"
EndSection

Section "Screen"
        Identifier "Screen0"
        Device     "Card0"
        Monitor    "Monitor0"
        SubSection "Display"
                Viewport   0 0
                Depth     1
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     4
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     8
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     15
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     16
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     24
        EndSubSection
EndSection

可发现主要的配置项都是包裹在Section...EndSection语句块中的,Section语句之后跟着配置项名称(section name),主要有以下这些配置项:

  • Module:被加载到X Server中的模块。
  • InputDevice:输入设备,包括键盘、鼠标等。
  • Files:字体所在的目录。
  • Monitor:显示器设置,主要包括水平、垂直刷新率等。
  • Device:显卡相关设置。
  • Screen:屏幕相关设置,包括分辨率与色彩深度等。
  • ServerLayout:上述配置项可以有多个名称重复的配置,可以由ServerLayout具体决定使用哪个。

这其中的MonitorScreen都是显示器相关的设置,区别是前者是硬件相关的设置,后者是软件相关的设置。

要让xorg.conf.new生效,只要重命名为.conf后缀的文件,并移动到/etc/X11/xorg.conf.d目录即可:

[root@xyz tmp]# cp /root/xorg.conf.new /etc/X11/xorg.conf.d/icexmoon.conf
[root@xyz tmp]# systemctl isolate multi-user.target ;systemctl isolate graphical.target

也可以在multi-user.target下使用startx来生效。

字体管理

Xorg使用的字体主要保存在:

  • /usr/share/X11/fonts/
  • /usr/share/fonts/

如果要安装一种新的字体(比如楷体),可以这样:

[root@xyz tmp]# ll -d /usr/share/fonts/cjk*
drwxr-xr-x. 2 root root 36 724 14:38 /usr/share/fonts/cjkuni-uming
[root@xyz tmp]# yum install cjkuni-ukai-fonts
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
正在解决依赖关系
...省略
已安装:
  cjkuni-ukai-fonts.noarch 0:0.2.20080216.1-51.el7

完毕!
[root@xyz tmp]# ll -d /usr/share/fonts/cjk*
drwxr-xr-x. 2 root root 35 916 16:34 /usr/share/fonts/cjkuni-ukai
drwxr-xr-x. 2 root root 36 724 14:38 /usr/share/fonts/cjkuni-uming
[root@xyz tmp]# ll /etc/X11/fontpath.d/
总用量 0
lrwxrwxrwx. 1 root root 29 916 16:34 cjkuni-ukai-fonts -> /usr/share/fonts/cjkuni-ukai/
lrwxrwxrwx. 1 root root 30 724 14:38 cjkuni-uming-fonts -> /usr/share/fonts/cjkuni-uming/
lrwxrwxrwx. 1 root root 27 724 14:33 liberation-fonts -> /usr/share/fonts/liberation
lrwxrwxrwx. 1 root root 27 916 15:36 xorg-x11-fonts-100dpi:unscaled:pri=30 -> /usr/share/X11/fonts/100dpi
lrwxrwxrwx. 1 root root 26 916 15:36 xorg-x11-fonts-75dpi:unscaled:pri=20 -> /usr/share/X11/fonts/75dpi
lrwxrwxrwx. 1 root root 26 724 14:34 xorg-x11-fonts-Type1 -> /usr/share/X11/fonts/Type1

可以看到,安装字体后在/etc/X11/fontpath.d目录下会自动创建链接。

安装好字体文件后需要建立字体缓存:

[root@xyz tmp]# fc-cache -v | grep ukai
/usr/share/fonts/cjkuni-ukai: 跳过,当前缓存有效:4 个字体,0 个目录
/usr/share/fonts/cjkuni-ukai: 跳过,探测到循环目录
[root@xyz tmp]# fc-list | grep ukai
/usr/share/fonts/cjkuni-ukai/ukai.ttc: AR PL UKai TW:style=Book
/usr/share/fonts/cjkuni-ukai/ukai.ttc: AR PL UKai HK:style=Book
/usr/share/fonts/cjkuni-ukai/ukai.ttc: AR PL UKai CN:style=Book
/usr/share/fonts/cjkuni-ukai/ukai.ttc: AR PL UKai TW MBE:style=Book

最后还需要重启X11以加载新字体:

[root@xyz tmp]# !965
systemctl isolate multi-user.target ;systemctl isolate graphical.target

现在在应用程序》工具》fonts中就可以找到新添加的字体ukai了:

image-20210916164034919

显示参数微调

在图形界面下输入xrandr可以检查屏幕相关信息:

[icexmoon@xyz ~]$ xrandr
Screen 0: minimum 1 x 1, current 1718 x 852, maximum 8192 x 8192
Virtual1 connected primary 1718x852+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
   1718x852      60.00*+
   2560x1600     59.99  
   1920x1440     60.00  
   1856x1392     60.00  
   1792x1344     60.00  
   1920x1200     59.88  
   1600x1200     60.00  
   1680x1050     59.95  
   1400x1050     59.98  
   1280x1024     60.02  
   1440x900      59.89  
   1280x960      60.00  
   1360x768      60.02  
   1280x800      59.81  
   1152x864      75.00  
   1280x768      59.87  
   1024x768      60.00  
   800x600       60.32  
   640x480       59.94  
Virtual2 disconnected (normal left inverted right x axis y axis)
Virtual3 disconnected (normal left inverted right x axis y axis)
Virtual4 disconnected (normal left inverted right x axis y axis)
Virtual5 disconnected (normal left inverted right x axis y axis)
Virtual6 disconnected (normal left inverted right x axis y axis)
Virtual7 disconnected (normal left inverted right x axis y axis)
Virtual8 disconnected (normal left inverted right x axis y axis)

当前使用的分辨率是1718*852,假设我们要修改分辨率,可以这样:

[icexmoon@xyz ~]$ xrandr -s 1280x800

要注意的是:

  • 必须输入1280x800而不是1280*800
  • 所输入的分辨率必须是上边的预设分辨率列表中的一种。

如果我们想使用预设分辨率中不存在的分辨率设置,可以:

[icexmoon@xyz ~]$ gtf 1700 850 60 -x

  # 1696x850 @ 60.00 Hz (GTF) hsync: 52.80 kHz; pclk: 118.27 MHz
  Modeline "1696x850_60.00"  118.27  1696 1792 1968 2240  850 851 854 880  -HSync +Vsync

将上边生成的配置信息写入之前创建的配置文件:

[root@xyz tmp]# cd /etc/X11/xorg.conf.d/
[root@xyz xorg.conf.d]# cp icexmoon.conf icexmoon.conf.bak
[root@xyz xorg.conf.d]# vim icexmoon.conf
[root@xyz xorg.conf.d]# diff icexmoon.conf icexmoon.conf.bak
35d34
<       Modeline "1696x850_60.00"  118.27  1696 1792 1968 2240  850 851 854 880  -HSync +Vsync
[root@xyz xorg.conf.d]# systemctl isolate multi-user.target ;systemctl isolate graphical.target

再在虚拟机中的图形界面下查看屏幕显示信息:

[icexmoon@xyz ~]$ xrandr
Screen 0: minimum 1 x 1, current 1718 x 852, maximum 8192 x 8192
Virtual1 connected primary 1718x852+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
	...省略 
   1696x850_60.00  60.00  
   1280x1024     60.02  
   1440x900      59.89  
   1280x960      60.00  
   1360x768      60.02  
   1280x800      59.81  
   ...省略

现在有了一个1696x850_60.00的配置项,我们可以使用xrandr -s 1696x850_60.00的方式使用这个配置项。

显卡驱动程序安装范例

在这一小节《鸟哥的Linux私房菜》展示了NVIDIA、Intel、AMD相关的驱动安装示例,因为我这里并没有合适的相关硬件,所以不做测试和总结,相关的内容请移步鸟哥的站点顯示卡驅動程式安裝範例

以上就是关于X Window System的全部内容,谢谢阅读。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值