使用 X11 转发在 Mac 上运行 Linux GUI 程序


一、前言

一直以来,我基本上没有在 Linux 上碰过 GUI 程序,因为确实没这个需要。

而最近恰好在学习 SDN,需要用到一些 Linux 平台的 GUI 工具(如 Wireshark、MiniEdit)。

那是不是要在 Linux 上装一个 GUI 界面和 VNC 服务器,然后在 Mac 上用 VNC 连接?

或者直接在 Linux 虚拟机中操作?

如果是的话,那我还写这篇文章干嘛?哈哈。

我要通过 X Window 系统中的一个特色来实现它!


二、X Window 系统简介

X Window 系统最初是由 MIT 在 1984 年开发的,目的是为了给 Unix 以及类 Unix 操作系统一个通用性强且硬件无关的 GUI 接口。

目前常见的 X Window 系统都是基于 11 版本进行改良的,所以统称为 X11。

X11 使用了 C/S 架构,大致的工作原理如下图:

当一个「X 客户端」启动时,就会与「X 服务器」建立连接,然后告诉「X 服务器」该如何显示画面。

「X 服务器」接受鼠标、键盘等外设的输入之后,会把相应的变化传给「X 客户端」。

「X 客户端」经过处理之后又会告诉「X 服务器」如何显示画面……循环往复。

X Window 系统基本上就是这样工作的。

那为什么还需要「X 窗口管理器」呢?主要是因为「X 服务器」实在是太笨了。

当多个「X 应用」连接到「X 服务器」时,「X 服务器」无法将它们分离开,而是会叠在一起显示……

所以,我们一般不会让「X 应用」直接告诉「X 服务器」该怎么显示。

「X 窗口管理器」的主要作用就是对多个「X 应用」的界面进行整理、排序以及调度,然后加一些额外的界面,把最终处理的结果发给「X 服务器」进行显示。

「X 窗口管理器」是「X 应用」与「X 服务器」沟通的桥梁。

目前像 KDE、GNOME 这些所谓的 Linux GUI 其实就是「X 窗口管理器」,它们作为「X 客户端」直接和「X 服务器」进行交互。

在正常情况下,「X 服务器」、「X 窗口管理器」和「X 客户端」都是在同一个机器上。

而下面说要讲的 X11 转发就是把「X 服务器」和「X 窗口管理器」从同一个机器上剥离开来。


三、系统环境

  • Mac(客户端):macOS 10.13.4
  • 服务器:CentOS 7.4.1708

四、准备工作

4.1 在 Mac 上安装 XQuartz

下载链接

打开上面的链接,下载指定的软件包。

下载完成后按提示安装即可。

4.2 在服务器上安装 xauth

在服务器上执行以下命令:

yum -y install xauth

4.3 修改服务器的配置

请使用 vim 之类的文本编辑器打开服务器上的 /etc/ssh/sshd_config

然后将 X11Forwarding 以及 X11UseLocalhost 这两行修改为:

X11Forwarding yes

以及

X11UseLocalhost no

另外如果服务器关闭了 IPv6 功能,那么还要将 AddressFamily 这一行修改为:

AddressFamily inet

然后保存退出。

4.4 在服务器上安装 X11 小工具(可选)

这一步是为了下面的测试环节。

在服务器上执行以下命令:

yum -y install xorg-x11-apps

五、操作步骤

5.1 客户端连接到服务器并启用 X11 转发功能

命令用法

ssh -Y [其他选项] <用户名>@<服务器 IP/域名>

连接之后,如果终端窗口上没有出现以下内容:

X11 forwarding request failed on channel 0

说明 X11 转发开启成功。

5.2 试运行 X11 程序(可选)

xeyes &
xclock &

运行之后稍等片刻,Mac 上面就会弹出两个窗口,如下图:


这样就成功了。


六、原理解析

当 SSH 连接建立完成且成功开启了 X11 转发之后,服务器默认会监听 127.0.0.1(localhost)的 6010 端口。

我们来看看服务器上 DISPLAY 这个环境变量:

[[email protected] ~]# echo $DISPLAY
localhost:10.0

这个环境变量用于告诉 X 应用在哪里显示。

变量中的 localhost 表示 X 服务器的地址;10 表示端口自 6000 的偏移量(10 即表示端口 6010);0 表示在 X 服务器上的第 0 个显示器上显示。

当在服务器中打开 X 应用时,X 应用就会和 localhost:6010 建立连接。然后服务器就会和客户端建立起一条 SSH 隧道,对接客户端上的 X 服务器,从而实现服务器的 X 程序在客户端上显示。

而 Mac 上的 XQuartz 可以看成是一个带窗口管理功能的 X 服务器。


七、注意事项

X11 转发对网络环境要求较高,建议在服务器与客户端之间的网络稳定的情况下使用。

否则将会出现窗口卡顿或显示不全的情况。

另外,一旦 SSH 掉线,那么所有 X11 应用也将被强制退出。


八、参考文献

  1. 利用 X11 Forwarding 运行 VPS 上的图形界面软件 – FINALTHEORY 的技术感悟
  2. 在 mac osx 安装 XQuartz 并配置 x11 forwarding – Birdcat’s Blog
  3. 通过 SSH 进行 X11 转发 – 睿
  4. Linux 有问必答:如何修复“X11 forwarding request failed on channel 0” 错误 – Linux 中国
  5. How configure X11 Forwarding in RHEL 7, CentOS 7 – RTFMP

发表评论