一、Linux 图形界面基本概念

参考:https://www.cnblogs.com/jinanxiaolaohu/p/10647435.html
https://blog.csdn.net/u012822903/article/details/54572807
https://www.iteye.com/blog/f543711700-1921430
https://www.jianshu.com/p/787ac3d6fcc8
https://www.iteye.com/blog/czmmiao-2141131

1.1 X、X11、X Window System

https://www.systutorials.com/docs/linux/man/7-X/

The X Window System is a network transparent window system which runs on a wide range of computing and graphics machines. It should be relatively straightforward to build the X.Org Foundation software distribution on most ANSI C and POSIX compliant systems. Commercial implementations are also available for a wide range of platforms. The X.Org Foundation requests that the following names be used when referring to this software: X X Window System X Version 11 X Window System, Version 11 X11 X Window System is a trademark of The Open Group.

X 仅为 GUI 环境构建提供了基本的框架,在屏幕上绘图和移动窗口,以及与鼠标和键盘交互。X 并没有定义 UI 的呈现方式 — 独立的客户程序窗口管理器处理这部分功能。正因为如此,以 X 为基础环境的视觉样式变化非常地多,不同的程式可能彻底地展现不同的界面。X 以 “ 网路通透性” 为特色:应用程序(”客户端” 应用程序)所执行的机器,不一定是使用者本地的机器(显示的 “服务端”)。X 的 “ 客户端 “ 和 “服务端 “ 字眼的使用与人们通常的认识不太相同,” 服务端” 是使用者本地的显示而不是远端的机器。 X 在 1984年起始于 MIT 。这个协定版本——X11,是在 1987年9月 所提出的。该方案是由 X 基金会所领导,这个参考实作是版本 11 release 7.6,且在 MIT 执照和相似的表示许可执照下是自由软件 。

1.2 Xorg、XFree86

Xorg是X11的一个实现,而X Window System是一个C/S结构的程序,Xorg只是提供了一个X Server,负责底层的操作当你运行一个程序的时候,这个程序会连接到X server上,由X server接收键盘鼠标输入和负责屏幕输出窗口的移动,窗口标题的样式等等。
> 常用的X11实现有:Xorg、XFree86、> MOTIF

1.3 Display Manager(显示管理器/登录管理器)

https://wiki.archlinux.org/index.php/Display_manager 显示管理器)或登录管理器是一个在启动最后显示的图形界面,即登录界面(显示管理器),是进到桌面环境之前的用户登录界面。

常见的DM列表:

https://github.com/linuxmint/mdm || mdm-display-manager

  • SDDM:基于QML的显示管理器,替代 KDE4 的 KDM,推荐搭配 Plamsa5 或 LXQt 使用。https://github.com/sddm/sddmsddm
  • XDM — X 显示管理器支持XDMCP(适合服务器的宿主机).

http://www.x.org/archive/X11R7.5/doc/man/man1/xdm.1.html || xorg-xdm

1.4 Window Manager(窗口管理器)

https://wiki.archlinux.org/index.php/Windowmanager(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87))

图形用户界面的视窗系统中,窗口管理器(Window Manager)是控制窗口行为与位置的软件。

分类:
窗口管理器分类不多,但是对操作风格,就是它自身的作用而言极为重要。
Metacity
Enlightement DR16
Compiz
Gnome Shell
AWESOME

linux 桌面环境:
桌面环境可能仅仅是一个简单的窗口管理器, 也可能是一个像 KDE 或者 GNOME这样的完整桌面应用程序套件。
现代重量级的桌面环境
以下的桌面环境有别于传统的很多人多熟悉的菜单栏布局的桌面环境,如果你的硬件配置太过陈旧,没有足够的内存,CPU主频不高或者显卡处理能力不足,这些桌面环境对你来说并不是很好的选择。
1)Unity
2)Gnome
使用Gnome作为桌面环境的部分发行版本:

  • Ubuntu Gnome
  • Mageia
  • Debian
  • Fedora
  • openSUSE
  • Arch
  • CentOS
  • Manjaro
  • Kali
  • Makulu
  • Knoppix
  • Korora

