2016年2月12日 星期五

簡介 X Window 系統 (An Introduction to the X Window System)

UNIX/Linux作業系統的使用者均應該有使用X視窗系統的經驗,雖然多數使用者知道其為一圖形介面系統,但鮮少有較深入之了解與探討,因此本文將詳細介紹X 視窗系統的歷史沿革,闡明X視窗的系統架構和基礎名詞,並說明X 視窗系統以網路為中心的主從架構之設計及設定方式,最後並展望 X 視窗系統的未來發展趨勢。

 

壹. X 視窗系統的發展沿革

X 視窗系統(有時又稱為X、X11)始於1984的麻省理工學院(MIT)電腦科學實驗室與DEC合作的雅典娜(Athena)計劃,後續的 X Consortium 、Open Group、Xorg Foundation等組織繼續發展並推廣貢獻,三十年來X 視窗早已成為UNIX/Linux系統的圖形介面代表而被廣泛使用,下圖則為X視窗系統發展沿革與版本進展:

X_history

貳. X 視窗系統的主要特性

X視窗系統的設計哲學與架構與許多現代大家所熟知的圖形介面系統有所不同,較值得留意的特性包括了:

  • 定義圖形使用者介面(GUI)的機制,而非主導介面方針 (Mechanism, not Policy)
  • 設計與作業系統獨立而無關
  • 主從架構 (Client/Server Architecture) 模式
  • 具網路透明性 (netwprk transparent)為基礎的視窗系統

一. 提供機制而非方針(Provide mechanism, not Policy)

X視窗的設計哲學強調只定義圖形介面系統的基本運作機制,而不去強制規範或統一圖形介面的策略,換言之,X視窗只負責定義主從架構下的通訊協定、一般圖形元素(protocol and graphics primitives)和事件處理(event handling),並不規範應用程式的圖形介面設計,亦不統一整體視覺外觀和視窗的功能及操作方式,例如 X Window雖然提供了產生視窗的方法,但它並沒規定視窗應該要如何呈現以及如何擺放,因為圖形介面策略是交由外部程序-視窗管理員 (Window Manager)來決定的,因此不同的Linux/UNIX作業系統或發行版本中的X視窗系統可能有著相當差異性的外觀介面,而且視窗的行為、外框,滑鼠及鍵盤操作方式亦可能不同,此種設計哲學提供了彈性化的圖形介面自訂方式,但對一般使用者而言,在不同作業平台或發行版本上使用X視窗系統也將可能遭遇到不一致的外觀與操作體驗方式,因為X圖形介面的外觀與視窗行為操作方式可經由自行選定的特定程式(例如桌面環境與視窗管理員)來控制,這與微軟的Windows系統或Mac OS X,即使是不同的版本,但具有一致性的操作介面與外觀頗不一樣。

二. 獨立於作業系統的設計

X 視窗與其它如微軟或麥金塔視窗的另一個顯著不同點在於其設計上是與作業系統獨立無關的,亦即圖形介面系統並非被整合成為作業系統的一部份,因此如果不需要圖形介面,則X視窗系統是允許不用安裝的,例如許多Linux伺服器用途的發行版本預設上並未安裝X視窗系統,其主要的考量不外乎著眼於於更佳的效能和安全性,雖然微軟作業系統也有Server Core的非圖形介面版本的設計,但那也僅存在於最近的伺服器層級作業系統版本而非原始設計。

三. 以網路為中心的主從架構

X 視窗系統採用主從模式(client–server model),而架構中包括了X伺服端、X用戶端和X協定三部份。

  • X 伺服端:X伺服端提供了X視窗系統的輸出/輸入服務,亦即用以支援滑鼠、鍵盤輸入與螢幕輸出顯示之服務,因此執行X伺服器服務的電腦通常就是使用者操作系統的電腦。
    在許多Linux系統中,預設上只要已安裝圖形介面系統,即已安裝了X伺服器,而Linux的X Server常為一個單一執行檔案(usr/bin/xorg)以及相關的組態檔(/etc/X11/xorg.conf),而微軟的Windows系統也有許多可選用安裝的免費或商用付費的X Server,至於新版的OS X已不再包括X Server,您需要在 OS X上安裝XQuartz 。
  • X 用戶端:X 視窗系統中的每個X應用程式,稱為X用戶端,例如xterm、xeyes、Firefox等。
  • X 協定:X視窗定義了用戶端與伺服端間透過TCP通訊協定傳送請求、回應、事件與錯誤的四類訊息,此外,X協定採用了非同步的事件運作機制,因此具有較佳的網路效率,而X協定亦具備了和位置無關的網路透明性。
    X通訊預設上使用的伺服端通訊埠開始於6000,亦即X伺服端的第一個顯示會傾聽於通訊埠6000來接受輸出入請求,假若系統還有第二個顯示,則X伺服程式會傾聽於6001,依此類推。

