之前远程Linux桌面,一般用VNC或者XRDP。但是Ubuntu服务器版本的桌面系统稳定性有很大问题,因此近年来基本放弃了远程桌面的打算。

近日不得已需要用到Ubuntu系统的远程界面,设置了很久VNC或者屏幕共享仍然没成功。就在要放弃的时候,忽然想到可以用SSH的X11 Forwarding特性来远程执行Linux系统上的GUI程序啊!

于是在Mac电脑上下载Xserver程序,顺利运行了远程系统的GUI程序,本文做简要记录。

Linux X系统介绍

X系统(X Window System)最早由 MIT在 1984 年提出, 主要目的是希望能够实现一个与系统无关的通用窗口系统。在开发 X 时,开发者就希望窗口接口不要与硬件有强烈的相关性,否则就等于是一个新操作系统了, 会导致应用上的局限。因此 X系统在设计之初就是以应用程序的概念来开发的,而非以操作系统来开发。

X系统提出后不断经厂商更新,一直到 1987 年到 X11 版本,这一版 X 取得了明显的进步, 后来的窗口接口改良都是架构于此一版本,因此后来 X系统也被称为 X11 。

X系统采用Client/Server主从式架构,X Client和X Server 以 X Protocol 沟通。通常情况下,X server与X client都运行在同一台机器上,但因为X系统当初设计成是通过socket在X server与X client之间通信的,所以它们也可以运行在不同的机器上

X Client执行具体逻辑,将需要绘制的画面告知X Server;X Server管理硬件,绘制界面,同时接受鼠标/键盘的输入。具体来说,我们看到的浏览器、LibreOffice、thunderbird等GUI程序都属于X Client,X server在后台运行,一般通过手动启动或者由Display Manager启动。

使用SSH的X11 Forwarding运行Linux系统的GUI程序

理解了X Server和X Client的关系,通过SSH远程运行Linux GUI程序就比较简单了:

首先,确认远程服务器上的SSH服务端开启了X11Forwarding功能(默认开启):

# 编辑 /etc/ssh/sshd_config 文件
X11Forwarding yes
# 如果之前未开启,保存配置文件后重启sshd
systemctl restart sshd

解下来,远程服务器上安装xauth包。如果远程服务器安装时带桌面环境,xauth包已经默认安装,可以跳过这一步。无界面版的远程服务器需手动安装:

# CentOS
yum install -y xorg-x11-xauth
# Debian/Ubuntu
apt install -y xauth

接着,在本地电脑上安装X Server程序。运行带桌面环境的Ubuntu、Debian、Fedora、CentOS等Linux发行版的本地电脑,已经自带X Server,可以略过这一步。WindowsMacOS系统需要自行下载X Server程序:MacOS可到 https://www.xquartz.org/ 下载XQuartz程序,Windows可到 https://sourceforge.net/projects/vcxsrv/ 下载VcXsrv,或到 https://sourceforge.net/projects/xming/ 下载Xming,安装并运行X Server程序。

最后,开启X11 Forwarding选项,ssh连接到远程服务器,运行GUI程序:

# -X 选项开启X11 Forwarding
ssh -X user@host
# 运行远程GUI程序,界面将在本地电脑上显示出来
firefox

X11 Forwarding相关事项

1. 和VNC和XRDP等技术相比,X11 Forwarding数据传输量很大,效率低,不建议长时间使用

2. 如上面所说,不需要在远程服务器上运行桌面系统,只需安装xauth包;

3. GUI形式的ssh客户端,需要在设置中开启X11 Forwarding。例如putty上的设置:

putty开启X11 Forwarding
putty开启X11 Forwarding

参考

1. 使用SSH的X11 Forwarding远程执行GUI程序

2. 什么是 X Window System

3. Why is X11 forwarding so inefficient?

4. CentOS 7安装GUI界面及远程连接

5. 我为什么不喜欢Ubuntu?