传统的重量级桌面环境
对我而言,传统的重量级桌面环境底部任务栏、桌面图标以及可以通过滚动目录查找程序的菜单栏。重量级与轻量级的区别是,重量级消耗更多的资源。
1)Cinnamon
使用Cinnamon作为桌面环境的部分发行版本:

  • Mint
  • Cinnarch
  • Makulu
  • Mageia
  • Fedora
  • Arch

2)KDE
使用KDE作为桌面环境的部分发行版本:

  • Mint
  • Debian
  • Mageia
  • Fedora
  • openSUSE
  • Kubuntu
  • PCLinuxOS
  • Netrunner
  • Arch
  • Korora
  • Makulu
  • SolyDK
  • Knoppix
  • SLAX

3)Zorin Desktop
传统的轻量级桌面环境
轻量级的桌面需要较少的资源,所以可以运行在大多数的硬件上,同样,包括任务栏、菜单、图标。
1)MATE
2)XFCE
3)LXDE
4)Enlightenment
Fluxbox, JWM, IceWM, RazorQT
总结:
还有其他的窗口管理工具,有70多个可以下载使用,LinuxBBQ提供了信息。
如果你仅仅是使用计算机浏览网页、看视频以及听音乐,并且你有一个比较新的计算机,那为什么不试一下Unity和Gnome呢?
如果你有一台新的计算机,但是更喜欢传统的风格,那就试一下KDE或者Cinnamon。
如果你中等配置的计算机,建议MATE或者XFCE,这两个在新的计算机上都值得一试,因为它们将事情组织的很好。
如果你的计算机配置过旧,LXDE是第一选择,如果还是无法流畅运行,那就换成超级轻量的发行版本,比如ICEWM或者Fluxbox。
当然最极端的选择就是不要桌面环境,如果你的计算机作为服务器,那就没必要安装桌面环境了。这时,Ubuntu minimal和Debian minimal都值得一试。

二、Linux图形界面框架

linux图形界面又称x系统,其主要包含如下几个部分:

  • a) xserver
  • b) 显示管理器 (Display Manager) 例如(gdm kdm xdm等)
  • c) 窗口管理器 (Window Manager) 例如(metacity ,fluxbox等)
  • d) DM 和 WM之上的一些图形应用程序

在使用中一般都是b,c,d三者集合起来构成一个完整的集成工作环境,例如KDE ,GNOME等,这就是我们平时所说的广义上的xclient

  • a)xserver 主要提供基本的显示接口共xclient使用,并将用户的操作等也反映给xclient,