X伺服器和X客戶端可以執行在相同機器或不同機器上,而允許二端的機器使用完全不同的硬體架構或不一樣的作業系統,X用戶端只要定義好顯示IP與代號且X伺服端亦設定好存取控制即可經由網路來遠端分散執行與遠端顯示,而X視窗網路透明性特性意謂著X應用程式可以由散佈在網上的任何遠端機器上來運行。

下圖說明了X視窗系統的X用戶端和伺服端可在同一部電腦執行,也可分屬不同的電腦上透過網路執行。

xclientserver

X視窗的主從架構設計模式與現今大家所熟知的主從架構伺服服務的運作方式剛好有些相反,傳統上的主從架構網路服務,通常多個使用者透過用戶端電腦(即使用者操控用戶電腦)向伺服端提出服務或運算的請求,然而在 X視窗架構下,使用者卻是在其本機端安裝X 伺服端軟體(即使用者操控X 伺服端電腦),然後存取遠端電腦上的X用戶端應用程式,換言之,X伺服端負責提供並管理顯示和輸入服務,X用戶端透過TCP/IP連接至X伺服端(使用者電腦)來執行繪圖的操作。

參. X 視窗系統使用者介面元件

基本的X視窗系統使用者介面,只需要一個X終端用戶以及一個用以顯示的X伺服端,但近代X視窗系統為了具有完整的桌面體驗、視窗的外觀暨操作能力以及一致友善的軟體應用經驗,因此還需要設計有視窗管理員(Window Manager)和桌面環境(Desktop Environments)。

在Linux/UNIX系統中,視窗管理員、桌面環境及相關元件大多允許彈性的恣意取代或高度客制化,而主從架構下的使用者介面相關元件如下圖所示:

xwincomponents

示管理員 (Display manager)

顯示管理員於X11R3首次推出,又稱為登入管理員 (Login Manager),為一提供X視窗圖形介面登入提示畫面的程式並且啟動遠端主機的視窗管理員,它可視為 UNIX/Linux系統上的getty或login圖形替代程式,顯示管理員存在許多不同的應用版本,常見的如 XDM、LightDM、GDM、KDM、LXDM等,而與顯示管理員相關的XDMCP與xauth協定亦於X11R4推出。

視窗管理員 (Window Manager)

視窗管理員為X視窗系統內用以控制視窗位置、視窗外觀與視窗行為的一個特殊X用戶端軟體,某些視窗管理員被開發成為桌面環境的一部份,有些視窗管理員則是設計為獨立安裝使用,因此舉凡視窗邊界、標題欄、視窗位置與能夠放大縮小均為視窗管理員所控管、常見的視

窗管理員為 Compiz, Metacity, Mutter, W9dk, fluxbox。

桌面環境 (Desktop Environments)

桌面環境為使用者提供了一個整體的用戶體驗,因此它整合了許多軟體元件與應用程式以提供一致的圖形使用者介面,桌面環境通常包含面板,系統功能表,啟動程式,狀態程序,除此之外,桌面環境亦需要一個視窗管理員用以管理視窗位置、行為與外觀,再者,它可能也會提供一個預認的檔案管理員和檢視器,而為了簡便緣故,甚至還會包含一個預設的編輯器,終端程式以及郵件軟體等等應用,而所有程式外觀大多設計雷同以方便熟悉使用,Gnome,Xfce和KDE是目前最有名的桌面環境。

對一般使用而言,體驗不同X視窗系統的使用者介面的外觀及操作上的差異主要大多在於系統所選用的桌面環境不同所致,因此底下介紹幾個目前較具代表性的Linux X視窗桌面環境,不過由於Linux的桌面環境每隔一段時間就可能會出現較大的變動或推出新的版本,因此底下的介紹乃是以本文撰寫時的2015年底的資料現況而言。

