公众号关注 「奇妙的 Linux 世界」

设为「星标」,每天带你玩转 Linux !

67c9f70f36a9331ff21fcc7b75451c3e.png

在 Windows 中相信大家已经很熟悉使用 Xmanager(Xshell), MobaXterm, SecureCRT 通过 X11 实现 Linux 图形化界面显示,我的需求是在 macOS 下使用 iTerm2 作为 Terminal 实现 X11 图形化界面显示,网上大部分教程只提到安装 Xquartz 但并没有结合实际问题给出完整的解决步骤,我把实践过程做了详细的记录方便大家按照最简单的步骤实现 Linux 图形化显示效果。

1. X11 介绍

有些 Linux 服务器出于性能和效率的考虑,通常都是没有安装图形化界面的,那么图形化程序在服务器上压根儿就跑不起来,或者无法直接显示出来,这就很尴尬了!那么如何解决这个问题呢?可以基于 X11 Forwarding 技术 + MobaXterm/Xshell/SecureCRT/XQuartz 等第三方工具,就可以轻松搞定,是不是很简单?

X 协议

40cae5986569d499aa0ed95cb60dddab.png

Linux 本身是没有图形化界面的,所谓的图形化界面系统只不过是 Linux 下的应用程序。这一点和 Windows 不一样。Windows 从 Windows 95 开始,图形界面就直接在系统内核中实现了,是操作系统不可或缺的一部分。Linux 的图形化界面,底层都是基于 X 协议。

X 协议由 X server 和 X client 组成:

  • X server 管理主机上与显示相关的硬件设置(如显卡、硬盘、鼠标等),它负责屏幕画面的绘制与显示,以及将输入设置(如键盘、鼠标)的动作告知 X client。

  • X client (即 X 应用程序) 则主要负责事件的处理(即程序的逻辑)。

举个例子,如果用户点击了鼠标左键,因为鼠标归 X server 管理,于是 X server 就捕捉到了鼠标点击这个动作,然后它将这个动作告诉 X client,因为 X client 负责程序逻辑,于是 X client 就根据程序预先设定的逻辑(例如画一个圆),告诉 X server 说:“请在鼠标点击的位置,画一个圆”。最后,X server 就响应 X client 的请求,在鼠标点击的位置,绘制并显示出一个圆。

X11 Forwarding

819f2d974b7d5a0a3fac3baed0f9af80.png

这么绕,有啥意义呢?当然有!

许多时候 X server 和 X client 在同一台主机上,这看起来没什么。但是, X server 和 X client 完全可以运行在不同的机器上,只要彼此通过 X 协议通信即可。于是,我们就可以做一些 “神奇” 的事情,比如像本文开头谈到的,在本地显示 (X server),运行在服务器上的 GUI 程序 (X client)。这样的操作可以通过 SSH X11 Forwarding (转发) 来实现。

X11 中的 X 指的就是 X 协议,11 指的是采用 X 协议的第 11 个版本。

6ef8704f0f6d91c305ebddafc87cc9b8.png

点击上方图片,打开小程序,『饿了么外卖』红包天天免费领!

2. macOS 实现 X11 图形化界面显示

# macOS 安装 xquartz
$ brew cask install xquartz

# 启动 xquartz,实测 `Allow connections from clients` 选项非必须条件
Run Applications > Utilities > XQuartz.app

# 设置 DISPLAY 环境变量
$ export DISPLAY=:0

# 没有使用 xquartz 中 terminal 的话不会自动设置 DISPLAY 环境变量,可能会出现以下错误
$ [root@VM-2-11-centos ~]# firefox
Failed to open connection to "session" message bus: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
Running without a11y support!
Error: no DISPLAY environment variable specified

# ssh 添加 - Y flag 登录远程主机
$ ssh -Y user@host

# 登录成功后可能出现以下错误,安装 xauth 即可解决
$ ssh -Y root@192.168.117.148
X11 forwarding request failed on channel 0

# 远程主机安装 xauth,以 centos 为例,使用 xclock 可以测试图形化效果
$ yum install -y xauth xclock
$ xclock

# 如果需要浏览器支持安装 firefox 或者 chrome 即可
$ yum install firefox
$ firefox

$ yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
$ /usr/bin/google-chrome-stable %U --no-sandbox
4a5b160a77018ae39dee58d06d7e3aba.png 493a5cfb2b80b0dd0d6992ecc74c5fd5.png

3. FAQ

  1. Why do I need to install Xquartz?

    From https://stackoverflow.com/a/50182736/6769366

    XQuartz is standard. It used to come bundled with the OS, but Apple removed it back around Mavericks.

  2. Why do I have to add environment DISPLAY?

    Please see https://askubuntu.com/a/432257/745885[1]

  3. Why do I have to use -Y instead of -X?

    I got the following error when trying to run a python script which draws some curves using matplotlib:

X Error of failed request:  BadAccess (attempt to access private resource denied)
Major opcode of failed request:  18 (X_ChangeProperty)
Serial number of failed request:  12
Current serial number in output stream:  15

This problem is sovled when using -Y instead of -X. Haven’t got enough time to find exact explanation, just post a link for those who are curious:

Can’t run “ssh -X” on MacOS Sierra[2]

  1. How to fix X11 forwarding request failed on channel 0?

    Install X authority file utility

$ sudo yum install xauth

参考资料

[1]

https://askubuntu.com/a/432257/745885: https://askubuntu.com/a/432257/745885

[2]

Can’t run “ssh -X” on MacOS Sierra: https://stackoverflow.com/q/39622173/6769366

原文链接:https://wsgzao.github.io/post/x11/

本文转载自:「云原生实验室」,原文:https://tinyurl.com/yc7o5fm3,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。

4067ee8d928e7e15e9553b02ac31436f.gif

72b2c3684129b3c2b48840dd09f6d994.png

你可能还喜欢

点击下方图片即可阅读

233db97e2385dfca55d68d5a234ddfb6.png

巧用 Docker 在 Linux 下 运行微信 PC 客户端

06c505500703535c941c0ebc17f75ce7.png
『美团|饿了么』外卖红包天天免费领,吃饭省钱杠杠滴!

17c92b7417363cd6a80f8e72032baf6f.png

更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