是xclient与硬件的一个中间层。xserver相关的两个主要部分是
(1) xorg.conf
xorg.conf是X Server的主要配置文件,它包含一个当前系统的硬件资源列表。X Server就是根据这些硬件资源“组织”出基本的图形能力。xorg.conf文件在/etc/X11/xorg.conf,主要包含几个字段:
Files: X系统使用的字体存放目录(字体的具体使用由FontConfig工具主持)
InputDevice: 输入设备,如键盘鼠标的信息
Monitor: 显示器的设置,如分辨率,刷新率等
Device: 显示卡信息
Screen: 由Monitor和Device组装成一个Screen,表示由它们向这个Screen提供输出能力
ServerLayout: 将一个Screen和InputDevice组装成一个ServerLayout
在具有多个显示设备的系统中,可能有多个Screen和多个ServerLayout,用以实现不同的硬件搭配。
在最近的xorg版本中,X Server已经开始自动侦测硬件,现在的xorg.conf已经都成了默认名称。具体细节还待查,但基本原理还是不变的。
(2) X session(X会话)
X session是指X server启动后直到X server关闭之间的这段时间。这期间一切跟X相关的动作都属于X session的内容。管理X session的程序称为Display Manager,常听说的gdm或kdm就是gnome/kde所分别对应的Display Manager。
开启一个X session,也就是开始了图形界面的使用。在开启的过程中,Display Manager会对用户进行认证(也就是用户名密码的输入),运行事先设置好的程序(比如scim输入法就是这个时候启动的)等等。
这个开启过程要执行的一系列操作都可以在/etc/X11/Xseesion以及/etc/X11/Xsession.d/目录下看到,其他还有一些配置文件如Xsession.options, Xresource等,都是执行的X session的初始化过程。仔细阅读这些脚本或配置文件,可以帮助你更好地理解X

  • b) Display Manager

    上面说过,Display Manager(后简称DM)是管理X session的程序,常见的有gdm, kdm, xdm等。对于默认进入X界面的Linux系统,必须将DM程序在开机时执行,即:/etc/rc2.d/S13gdm。下面我们从手工启动X的过程,看一下DM为我们做了哪些工作。
    如果没有设置DM在开机时运行的话,手动启动X使用startx命令。
    man startx
    可以知道,startx的作用可以看作是Display Manager的一种隐性实现。它使用xinit命令,分别根据/etc/X11/xinit/xinitrc和/etc/X11/xinit/xserverrc中所指定的设置唤起X。
    其中,xserverrc执行X server的运行任务;xinitrc则运行Xsession命令。从/etc/X11/Xsession脚本的内容可以看出,它也就是进入/etc /X11/Xsession.d/目录轮询地执行所有脚本。很明显,这些也就是前面所说的Xsession初始化工作。
    综合起来说,Display Manager完成三个任务:1, X Server的启动; 2, X session的初始化; 3, X session的管理。

  • c) Window Manager

    X Server提供了基本的图形显示能力。然而具体怎么绘制应用程序的界面,却是要有应用程序自己解决的。而Window Manager(桌面管理器,后简称WM)就是用来提供统一的GUI组件的(窗口、外框、菜单、按钮等)。否则,应用程序们各自为政,既增加了程序开发的负担,不统一的桌面风格对视觉也是不小的挑战。
    WM的启动由DM控制,在gdm的登录窗口,我们可以进行选择。常见的WM有:Metacity(Gnome默认的WM), fluxbox, fvwm, E17等。

  • d) X Clients

    最后,就是X Client了。X客户端程序,顾名思义,就是使用X服务的程序。firefox,gedit等等都属于X Client程序。X Client部分值得考虑一下的就是DISPLAY环境变量。它主要用于远程X Client的使用。该变量表示输出目的地的位置,由三个要素组成:
    [host]:display[.screen]
    host指网络上远程主机的名称,可以是主机名、IP地址等。默认的host是本地系统,你可以在自己系统上echo $DISPLAY看一下。
    display和screen分别代表输出画面的编号和屏幕的编号。具体细节由于硬件的缺乏,还有待进一步研究。

三、xserver 和xclient启动过程

参考:http://blog.csdn.net/clozxy/archive/2010/04/15/5488699.aspx

对xserver和x client的启动过程的探讨主要是对startx命令的探讨
startx脚本网上解释的很多,这里就不多做介绍,对startx介绍分以下两个部分
(1)xinit用法
startx其实是个脚本,最终调用的是xinit命令,其用法如下:
xinit 的用法为: xinit [[client] options ] [– [server] [display] options] 。其中 client 用于指定一个基于 X 的应用程序, client 后面的 options 是传给这个应用程序的参数, server 是用于指定启动哪个 X 服务器,一般为 /usr/bin/X 或 /usr/bin/Xorg , display 用于指定 display number ,一般 为 0 ,表示第一个 display , option 为传给 server 的参数。

如果不指定 client , xinit 会查找 HOME ( 环境变量 ) 目录下的 .xinitrc 文件,如果存在这个 文件, xinit 直接调用 execvp 函数执行该文件。如果这个文件不存在,那么 client 及其 options 为: xterm -geometry +1+1 -n login -display :0 。

如果不指定 server , xinit 会查找 HOME( 环境变量 ) 目录下的 .xserverrc 文件,如果存在这个文件, xinit 直接调用 execvp 函数执行该文件。如果这个文件 不存在,那么 server 及其 display 为: X :0 。如果系统目录中不存在 X 命令,那么我们需要在系统目录下建立一个名为 X 的链接,使其指向真正的 X server 命令( Ubuntu 下为 Xorg )。

因此startx的用法跟xinit一样:startx [ [ client ] options … ] [ – [ server ] options … ]