綜合而言,眾多Linux X視窗的桌面環境中,除了最被廣泛使用的GNOME和KDE二大桌面環境外,其它也存在衍生自這二大桌面環境而接續開發者以及其它專案團隊開發者,若以目前桌面環境的開發撰寫之主要工具套件(toolkit)亦多歸屬於GTK與Qt二大陣營,一些較具知名度的桌面環境簡介如下:

  • GNOME
    GNOME (GNU Network Object Model Environment)桌面環境初次發行於1999年,使用 GTK+開發套件,目標為提供一個完全開源和免費的桌面環境,GNOME設計哲學在於精簡易於使用,知名的RedHat/Centos/Fedora均以GNOME為預設的桌面環境。
    2011年打著簡單易於使用口號的新版 GNOME 3初推出之際,由於導入了一個全新設計的GNOME 3 Shell,捨棄了傳統的使用者介面以及過於簡略的介面風格,所以引起不小的批評、反彈與反對,不過隨著時間演進的更新、延申套件的推出和使用者逐漸的習慣與適應,到了2015年的Gnome 3 批評聲似乎少了,許多Gnome2的使用者業已接受Gnome 3,不過仍有一些不滿者由GNOME2、GNOME3為基礎重新設計出其它的桌面環境,如Cinnamon和Mate。
  • KDE Plasma
    KDE桌面環境始於1996年,乃基於Qt開發套件的框架所開發,其主要設計哲學在於功能性及擴充性,具高度可配置性,許多知名的Linux 發行版本,如 OpenSUSE、Mandriva Linux、Kubuntu均以KDE為其預設的桌面環境。
    KDE Plasma桌面環境被許多人視為功能最豐富且最具客製化能力的桌面環境,Plasma不僅包含了許多好用的軟體,如Calligra Office Suite、Kdenlive、digiKam, Krita、Kwrite,還包含一個相當實用的檔案管理員-Dolphin。
  • Unity
    Unity是 Canonical 公司替 Ubuntu 作業系統所開發,而Ubuntu 也從 11.04 版本改採用 Unity 為其預設的桌面環境,不過從技術觀點來說,其實Unity並非真正的桌面環境,而是執行在GNOME之上的桌面Shell,並且使用大部份的GNOME應用程式和工具,Unity與GNOME、KDE的設計顯著不同,它並沒有自行設計一群可用的應用程式而是設計利用現存的程式,一般使用者常批評Unity缺乏友善的客製化能力。 
  • XFce Desktop Environment
    XFce是一個已歷20年且強調輕量級的桌面環境,以gtk2/3開發套件所設計出來的精簡桌面環境,其設計以快速、低資源耗費為主,因此較適合硬體資源較差的機器使用, 新版已經使用GTK+ 3技術重新改寫,
  • LXDE: Lightweight X11 Desktop Environment
    與上述的XFce相同均強調輕量級的一個桌面環境,它甚至比XFce消耗更少的記憶體, 但操作的友善性和可設定性略遜於XFce,所以若您需要選取一個硬體需求不高,快速的輕量級桌面環境,LXDE與XFce均是不錯的選項。 
  • Cinnamon
    2011年由知名的 Mint Linux從Gnome Shell所衍生發展出來的另一個桌面環境, 其以GTK+ 3 toolkit開發撰寫,Cinnamon採用了GNOME 3的視窗管理員Mutter之衍生版本--Muffin做為其視窗管理員,Cinnamon通常被譽為是一個類似微軟Windows介面的Linux桌面環境,一般而言,其具有簡單、易客制化、操作順暢的優點。
  • Mate
    Mate是Gnome 2的衍生分支,對於喜歡Gnome 2卻不喜歡或不習慣Gnome 3介面的使用者而言,Mate是個不錯的選擇,因為其採用Gnome2的傳統介面,不過為了避免與GNOME 3衝突,Mate重新命名了所有套件,例如Gedit 更名為Pluma、Nautilus 改名為 Caja。
    Mate另一項優點是相當有效率的資源利用,因此即使硬體配備不佳的機器,也可以順暢的執行。
  • LXQt
    LXQt為一相當新的桌面環境,2015年才推出第一個可用的版本0.9,LXQt亦為著名的輕量級桌面環境LXDE的後繼版本,其合併了二個開源專案--LXDE 和 Razor-Qt,目前採用Qt5 和KDE Frameworks 5開發。

Linux 桌面環境有一向有如春秋戰國時期一般混亂,不同的設計者常有迴異的設計哲學,一般使用者亦各有其主觀的偏好性,難以評論其絶對的優劣,不過筆者對於圖形介面的桌面環境要求和選擇條件大多著眼於具有友善易於使用、高穩定性、速度佳,低資源耗費量、畫面與操作易於客制化等條件。

顯示管理員 (Display Manager)

顯示管理員又稱為登入管理員(Login manager),用以啟動本機或遠端電腦X Server的圖形登入管理程式,因此顯示管理員負責提供使用者登入時名稱與密碼輸入的畫面,可視為getty 或 login的圖形介面取代程式,XDM 最早發表於X11R3。

