考虑一个情况,如果你的 Linux 主机主要是用来作为图形处理时,而且同时有多人需要用到那个功能, 那么一部 Linux 是否一次仅能提供一个人处理那个软件呢?嘿嘿!那可不一定喔!因为 Linux 有相当优秀的 X Window System 啊!现在就来谈谈第一个图形接口的远程联机服务器吧!
1、X Window 的 Server/Client 架构与各组件
由于我们 Linux 使用的图形接口是所谓的 X-Window System 的东西,这玩意儿是能够跨平台的,目前在 Linux 上头开发的图形接口软件,几乎都是使用这个 X 的架构来处理,所以啰,你就不能够不知道 X Window 啦! 我们在基础篇第三版的二十四章已经讲过 X Window 啦, 因此这里只会作个简单的介绍,以方便大家来了解为何我们的软件是这么安装与设定喔!
X Window System 在运作的过程中,又因控制的数据不同而分为 X Server 与 X Client 两种程序,虽然说是 X Server/Client , 但是他的作用却与网络主机的 Server/Client 架构大异其趣喔~先来说说 X Server/Client 这两种程序所负责的任务先:
X Server: 这组程序主要负责的是屏幕画面的绘制与显示。 X Server 可以接收来自 X client 的数据,将这些数据绘制呈现为图面在屏幕上。 此外,我们移动鼠标、点击数据、由键盘输入数据等等,也会透过 X Server 来传达到 X Client 端,而由 X Client 来加以运算出应绘制的数据;
鸟哥常常开玩笑的说, X server 就是画布,而 X client 就是手拿画笔的画家。你得要先有画布 (管理好所有可显示的硬件后) 之后画家的想法 (计算出来的绘图数据) 才能够绘制到画布上!
由于每一支 X client 都是独立存在的程序,因此在图形显示会发生一些迭图的问题 (想象一下每一个 X client 都是一个很自我的画家, 每个画家都不承认对方的存在,都自顾自的在画布上面作画,最后的结果会是如何?)。因此,后来就有一组特殊的 X client 在进行管理所有的其他 X client 程序,这个总管的咚咚就是 Window Manager!
既然 X Window System 是 Linux 上面的一组程序,那么它如何启动的呢?早期的用户在登入系统后,必须要自己先启动 X server 程序,然后再启动个别的 Window manager ,若有其他需求,再启动其他额外的 X client 就是了。这么麻烦!所以为了简化启动个人图形接口的步骤,后来还有所谓的 Display Manager (DM) 这玩意喔!
Display Manager (DM):提供使用者登入的画面以让用户可以藉由图形接口登入。 在使用者登入后,可透过 display manager 的功能去呼叫其他的 Window manager ,让用户在图形接口的登入过程变得更简单。 由于 DM 也是启动一个等待输入账号密码的图形数据,因此 DM 会主动去唤醒一个 X Server 然后在上头加载等待输入的画面就是了。
在目前新释出的 Linux distributions 中,通常启动图形接口让用户登入的方式中,都是先执行 Display Manager 程序, 该程序会主动加载一个 X Server 程序,然后再提供一个等待输入账号密码的接口程序,之后再根据用户的选择去启动所需要的 Window Manager 程序,最后就由用户直接操作 WM 来玩图形接口啰。
X Client: 这组程序主要负责的是数据的运算。 X Client 在接受到 X Server 传来的数据后 (例如移动鼠标、点击 icon 等动作),会经由本身的运算而得到鼠标应该要如何移动、 点击的结果应该要出现什么样的数据、键盘输入的结果应该要如何呈现等等,然后将这些结果告知 X Server ,让他自行去绘制到屏幕上。
鸟哥常常开玩笑的说, X server 就是画布,而 X client 就是手拿画笔的画家。你得要先有画布 (管理好所有可显示的硬件后) 之后画家的想法 (计算出来的绘图数据) 才能够绘制到画布上!
由于每一支 X client 都是独立存在的程序,因此在图形显示会发生一些迭图的问题 (想象一下每一个 X client 都是一个很自我的画家, 每个画家都不承认对方的存在,都自顾自的在画布上面作画,最后的结果会是如何?)。因此,后来就有一组特殊的 X client 在进行管理所有的其他 X client 程序,这个总管的咚咚就是 Window Manager!
既然 X Window System 是 Linux 上面的一组程序,那么它如何启动的呢?早期的用户在登入系统后,必须要自己先启动 X server 程序,然后再启动个别的 Window manager ,若有其他需求,再启动其他额外的 X client 就是了。这么麻烦!所以为了简化启动个人图形接口的步骤,后来还有所谓的 Display Manager (DM) 这玩意喔!
Display Manager (DM):提供使用者登入的画面以让用户可以藉由图形接口登入。 在使用者登入后,可透过 display manager 的功能去呼叫其他的 Window manager ,让用户在图形接口的登入过程变得更简单。 由于 DM 也是启动一个等待输入账号密码的图形数据,因此 DM 会主动去唤醒一个 X Server 然后在上头加载等待输入的画面就是了。
在目前新释出的 Linux distributions 中,通常启动图形接口让用户登入的方式中,都是先执行 Display Manager 程序, 该程序会主动加载一个 X Server 程序,然后再提供一个等待输入账号密码的接口程序,之后再根据用户的选择去启动所需要的 Window Manager 程序,最后就由用户直接操作 WM 来玩图形接口啰。
[jzsjiale_fold=例题]在 CentOS 6.x 当中,若预设为 init 5 的情况下,那么最终启动图形接口的是哪一只程序?
答:
分析 /etc/init/* 当中的档案,会发现有个档案的内容是这样:
[root@www ~]# cat /etc/init/prefdm.conf
start on stopped rc RUNLEVEL=5
stop on starting rc RUNLEVEL=[!5]
console output
respawn
respawn limit 10 120
exec /etc/X11/prefdm -nodaemon
你可以分析 /etc/X11/prefdm 的内容,就能够发现其实该行启动的就是一个 X display manager 程序了喔![/jzsjiale_fold]
[jzsjiale_fold=例题]登入 init 5 的 CentOS 6.x 之前,先到 tty1 去查阅一下 X server 是由哪一支程序所唤醒的?
答:
我们可以透过 pstree 来观察程序间的相关性喔!同时注意,预设的 CentOS 6.x 的 X server 程序名称为 Xorg 的哩。[mw_shl_code=applescript,false][root@www ~]# pstree -p
init(1)-+-NetworkManager(1086)
....(中间省略)....
|-gdm-binary(2642)---gdm-simple-slav(2661)-+-Xorg(2663)
| |-gdm-session-wor(2746)
(1)X Window System 用在网络上的方式: XDMCP
当 X server, X client 都在同一部主机上面的时候,你可以很轻松的启动一个完整的 X Window System。 但是如果你想要透过这个机制在网络上面启动 X 呢?此时你得先在客户端启动一个 X server 将图形接口绘图所需要的硬件装置配置好, 并且启动一个 X server 常见的接收埠口 (通常是 port 6000),然后再由服务器端的 X client 取得绘图数据,再将数据绘制成图啰。 透过这个机制,你可以在任何一部启动 X server 登入服务器喔!而且不管你的操作系统是啥呢!意义就像下图, 如此一来,你就可以取得服务器所提供的图形接口环境啦!
图 11.3-1、X server/client 的架构
但是如果你是使用最笨的方法在客户端自己启动 X server ,然后在告诉服务器将 X client 程序一个一个的加载回来, 那就太累人了吧!我们之前上面不是提到过可以用 display manager 来管理使用者的登入与启动 X 吗?那服务器能不能提供一个类似的服务, 那我们直接透过服务器的 display manager 就能够提供我们登入的认证与加载自己选择的 window manager 的话,这样就太棒了! 能够达到吗?当然可以啊!那就是透过 Xdmcp (X display manager control protocol) (注3) 啦!
Xdmcp 启动后会在服务器的 udp 177 开始监听,然后当客户端的 X server 联机到服务器的 port 177 之后, 我们的 Xdmcp 就会在客户端的 X server 放上用户输入账密的图形接口程序啰!那你就能透过这个 Xdmcp 去加载服务器所提供的类似 Window Manager 的相关 X client 啰!那你就能够取得图形接口的远程联机服务器哩!赞吧!
那么什么时候会出现多使用者连入服务器取得 X 的情况呢?以鸟哥的例子来说,鸟哥实验室有一组 Linux 在进行数值模拟, 他输出的结果是 NetCDF 档案,我们必须使用 PAVE 这一套软件去处理这些数据。但是我们有两三个人同时都会使用到那个功能, 偏偏 Linux 主机是放在机架柜里面的,要我们挤在那个小小的空间前面『站着』操作计算机,可真是讨人厌啊~ 这个时候,我们就会架设图形接口的远程登录服务器,让我们可以『多人同时以图形接口登入 Linux 主机』来操作我们自己的程序!很棒,不是吗!
3、用户系统为 Linux 的登入方式
由于 Linux 本身的窗口就是由 X server 提供来的,因此使用 Linux 登入远程的图形服务器是很简单的啦! 但是因为启动 X 的方式不同而已数种启动方式,底下我们就讲讲两个常见的启动方式:
(1)在不同的 X 环境下启动联机: 直接用 X
如果你的客户端已经在 runlevel 5 了,因此其实你已经有一个 X 窗口的环境,这个环境的显示终端机就称为『 :0 』。 在 CentOS 6.x 的环境中,如果原本就是 runlevel 5 的环境,那么这个图形接口的 :0 是在 tty1 终端机啦!如果是由 runlevel 3 启动图形接口,那就是在 tty7 喔!由于已经有一个 X 了,因此你必须要在另外的终端机启动另一个 X 才行!那个新的 X 就称为 :1 接口,其实通常就在 tty7 或 tty8 啦!但因为 X server 要接受 X client 必须要有授权才行, 所以你得先在窗口接口开放接受来自服务器的 X client 数据。
此外,虽然你在客户端是以主动的方式连接到服务器的 udp port 177 ,但是服务器的 X client 却会主动的连接到你客户端的 X server,因此,你必须要开放来自服务器端主动对你的 TCP port 6001 (因为是 :1 界面) 的防火墙联机才行喔!那就来实做看看:
[mw_shl_code=applescript,false]# 1. 放行 X client 传来的资料:在 X Window 的画面当中启用 shell 输入:
[root@clientlinux ~]# xhost + 192.168.100.254
192.168.100.254 being added to access control list
# 注意!你是客户端!且假设我刚刚那部 Linux 主机的 IP 为 192.168.100.254
# 2. 开始放行防火墙,因为我们启动 port 6001 ,所以你在客户端这样作:
[root@clientlinux ~]# vim /usr/local/virus/iptables/iptables.allow
iptables -A INPUT -i $EXTIF -s 192.168.100.0/24 -p tcp --dport 6001 -j ACCEPT
记得上面的图示要选择 One window 或 Fullscreen 或 One window without titlebar 才能够使用 XDMCP 喔!选择完毕后按『下一步』 就会出现如下的画面:
图 11.3-5、Xming 的 Xdmcp 连接方式示意图
上述的图示当中共有三种传递 X client 的方法,在这个小节当中我们要连到 xdmcp ,所以你得要选择第三个喔!之后再下一步会出现下图:
图 11.3-6、Xming 的 Xdmcp 连接方式示意图
这里当然就是连接到你想要连上去的 xdmcp 服务器啰!将他的 IP 填上去吧!之后再下一步去:
图 11.3-7、Xming 的 Xdmcp 连接方式示意图
上图的项目与数据的互相复制贴上有关,保留默认值即可。按下下一步吧!
图 11.3-8、Xming 的 Xdmcp 连接方式示意图
出现上图就是设定完毕了,给它按下『完成』之后,你就会发现如同图 11.3-2 的画面出现,你就能够开始在 Windows 底下连上图形接口的 Linux Server 啰!很轻松吧!
(1)重点在 Server 与 Client 的防火墙上
其实从上面的设定当中你会发现, XDMCP 不论是在 Server 还是 Client 的设定上面都很简单!但是有时候你就是会发现, 明明所有的动作都做完了,但是就是没有办法连上 Xdmcp 服务器!最容易发生错误的其实就是防火墙啦!因为虽然我们客户端启动 X server 后,会主动联机到服务器端的 Xdmcp (port 177),但是,接下来却是服务器主动联机到我们客户端的 X server (可能是 port 6000~6010)。 因此,如果你只是设定了服务器的防火墙而已,那么很可能出现问题的应该就是客户端的防火墙忘记打开提供服务器主动联机的规则啰! 这点是必须要跟大家说明的喔!