(2)startx的几种启动方式
由对 startx 脚本的分析,我们可以知道 startx 主要有三种启动方式:
a) 、一种是自己指定要启动的 client 和 server , 例如: startx /usr/bin/xclock – /usr/bin/X :0 ;
b)、一种是通过在 $HOME 下新建 .xinitrc 文件来指定要启动的多个 client 和 .xserverrc 来指定要启动的 server;
c)、还有一种是直接输入 startx 而不指定参数,这也就是我们启动 gnome 桌面的方法。

在 c 这种启动方法中, startx 脚本会先去看系统目录( /etc/X11/xinit/ )下的 rc 文件是否存在,如果不存在就会用默认的 xterm 和 /usr/bin/X 来启动 xinit 。显然, startx 启动的不是 xterm ,而是 gnome 桌面,因此 gnome 的启动是通过系统文件 /etc/X11/xinit/xinitrc 来指定的。

而 /etc/X11/xinit/xinitrc 文件的内容如下所示:

#!/bin/bash # 注意 : 该脚本用的是 bash shell 解析的

# Xorg:xinitrc.cpp,v1.32000/08/1719:54:30cpqbldExpXorg:xinitrc.cpp,v1.32000/08/1719:54:30cpqbldExp

# /etc/X11/xinit/xinitrc
#
# global xinitrc file, used by all X sessions started by xinit (startx)

# invoke global X session script
. /etc/X11/Xsession # 在当前这个 shell 环境中执行 Xsession 脚本

因此, gnome 的启动应该在 Xsession 里。

而 X Server 的启动则是通过系统文件 /etc/X11/xinit/xserverrc 来指定的 , 这个文件的内容为 :

#!/bin/sh # 注意:该脚本用的是 Bourne shell 解析的

# Id:xserverrc1892005−06−1100:04:27ZbrandenId:xserverrc1892005−06−1100:04:27Zbranden

exec /usr/bin/X11/X -nolisten tcp


综上所述, startx 的默认启动过程为: startx 调用并将系统文件 /etc/X11/xinit/xinitrc 和 /etc/X11/xinit/xserverrc 作为参数传给 xinit , xinit 就会先执行系统文件 /etc/X11/xinit/xserverrc 以启动 X Server ,然后执行 /etc/X11/xinit/xinitrc ,而 xinitrc 则会执行脚本 /etc/X11/Xsession ,而 Xsession 则会按顺序调用执行 /etc/X11/Xsession.d 目录下的文件,从而最终调用了 gnome-session 这个用于 启动 GNOME 桌面环境的程序

四、DISPLAY

http://blog.chinaunix.net/uid-1757778-id-5761936.html

DISPLAY变量代表当前系统的主显示设备,组成为:**hostname: displaynumber.screennumber**

先看下面的例子

  1. echo $DISPLAY
  2. ## 运行结果::0.0
  3. soffice --invisible --norestore --show 1.pptx
  4. ## 运行结果:在当前的显示器上显示了1.pptx
  5. soffice --invisible --norestore --display :0.0 --show 1.pptx
  6. ## 运行结果:在当前的显示器上显示了1.pptx
  7. ## :0:0为代表当前的显示器
  8. soffice --invisible --norestore --display 192.168.0.105:0.0 --show 1.pptx
  9. ## 运行结果:在192.168.0.105的显示器上显示了1.pptx
  10. ## 其中192.168.0.105是客户机,该机器通过MobaXterm的ssh通道连接到当前机器上,
  11. ## MoboXterm自动开启了xServer

一些有用的命令:
http://www.thinkwiki.org/wiki/Xorg_RandR_1.2

  1. echo $DISPLAY # 显示当前的主显示器
  2. xrandr # 显示显示设备列表