不同的桌面環境會通常會搭配或選用不同的預設顯示管理員,著名的顯示管理員包括了 Gnome的GDM(Gnome Display Manager),KDE的SDDM或KDM,Mint的MDM(Mint Display Manager),其它常見的顯示管理員還包括LightDM、LXDM (Lightweight X-Windows Display Manager)、SLiM (Simple Login Manager),不過您通常可以自行安裝及啟用其它您偏好或可以支援XDMCP的顯示管理員。

◆ X Display Manager Control Protocol (XDMCP)

XDMCP是一種遠端X11桌面存取協定,它會自動啟動本機 X Server並且連結到遠端機器的顯示管理程式登入後以請求完整桌面環境的工作階段,使用XDMCP協定的情境下,X Server就像是圖形介面的telnet用戶端,而顯示管理程式就像是telnet server,而 XDMCP預設上採用UDP通訊埠177建立連線,其建立XDMCP連線過程大抵如下:

  1. 首先,X Server主動向顯示管理員送出一個Query類型的封包來啟始一個X工作階段,如果顯示管理員允許存取就會回應一個 Willing封包
  2. 接下來顯示管理員就需要向伺服器進行驗證工作,因此再由 X Server送給顯示管理員一個 Request封包,顯示管理員將會回應Accept封包,如果Accept封包內容符合 X Serve所預期,就成功的驗證了顯示管理員
  3. 最後,X Server將再傳送一個Manage封包給顯示管理員,然後顯示管理員將以正常X用戶端應用程式的方式連回X Server並顯示登入畫面等待使用者登入。

下圖為Wireshark截取的XDMCP建立連線時的一連串封包,一旦XDMCP連線建立失敗時,可以藉由攔截到的封包以及停頓的位址來診斷問題所在。

xdmcp_packet

XDMCP的問題
XDMCP協定最主要的問題在於傳輸時並未加密,因此易於遭受竊聽攻擊。
XDMCP除了有安全性的問題外,目前有一些新版的顯示管理員亦不再支援,再加上有些桌面環境開始利用到硬體加速來提供顯示能力,因此即使顯示管理員通過驗證亦無法順利顯示接下來的桌面環境,此外,一些Windows上的X Server軟體久未更新、字型路徑問題和預設選項不吻合問題均會導致無法順利使用XDMCP。

所以除非您真的需要遠端圖形介面登入能力以及整個桌面環境操作能力,否則建議採用X11 forwarding的方式以每一應用程式為基礎的方式來支援X視窗的遠端執行和顯示能力。

X 程式庫

另一方面,若從程式員的角度來看,撰寫X視窗程式需要有程式庫,而Xlib正是X協定最底層的程式庫,Xlib是一套以C語言撰寫的X視窗系統協定的用戶端程式庫,提供了X用戶與X Server互動的功能函式,包括了處理顯示的連線運作、向伺服器請求以及事件佇列的運作等,以便讓程式員無需完全了解協定的詳細底層就可以撰寫X程式,不過目前很少程式員會直接使用Xlib來撰寫X程式,而是透過那些使用Xlib功能函式來提供圖形元素工具箱(widget toolkits)的其它高階程式庫來撰寫X程式,這是因為Xlib本身並不支援按鈕、選單或捲軸等圖形元素,這些圖形元素通常是由利用Xlib的較高階程式庫提供,這種高階程式庫大抵上可分為二類:
(1) 直接使用Xlib來提供圖形元素工具箱的程式庫,如 GTK+、Qt (X11 version)
(2)建構於只提供基本圖形元素工具箱Intrinsics程式庫(Xt)上層的程式庫,例如 Xaw 或 Motif程式庫建構於Xt之上以提供特殊工具箱。而較著名的高階X程式庫包括了:

由於目前Linux發行版本中以GNome與KDE這二個桌面環境最受歡迎及最廣泛被採用,因此其所利用撰寫的GTK+和Qt亦最為有名而普及。

下圖顯示了這些程式庫、工具箱與Xlib和X協定的關係。

xlib

Qt

Qt為一跨平台的C++應用程式開發框架,廣泛被用來開發圖形介面程式,最著名的Qt/X11正是應用於KDE環境下。Qt亦為開放原始碼,因此可以被廣泛應用在各種平台上的開源碼程式開發中,此外,使用Qt開發的軟體,相同的程式碼可以在任何支援的平台上進行編譯與執行,而不需要重新修改原始碼,而編譯後的程式會自動依平台的差異,呈現出平台特有的圖形介面風格。
GTK+

