X server
X server是X Window System (简称X11或者X)系统中的显示服务器(display server),用于监听X client发送来的图形界面显示请求,并且将图形界面绘制并显示在屏幕(screen)上。
概念解释
- X client:X客户端。通常是各类GUI应用,如Firefox浏览器、xterm、xclock等等
- screen:逻辑概念上的屏幕。可以是一台物理显示器、多台物理显示器或者是VNC虚拟显示器
- X client与X server的通信方式有三种:
TCP
,unix socket
和通过内存通信
。后两种方式仅限于X client与X server都位于同一机器的情况,通信效率更高。
概念关系
- 一台电脑上可以运行多个X server
- 一个X server可以管理多个screen
- 一个screen可以对应单个或多个物理显示器(多个显示器合成一个逻辑screen)
DISPLAY
DISPLAY
变量用于控制“在哪里绘制和显示图形界面”。
DISPLAY
变量值的格式:
- X client与X server都位于同一机器,通过
unix socket
或内存
通信
:<机器运行的第几号X server>.<该X server管理的第几号screen>
如:0.0
,:0.1
,:1.0
- X client与X server位于不同机器,通过
TCP协议
通信
<机器的IP或主机名>:<该机器运行的第几号X server>.<该X server管理的第几号screen>
如192.168.1.2:0.0
,127.0.0.1:1.0
,localhost:10.0
注意:
:0.0
,127.0.0.1:0.0
和localhost:0.0
效果上都是在同一机器绘图,但是:0.0
走的是unix socket
或内存
通信,后两者则是TCP协议
通信。localhost
是一个特殊的主机名,特指机器自身。在IPV4语境下,localhost
主机名经过查表后会被翻译为IP地址127.0.0.1
。因此,127.0.0.1:0.0
和localhost:0.0
表意相同。
使用场景
我需要在树莓派的Linux系统里运行火狐浏览器,然后把浏览器的图形界面展现在我的笔记本电脑上。
- 我有一台笔记本电脑,IP为
192.168.31.200
,仅有一块显示屏。 - 笔记本电脑的系统里运行着一个
0
号X server
。该X server
管理着一个0
号screen
。0
号screen
的内容会展现在笔记本的显示屏中。 - 我还有一块树莓派Linux开发板。树莓派和笔记本电脑处于同一局域网,并且树莓派没有连接显示屏。
- 我在笔记本电脑上,通过SSH登录树莓派系统的Shell,然后运行了如下命令
# 树莓派的Shell
export DISPLAY=192.168.31.200:0.0
firefox
上述命令的含义为
给变量
DISPLAY
赋值192.168.31.200:0.0
并将其设置为当前Shell的环境变量。在Shell中运行”火狐浏览器“。
在执行以上命令后,主要经历了下面几个步骤:
- 前提条件:我的笔记本电脑上运行着
0
号X server,它会监听本机所有IP(包括127.0.0.1
,192.168.31.200
等)上来自6000 + 该服务器运行的第几号X server
(即6000
)TCP
端口的绘图请求。
- 我在树莓派的Shell中运行了火狐浏览器。火狐浏览器是一个图形用户界面(GUI)程序,必须找到一个地方显示图形界面。
- 火狐浏览器此刻的身份是X client。X client为了找到自己应该“在哪里绘制和显示图形界面”,首先会获取当前Shell中
DISPLAY
变量的值192.168.31.200:0.0
。 - X client解析完
DISPLAY
的值后,会把GUI绘图请求通过TCP协议
发送至192.168.31.200
机器的6000 + 0
(即6000
)端口,请求“将绘制结果显示在该X server管理的第0
号screen上”。 - 在
192.168.31.200
机器上,负责监听6000
端口的0
号X server收到请求。X server解析绘图指令,并在指定的0
号screen中绘图。 - 火狐浏览器的图形界面出现在
0
号screen对应的显示器中,也就是出现在了我笔记本电脑的屏幕上。
X11 Forwarding
What You Need to Know About X11 Forwarding
# 本地机器的Shell
# 配置本地机器的DISPLAY环境变量
export DISPLAY=127.0.0.1:0.0
# 开启X11 Forwarding功能的SSH连接
ssh -X 远程机器用户名@远程机器IP地址
# 登录远程机器的Shell后
# Shell的DISPLAY环境变量会被SSH server自动设置为localhost:10.0
在远程机器的Shell中运行一个GUI程序:
- 远程机器的X client解析Shell环境变量DISPLAY的值
localhost:10.0
,通过TCP协议
向远程机器自身的第10
号X server发送绘图请求。 - 远程机器上的SSH server会充当第
10
号X server,接收这个请求。 - SSH server把请求通过加密隧道传输给本地机器的SSH client。
- 本地机器的SSH client接受到绘图请求后,会充当X client,解析本地Shell环境变量DISPLAY的值
127.0.0.1:0.0
,然后向对应的X server发送绘图请求。 - 本地机器的第
0
号X server接收到绘图请求,在指定的0
号screen中绘图。 - 图形界面出现在本地机器的
0
号screen对应的显示器中。
参考
What are X server, display and screen?