DISPLAY
在Linux/Unix类操作系统上, DISPLAY用来设置将图形显示到何处. 直接登陆图形界面或者登陆命令行界面后使用startx启动图形, DISPLAY环境变量将自动设置为:0:0, 此时可以打开终端, 输出图形程序的名称(比如xclock)来启动程序, 图形将显示在本地窗口上, 在终端上输入printenv查看当前环境变量, 输出结果中有如下内容:DISPLAY=:0.0
使用xdpyinfo可以查看到当前显示的更详细的信息.
DISPLAY 环境变量格式如下hostname: displaynumber.screennumber,我们需要知道,在某些机器上,可能有多个显示设备共享使用同一套输入设备,例如在一台PC上连接两台CRT显示器,但是它们只共享使用一个键盘和一个鼠标。这一组显示设备就拥有一个共同的displaynumber,而这组显示设备中的每个单独的设备则拥有自己单独的 screennumber。displaynumber和screennumber都是从零开始的数字。这样,对于我们普通用户来说, displaynumber、screennumber就都是0。 hostname指Xserver所在的主机主机名或者ip地址, 图形将显示在这一机器上, 可以是启动了图形界面的Linux/Unix机器, 也可以是安装了Exceed, X-Deep/32等Windows平台运行的Xserver的Windows机器. 如果Host为空, 则表示Xserver运行于本机, 并且图形程序(Xclient)使用unix socket方式连接到Xserver, 而不是TCP方式. 使用TCP方式连接时, displaynumber为连接的端口减去6000的值, 如果displaynumber为0, 则表示连接到6000端口; 使用unix socket方式连接时则表示连接的unix socket的路径, 如果displaynumber为0, 则表示连接到/tmp/.X11-unix/X0 . screennumber则几乎总是0.
如果使用su username或者su - username切换到别的用户, 并且使用命令
export DISPLAY=:0.0
设置DISPLAY环境变量, 运行图形程序(如xclock)时会收到如下错误:
Xlib: connection to “:0.0” refused by server
Xlib: No protocol specified
Error: Can’t open display: :0.0
这是因为Xserver默认情况下不允许别的用户的图形程序的图形显示在当前屏幕上. 如果需要别的用户的图形显示在当前屏幕上, 则应以当前登陆的用户, 也就是切换身份前的用户执行如下命令
xhost +
xhost 是用来控制X server访问权限的,这个命令将允许别的用户启动的图形程序将图形显示在当前屏幕上.。通常当你从hostA登陆到hostB上运行hostB上的应用程序时,做为应用程序来说,hostA是client,但是作为图形来说,是在hostA上显示的,需要使用hostA的Xserver,所以hostA是
server.因此在登陆到hostB前,需要在hostA上运行xhost +,来使其它用户能够访问hostA的Xserver.
xhost + 是使所有用户都能访问Xserver.
xhost + ip使ip上的用户能够访问Xserver.
xhost + nis:user@domain使domain上的nis用户user能够访问
xhost + inet:user@domain使domain上的inet用户能够访问。
在2台Linux机器之间, 如果设置服务器端配置文件/etc/ssh/sshd_config中包含
X11Forwarding no
客户端配置文件/etc/ssh/ssh_config包含
ForwardX11 yes
则从客户端ssh到服务器端后会自动设置DISPLAY环境变量, 允许在服务器端执行的图形程序将图形显示在客户端上. 在服务器上查看环境变量显示如下(这个结果不同的时候并不相同)
DISPLAY=localhost:10.0
在客户机上用netstat -lnp可以看到有程序监听了6010端口
tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN 4827/1
如果希望允许远程机器上的图形程序将图形显示在本地机器的Xserver上, 除了要设置远端机器的DISPLAY环境变量以外, 还需要设置本地机器的Xserver监听相应的TCP端口. 而现在的Linux系统出于安全的考虑, 默认情况下不再监听TCP端口. 可通过修改/etc/X11/xinit/xserverrc文件, 将
exec /usr/bin/X11/X -dpi 100 -nolisten tcp
修改为
exec /usr/bin/X11/X -dpi 100
允许在直接使用startx启动图形时启动对TCP端口的监听.
修改/etc/kde3/kdm/kdmrc, 将
ServerArgsLocal=-nolisten tcp
修改为
ServerArgsLocal=
允许kdm作为显示管理器时, 启动会话时监听相应的TCP端口.
修改/etc/gdm/gdm.conf, 在[Security]一节增加
DisallowTCP=false
或者在登陆窗口选择”Options” -> “Configure Login Manager…”的Security页面, 取消”Deny TCP connections to Xserver”, 允许gdm作为显示管理器时, 启动会话时监听相应的TCP端口.