GTK+(前身為GIMP Toolkit)亦為一跨平台的圖形元素工具箱(widget toolkits)用以撰寫圖形介面程式,與Qt同為目前最受歡迎與普及的X11圖形元素工具箱,GTK+是自由軟體,亦為GNU計劃的一部分,其授權條款為LGPL。
知名的GNOME、Xfce、LXDE、Unity、Cinnamon均是使用GTK的知名X11桌面環境,GTK+ 3.18為目前最新的穩定版本,不過GTK API最被詬病與批評的地方為缺乏向前相容性。

肆. X視窗系統主從架構連線設定

X視窗系統是以網路為基礎的分散式計算環境,若希望X用戶端與X伺服器分散在不同的機器運行,則有多種不同的做法:

  1. 使用DISPLAY環境變數及選項遠端顯示
  2. X11 forwarding:利用SSH加密通道轉送X協定流量
  3. 以 XDMCP協定登入

一. 利用DISPLAY環境變數或選項遠端顯示

最傳統及簡單的方式建立主從架構的X視窗系統,於X用戶端與X伺服端二方均有一些必要的條件設定,以下分述其不同的設定條件。

X用戶端主從連線設定

首先,X用戶端需要指定X用戶程式顯示的目標,這通常需要藉助一個DISPLAY名稱的變數,DISPLAY變數通常包括三部份,其格式如下:

<主機名稱或IP位址>:<顯示>[.<螢幕>]

因此,在X視窗系統上的DISPLAY通常會包括了一個鍵盤、滑鼠與螢幕,例如DISPLAY=10.0.0.1:0.0代表X用戶端程式執行的結果需請求送至10.0.0.1機器上的第一個顯示與螢幕上。

X伺服端主從架構連線設定

另一方面,X伺服器主要是提供輸出與輸入的服務,而設定X 伺服端的主要設定工作有三:

1. 安裝並啟動 X Server

扮演X伺服角色的機器,需要先安裝並啟動X Server軟體,大部份的Linux系統預設安裝上大多已安裝,Windows 上較著名的免費X Server軟體如 Xming、 Cygwin/X或MobaXterm。

2. 設定允許存取顯示的用戶端機器

X Server的存取控制機制有二種:xhost或xauth

較簡單的xhost是採用主機為基礎的存取控制機制,亦即需要在X Server上設定允許哪些用戶端機器存取顯示,這通常可以透過 xhost命令來設定暫時允許的機器,或是利用Xn.hosts(n為0,1,2,3….)檔案來控制永久可存取顯示的機器,例如:

xhost +             (允許所有的機器存取 X Server)

xhost +<主機名稱或IP>          (只允許特定的機器存取 X Server)

xhost -               (禁止所有的機器存取 X Server)

xhost -<<主機名稱或IP>        (禁止某特定的機器存取 X Server)

不過xhost的方式並不安全,因為主機為基礎的存取控制機制容易被偽裝假造予以突破。

而另一種較為安全的方式為xauth,xauth 存取控制機制主要是靠一串長度為128位元的16進位隨機數字-magic cookie,而其正式名稱為MIT-MAGIC-COOKIE-1來控制X Server的存取,這串數字乃由X Server 產生,而當一個X client 需要存取X server時會根據-display選項或者DISPLAY 變數指定的位址,查詢本地XAUTHORITY 檔案(一般是~/.Xauthority)以獲得與X Server相同的magic cookie,如此才能夠被授權而被允取存取X server。

傳統上,若需要使用xauth驗證,則需要在啟動X Server時的指令檔(例如startx)內附加-auth 參數指定檔案位置,利再用mcookie來產生xauth所需要的magic number,然後再以rsh, rlogin,telnet等方式傳送至X用戶端,不過這種方式不但麻煩又不夠安全,若希望以安全又自動的方式來使用xauth授權,以SSH建立X11 forwarding通道,可自動產生並讓通道端點自動取得cookie,應是目前既自動又安全的方法。

管理員可以利用 xauth工具程式來編輯和顯示xauth的授權資訊。

3. 防火牆規則設定

由於現代的作業系統大多啟用防火牆功能,預設規則會封鎖所有連入的流量,因此為了順利收到X用戶端對X伺服端的顯示請求流量,所以防火牆必需放行TCP 通訊埠 6000, 6001 .....流量,或是放行Xserver處理程序的流量。

