==相关的文档:==

  1. 本地桌面环境,如 GNOME
  2. xrdp远程桌面对X-Server的影响
  3. configure-X11Forward-to-display-remote-GUI
  4. docker容器如何使用主机的显示服务

三种场景的终极对比:为什么绝不冲突

场景DISPLAY 变量X Server 实例通信方式详细通信过程
本地物理登录:0运行在物理显卡上的 主 Xorg 实例GUI 程序 → /tmp/.X11-unix/X0 → 物理 Xorg启动程序:运行 GUI 程序(例如 Firefox)。这个程序就成了一个 X Client建立连接:程序启动后,会立刻去寻找并连接到正在运行的 X Server (也就是 Xorg)。发送请求:程序会向 X Server 发送一系列请求。服务器响应:X Server 收到这些请求后,开始工作。
• 它调用显卡驱动,在屏幕上把窗口和按钮画出来。
• 它监听鼠标和键盘的动作。当你点击那个按钮时,X Server 会捕捉到这个事件。事件通知:X Server 随后会把这个“点击事件”打包,发送回给你的程序(X Client)。程序处理:你的程序收到这个事件后,就会执行相应的代码逻辑(比如提交一个表单)。
SSH with -Xlocalhost:10.0(或类似)不创建新实例,依赖连接端(您本地电脑)的 Xorg (:0)GUI 程序 (远程) → SSH 隧道 (TCP) → 本地 SSH 客户端 → 本地物理 XorgGUI 程序尝试连接 localhost:10.0,而这个地址正好被 SSH 服务端监听着。SSH 将所有发往这个“假”地址的图形指令,通过加密的 SSH 隧道,安全地转发(Forward)回你的 LocalPC。你 LocalPC 上的 SSH 客户端收到这些指令后,再把它们交给 LocalPC 上真正LOCK_PLACEHOLDER} (或类似)XRDP 启动的一个回你的 :0。你 LocalPC 上的 SSH 客户端收到这些指令后,再把它们交给 :10 上 Xorg-for-xrdp

回你的 :0。你 :10 上的 SSH 客户端收到这些指令后,再把它们交给 Xorg 上

  1. 回你的 X0。你 X10 上的 SSH 客户端收到这些指令后,再把它们交给 DISPLAY 上:本地登录的 DISPLAY=:10 和 XRDP 的 /tmp/.X11-unix/X10 是两个**核心区别与无冲突的原因:**的 DISPLAY=localhost:10.0 进程,它们各自管理各自的资源,使用不同的 Socket 文件 (6010 vs 10),因此在进程和文件层面是完全隔离的。

  2. 10 回你的 X10。你 {INLINE_CODE_BLOCK_PLACEHOLDER} 上的 SSH 客户端收到这些指令后,再把它们交给 {INLINE_CODE_BLOCK_PLACEHOLDER} 上:这是最关键的一点!

    • {INLINE_CODE_BLOCK_PLACEHOLDER} (XRDP 场景) 指的是一个XRDP 连接:{INLINE_CODE_BLOCK_PLACEHOLDER}。这是一种基于文件系统的、非常高效的进程间通信方式。
    • {INLINE_CODE_BLOCK_PLACEHOLDER} (SSH 场景) 指的是一个全新的、独立的 Xorg 实例,称之为:端口号为 {INLINE_CODE_BLOCK_PLACEHOLDER} (6000 + 10)。这是一种基于网络的通信方式。

    虽然数字都是 {INLINE_CODE_BLOCK_PLACEHOLDER},但一个是 Unix Socket,另一个是 TCP 端口,它们在操作系统层面是两种完全不同的东西,所以即便在同一台机器上,SSH X11 转发恰好也想用 {INLINE_CODE_BLOCK_PLACEHOLDER} 号端口,也和 XRDP 的 {INLINE_CODE_BLOCK_PLACEHOLDER} Socket 毫无关系。

  3. X Server 实例的独立性:从这里您也可以看出,XRDP 会更消耗服务器资源,因为它为每一个连接的用户都运行了一个完整的桌面环境和 Xorg 实例。而 SSH X11 转发则轻量得多,它仅仅是转发了绘图指令,计算和渲染最终是在您自己的本地电脑上完成的。

附录

X Server 和 Xorg 的关系

  • X Server 是框架,是抽象。
  • Xorg 是实现,是具体。