macOS远程X Window

我在 从ma上访问远程X window 曾经实践过以CentOS作为服务器,本地Mac OS X作为X11 X Window显示,实现在Linux服务器上运行大型应用程序,本地桌面仅作为显示的部署。

这种方式适合移动工作,所有工作都保存在服务器上,并且充分利用了服务器的强大计算能力。不过,X Window不能断开网络,会导致远程服务器运行程序退出。所以,更为优雅的解决方案是采用X Window的改进部署 X持久化远程应用Xpra ,更为适合移动办公。

在最新的 macOS Big Sur 11.5.2 上,X Window使用和之前旧版本又有些不同,本文将总结在最新 macOS 上使用X Window系统连接Linux服务器,运行Linux服务器上应用的实践经验。

X11.app

XQuartz 是Apple公司提供的X Server,实现了X Window系统。最初X11.app是随着Mac OS X 10.2 Jaguar一起发行的。但是从OS X 10.8 Mountain Lion开始,苹果公司放弃了X11.app,而是采用开源的XQuarz项目来发布。

最新的XQuarz稳定版本是2.7.11,发布时间是2016-10-29。XQuartz不提供高分辨率的Retina显示X11应用,只支持2D图形硬件加速,通过Aqua实现硬件OpenGL加速和集成。

使用XQuartz

XQuartz 官方网站下载最新的 XQuartz-2.7.11.dmg 安装,安装以后需要log out然后再log in一次系统后就会将XQuartz作为默认X Window。

备注

虽然早期X11访问非常简单,仅仅需要 ssh -XC <server_ip> 就可以实现X11转发,也就是远程服务器的X Window客户端会转发请求给本地主机的X Window服务器,实现客户服务器体系运行。(注意,X Window客户服务器体系是和我们常规客户服务器访问相反,本地图形界面的X Window是显示服务器,远程运行计算的应用程序是X Window客户端,客户端把显示发给服务器端来绘出图形。)

但是,随着操作系统不断升级,安全不断加固,早期简单的X Window访问方式已经不能工作,需要按照下文我的探索总结经验来完成。

CentOS服务器端

  • 安装软件包:

    yum install xauth
    

警告

服务器端一定要安装 xauth 程序,否则ssh登陆后,无法打开 DISPLAY ,服务器登陆提示错误:

Warning: untrusted X11 forwarding setup failed: xauth key data not generated
Warning: No xauth data; using fake authentication data for X11 forwarding.

macOS客户端

  • 客户端 /etc/ssh/ssh_config~/.ssh/config 添加设置:

    Host *
    ForwardAgent yes
    ForwardX11 yes
    ForwardX11Trusted yes
    

上述配置可以可以只针对某个服务器配置,例如在 ~/.ssh/config 配置:

Host remote-x-server
    HostName 192.168.1.31
    User huatai
    ForwardX11 yes
    ForwardAgent yes
    ForwardX11Trusted yes

这样就只针对服务器 192.168.1.31 启用X11转发

  • 服务器端 /etc/ssh/sshd_config 确保如下设置:

    AllowTcpForwarding yes
    X11Forwarding yes
    X11DisplayOffset 10
    X11UseLocalhost yes
    

X Window连接访问

  • 启动 XQuartz 的默认会打开一个 xterm 程序,我们的支持X11 Farwarding的 ssh 命令必须在X11图形程序 xterm 中执行,才能使用X Window服务。

关键的步骤来了:

  • 在最新的macOS上,需要使用 -Y 参数避免X11安全检查,不能像早期版本使用 -X 参数,否则会导致ssh登陆没有任何提示,也不提示报错信息:

    ssh -YC 192.168.1.31
    

备注

  • -Y 避免X11安全检查

  • -C 启用压缩,可以提高X Window数据传输效率

可以看到X终端显示一个提示 /usr/bin/xauth: file /home/huatai/.Xauthority does not exist ,不过这个文件会自动创建。

  • 此时我们已经通过 Xquartzxterm 中运行的 ssh 登陆到Linux服务器上,我们现在需要检查环境变量来确定X11转发是否成功:

    env | grep DISPLAY
    

显示输出:

DISPLAY=localhost:10.0

此时远程服务器上执行X程序都会在本地macOS桌面显示,例如你可以在远程服务器上运行 Jetbrain 的开发工具,直接在Linux服务器上进行开发。

参考