傳統以TCP通迅埠6000...來建立X視窗的主從架構連線線請求與回應,其主要的問題有二:

  1. 安全性問題:預設的X協定傳送為明文傳送,因此有私密性資料外洩的可能。
  2. X伺服端需新增放行TCP 6000, 6001…的防火牆規則

上述的問題可利用SSH協定建立加密通道,又稱為X11 Forwarding的方式來加以解決。

xdisplay

二. X11 forwarding

傳統的X 協定雖然可以讓X用戶端連接請求遠端的X伺服端顯示,但其明文傳輸方式,讓按鍵與文字傳遞可以輕易被有心人士竊聽,因此解決方法是讓X協定連線透過SSH連線加密通道,以便可以提供傳輸的私密性和較嚴謹的驗證能力,這項功能就稱為X (或X11) forwarding。
X11 forwarding的運作原理與流程大致如下:

  1. 首先,一部SSH用戶端需先安裝X Server軟體並於SSH軟體啟用X forwarding功能。
  2. SSH用戶端連接至SSH伺服器時請求X11 forwardin0g (例如用戶端已啟用X forwarding或使用 ssh -X指令)
  3. 假如SSH伺服端允許X11 forwarding連線,則您將可以順利正常登入成功。
  4. 支援X11 forwarding的SSH伺服器除了正常處理終端連線外,還會將本身設定為代理遠端的X Server並且自動設定遠端SHELL之DISPLAY環境變數指向本機localhost:6010 (其實這個DISPLAY就是SSH伺服器所建立的代理X Server),以便日後的X Server顯示時均會送至SSH通道。
  5. 一旦使用者在SSH SHELL連線中執行任何X用戶端程式,它將會連接至SSH伺服器所扮演代理XServer,然後利用SSH通道傳送到SSH用戶端,因此不但可確保傳輸私密性與完整性,還解決了防火牆的問題,因為只需確保二端SSH連線成功,無需再新增額外的防火牆規則。
  6. SSH用戶端收到X Srver請求訊息時,亦會扮演代理X用戶端的角色,然後再將X Server的顯示請求傳送至本機的6000通訊埠來由真正的X Server完成顯示和輸入服務的工作。

下圖顯示了X11 Forwarding的連線與傳輸通道以及二端傾聽的連接埠。

x11forwarding

總之,X11 forwarding 的主要好處在於安全性較高以及並無需要額外設定X Server上防火牆的問題,但由於加密通道的關係,多少會影響到顯示的效能表現,其次,X11 forwarding通常是以每一個應用程式為基礎的顯示方式並無法顯示或操控整個X視窗系統的桌面環境。

為了成功的建立經由 SSH的X11通道,您必需同時在SSH用戶端以及SSH伺服端都啟用X11 forwarding功能。

啟用SSH伺服端的X11  forwarding功能

如果SSH伺服端(或X用戶端)是UNIX/Linux作業系統上的Openssh軟體並且機器上也已經安裝X應用程式,則只需要簡單的編輯 /etc/ssh/sshd_config檔案內的 X11Forwarding組態值為yes即可。

X11Forwarding  yes

此外,sshd_config檔案內還可看到一行相關的組態-- X11DisplayOffset 10, 代表預設上OpenSSH的X顯示會轉送到localhost:10,這通常已可避開既有本機X Server所使用的顯示代號,因此通常並無需變更此值。

啟用SSH用戶端的X11  forwarding功能

若是Linux所使用的openssh用戶軟體,您可以編輯/etc/ssh/ssh_config或  ~/.ssh/sshconfig 檔案,並設定ForwardX11 和ForwardX11Trusted 這二個組態值為yes,亦即檔案中存在如下二行:

ForwardX11  yes

ForwardX11Trusted  yes

另一種方式是直接利用ssh用戶軟體連線時搭配 "-X" 與"-Y"選項來啟用SSH的X11 forwarding連線。

若您的SSH用戶端為Windows作業系統,則您需要先安裝一套 X Server軟體,而現在的Windows 上的X Server軟體亦大多支援SSH 的X11 forwarding的功能,因此不僅內建SSH用戶軟體,而且當您啟動X Srver或SSH終端連線時,就已經自動開啟了 X11 forwarding的連線請求功能。

三.  使用XDMCP

若您希望在一個圖形桌面環境操作另一個遠端的X桌面環境(例如在微軟視窗上操控一個遠端的X桌面),而且還能夠擁有完整的圖形桌面控制能力,而非只是單一應用程式的顯示與操作能力,則您需要建立XDMCP連線或採用其它遠端遙控方式(如VPN)。

不過建立XDMCP連線工作階段,需要選擇支援XDMCP協定的顯示管理員以及相關的桌面環境,目前許多新版顯示管理員並不支援XDMCP,有些桌面環境(如Gnome3或Unity或KDE Plasma)則無法順暢的顯示桌面,其主要原因可能是顯示管理程式本身不支援XDMCP協定,或無法使用遠端 X Server的顯示加速功能,或X Server無法完整支援openGL 2等多種問題所導致,經筆者測試,以lightdm顯示管理員加上Xfce或LXDE這二個較精簡的桌面環境於大部份的主流Linux發行版本中均可成功支援XDMCP登入連線並順利的顯示桌面,因此以筆者撰寫本文的時間(2015年底)來看,通常會建議以lightdm搭配Xfc或LXDE方式來支援XDMCP,底下就以lightDM與其它桌面環境來設定如何使用XDMCP遠端登入X視窗系統。

設定XDMCP伺服器 (扮演X用戶端)

要將一部Linux電腦設定為XDMCP伺服器,首先您需要選擇可支援的顯示管理員和桌面環境,因此在此將建議變更啟動的顯示管理員為lightDM,變更桌面環境為XFce或KDE或LXDE,然後在顯示管理員的組態檔編輯啟用XDMCP功能,如果Linux系統上有啟動防火牆(如 iptables、firewalld)功能,則還需要記得放行UDP 177 流量。

底下略述在CentOS 7、Ubuntu 15和OpenSuse三種不同的Linux發行版本下,如何設定使用XDMCP協定的基本步驟與指令。

1. CentOS 7:

(CentOS 7預設使用GDM與Gnome 3均無法支援XDMCP,因此換成lightdm和XFce)

# yum -y install epel-release  (安裝 epel 儲存庫)

# yum  -y install lightdm  (安裝 lightdm套件)

# vi /etc/lightdm/lightdm.conf    (編輯lightdm組態檔;如果檔案不存在請自行新增)

   在 lightdm.conf檔案中新增或啟用底下二行:

   [XDMCPServer]
   enabled=true

# systemctl disable gdm ; systemctl enable lightdm (變更顯示管理員為lightdm)

# yum -y  groupinstall xfce  (安裝 XFce )

# reboot (重新開機)

2. Ubuntu 15:

(Ubuntu預設的Unity無法支援XDMCP,需新增安裝其它如xfce/kde/xfce4/lxde桌面才行)

$ sudo apt-get install xfce4 (安裝 Xfce4) 或

$ sudo apt-get install lxde (安裝 lxde)

$ sudo vi /etc/lightdm/lightdm.conf (編輯lightdm組態檔;如果檔案不存在請自行新增)

    在 lightdm.conf檔案中新增或編輯底下二行:

   [XDMCPServer]
   enabled=true

$ sudo reboot (重新開機)

3. opensuse Leap-42.1

(opensuse預設的ssdm並不支援XDMCP,需新增安裝其它如lightdm顯示管理員,而預設的KDE 桌面雖可支援但如基於更佳效能上的考量可變更為XFce或LXDE)

最友善而簡單的設定opensuse的圖形介面組態工具無非是採用 yast控制中心 (yast2),因此您可直接利用yast控制中心(yast2)安裝想要的顯示管理員和桌面環境,並且啟用XDMCP協定來接受連線。

下圖為yast2安裝必要的顯示管理員或桌面環境的畫面(yast控制中心-->軟體-->軟體管理)。

yast_install

接下來,設定預設的顯示管理員並啟用XDMCP功能,請利用yast控制中心(yast2)的依循『系統-->/etc/sysconfig/編輯器-->Desktop-->Display manager』途徑設定底下二項:

  • DISPLAYMANAGER:此項為預設的顯示管理程式,預設為sddm,請改為其它已經安裝且可支援XDMCP的顯示管理程式。
  • DISPLAYMANAGER_REMOTE_ACCESS:預設為 no,請變更為 yes,以便您使用的顯示管理程式啟動時可接受XDMCP的遠端登入連線請求 (UDP 177)。
    suseu_enablesdmcp

另一方面,若您希望直接於Opensuse下利用命令完成安裝和設定,其相關步驟和命令說明如下:

# zypper install lightdm  (安裝 lightdm或其它顯示管理員)

# zypper install patterns-openSUSE-xfce  (安裝 xfce或lxde桌面環境)

# zypper install patterns-openSUSE-lxde

# 編輯 /etc/sysconfig/displaymanager檔案 (設定預設的顯示管理程式並啟用XDMCP遠端存取功能),編輯以下二行:

DISPLAYMANAGER="lightdm"

DISPLAYMANAGER_REMOTE_ACCESS="yes"

設定XDMCP用戶端 (扮演X伺服端)

上述說明了如何設定三大Linux發行版本的XDMCP伺服端組態,接下來則分別說明如何在Linux系統和Windows系統下啟用XDMCP的用戶端以建立XDMCP連線。

1. Linux系統

設定使用者的Linux系統為XDMCP用戶端,可以在您的Linux桌面連接到另一部Linux/UNIX的桌面登入並使用這個遠端的桌面環境作業並不困難,因為大部份的Linux預設安裝時均已安裝了X視窗系統,不論其使用何種桌面環境均可做為XDMCP用戶端,提供 X Server的輸入/輸出服務。

在任何一部已安裝X視窗系統的Linux電腦上,您只需要在文字模式上利用 X程式,亦或是在圖形介面下執行 Xnest程式(通常需要額外安裝)即可向XDMCP伺服器建立XDMCP連線登入。

如果您希望利用整個螢幕來建立一個遠端的X工作階段,則您需要在文字模式下達如下指令:

X :1 -query <XDMCP伺服主機名稱或IP>

:1 為工作階段數 (session number),如要建立多個工作階段,則每個工作階段數必需唯一,然後再利用 ALT+CTL+Fn 鍵來切換本機或其它遠端的X工作階段的顯示螢幕。

若您希望在既有的X視窗系統螢幕內建立X工作階段視窗,則您需要輸入如下的Xnest命令。

Xnest :1 –query <XDMCP伺服主機名稱或IP>

例如下圖為作者在一部Ububtu 15的電腦安裝xnest套件後,再以 Xnest指令啟動其它三部Linux的XDMCP登入連線的桌面,因此在此 Ubuntu扮演的是 XDMCP用戶、X Server以及終端使用者操作的機器,而其它三部linux分別是不同的發行版本--Centos 7、opensuse  Leap 42.1 和kubuntu 15 則均是扮演相對的XDMCP伺服器及X用戶端的角色。

 

linux-xdmcp

2. Windows系統

Windows 系統使用者若要使用XDMCP協定來登入X視窗以建立X工作階段,最重要的是要選擇一個支援XDMCP協定的新版X Server軟體,免費的X Server中,xming最新的版本需要捐贈才能夠下載,而其可免費下載的舊版則與一些新版顯示管理程和桌面環境有相容性問題,因此個人偏好使用VcXsrv這套軟體,其設定方式與xming幾乎一樣,卻完全免費且較常更新。

下圖為使用VcXsrv的xlaunch精靈程式建立XDMCP工作階段的設定方式:

vcxsrv1

下圖則是筆者在Windows平台上以VcXsrv建立XDMCP工作階段並登入後的畫面。

windows-xdmcp

伍. 結語

X視窗的發展及使用歷史已超過了30年之久,甚至比Linux系統來得更早,其彈性的部署及使用上的優點大多來自於主從架構、獨立於作業系統的設計以及只提供機制而非方針的原則,但X11協定十分巨大、龐雜,並且包括了許多已過時的模組,因而無可避免的導致運作延遲,影響圖形桌面之效率,所以近年來已經開始有人提出了新的顯示伺服協定希望用以取代已顯老態的X11,二個目前值得留意其後續發展的的顯示協定分別為:

  • Wayland: Wayland為2008年由Intel開放源代碼技術中心的成員Kristian Høgsberg所發起的一個桌面的顯示服務協議,Wayland是一個充分利用現代Linux核心圖形技術的簡易顯示伺服器(Display Server),其支持3D加速,透過OpenGL ES進行圖形的合成。Wayland沒有傳統的X Server/Client的模式,取而代之的是另一種Compositor/Client架構,而其最終目的在於取代X11協議。
  • Mir:Mir是由Canonical公司開發的Linux作業系統下的顯示伺服器,並以 GPLv3方式授權,它將在未來取代Ubuntu中的X視窗系統。

總之,為了降低複雜度並提升效能,解決X Server無效率的繪圖問題,所以Wayland和Mir的出現目的在於重新設計一個可取代X視窗的新圖形顯示系統,因此,如果使用者希望具有較佳的應用程式相容性(特別是使用老舊軟體),仍需繼續使用傳統的X視窗,反之,若您並不滿意目前X視窗框架下的效能表現,而希望能有較快效能效率與的圖形介面,或許可留意Wayland與Mir的發展成熟度以及目前已開始支援的系統平台與發行版本來決定是否使用Wayland或Mir來取代傳統的X視窗。