Linux使用遠程X Server顯示圖形


背景

通常我們不希望在服務器上安裝圖形界面,但有時候有些程序需要圖形界面,比如安裝oracle的時候。此時,可以配置讓Linux使用遠程的X Server進行圖形界面顯示。

首先要明確的是Linux X Window System的基本原理,X是一個開放的協議規范,當前版本為11,俗稱X11。X Window System由客戶端和服務端組成,服務端X Server負責圖形顯示,而客戶端庫X Client根據系統設置的DISPLAY環境變量,將圖形顯示請求發送給相應的X Server。
 
因此,我們只需要在遠端開啟一個X Server,並在目標機器上相應的設置DISPLAY變量,即可完成圖形的遠程顯示。
 
“真理體驗”版

環境:遠程無圖形機器A(IP 192.168.9.135,OS CentOS 6.2),本地有圖形機器B(IP 192.168.1.135,OS CentOS 6.2),子網192.168.0.0

X Server是Gnome等桌面環境的基礎,一個桌面環境通常包含了XDM(X Display Manager,通常的圖形化用戶登錄界面就屬於XDM)、窗口管理器(X Server顯示的圖形是沒有“窗口”邊框的,通過替換窗口管理器可以實現不同的視覺效果,比如實現3D效果的Compiz)等組件。
 
進行圖形顯示並不需要桌面環境,只要有X Server即可。
 
現在要在B機器上開啟一個X Server,然后配置A機器的DISPLAY環境變量指向B上面的X Server,在A上啟動一個圖形程序,圖形應該在B上面進行顯示。
 
Linux提供了一個startx腳本來啟動X Server,startx腳本通過調用xinit來完成此工作。xinit完成兩個工作,首先在后台啟動一個X Server,然后根據配置啟動一系列客戶端程序連接到X Server,這些客戶端程序只有最后一個可以並且必須在前台運行,當這個前台的客戶端程序退出時X Server將被關閉。
 
B機器上有桌面環境,查看進程可以看到如下進程在運行:
/usr/bin/Xorg :0 -nr -verbose -audit 4 -auth /var/run/gdm/auth-for-gdm-Ikd3i7/database -nolisten tcp vt1
這表示在display 0上運行着一個X Server,這里的X Server是Xorg。出於安全考慮,這個X Server不監聽TCP連接(-nolisten tcp),所以無法通過網絡連接上這個X Server。X Server可以通過TCP和域套接字進行連接,后面講述DISPLAY變量時會詳細描述。
 
我們可以通過startx或直接使用xinit來手動啟動一個X Server,startx的選項與xinit相同,選項直接傳遞給xinit。xinit選項分為兩個部分,以符號 “--”為界,前面是客戶端選項,后面是X Server選項。
startx [ [ client ] options ... ] [ -- [ server ] [ display ] options ... ]
要注意的是“client”(即要運行的客戶端程序)必須以絕對路徑的形式出現。如果不指定“client”,startx或xinit會根據用戶和系統全局的配置文件啟動一個客戶端程序(一般xinit默認啟動xterm程序)。
 
現在我們啟動一個X Server:
xinit /usr/bin/xterm -- :1 &
這個命令可以在桌面環境下的終端里面運行,也可以在字符終端下運行。機器B上的桌面環境顯示在終端Ctrl-Alt-F1上,F2-F6都是字符終端,F7-F12留給圖形終端。在B機器的F2字符終端上執行以上命令,將在F7終端出現xterm。
 
接下來要配置A機器的DISPLAY變量,以便將圖形顯示到B機器上。以另一終端登錄A機器,設置DISPLAY變量:
export DISPLAY=192.168.1.135:1.0
DISPLAY變量的格式為[Address]:{NumA}.{NumB}。其中Address為X Server地址,如果Address為空,則通過域套接字連接到本地的X Server。NumA為display number,這與傳遞給xinit的display選項對應,這個display number為X Server的監聽端口號送去6000。因此,實際上此時B機器上的X Server在監聽6001端口,可以使用netstat命令驗證。NumB為screen number(可能是多顯示器的情況下指定顯示在哪個顯示器,未驗證),通常情況下都為0.
 
現在關閉B機器的防火牆(或者打開相應端口),以便A機器的X客戶端程序可以連接上B機器上的X Server。然后在A機器上剛才設置DISPLAY變量的那個會話中,啟動一個帶有圖形界面的程序,圖形將會顯示在B機器的F7終端上。
 
如果提示無法連接到DISPLAY指定的X Server,可能是由於X Server打開了訪問控制。在A機器上已設置DISPLAY變量的會話中使用xhost命令查看授權信息:
xhost
如果顯示無法打開display,則可以確定是因為X Server開啟了訪問控制。
 
在B機器F7終端由xinit打開的xterm中使用xhost授權A機器訪問:
xhost + 192.168.9.135
 
然后在B機器F7終端xterm上使用xhost命令查看ACL,可以看到192.168.9.135已獲得授權。此時,在A機器已設置DISPLAY的會話中運行xhost,同樣可以看到ACL,再運行圖形程序,圖形應顯示在B機器F7終端上。
 
SSH隧道轉發版

SSH提供了X11轉發的功能,可以使用SSH簡單地實現上一節描述的功能。

首先確認A機器上的SSH Server打開的X11轉發功能。檢查SSH Server配置文件/etc/ssh/sshd_config,確認有如下配置:
X11Forwarding yes
然后在從B機器上SSH到A機器:
ssh -X 192.168.9.135
-X選項打開SSH的X11轉發功能。
 
在此會話中查看A機器上的DISPLAY變量,應與下面類似:
localhost:10.0
在此會話中查看A機器上的TCP監聽端口,應有6010端口。
 
在此會話中啟動A機器上的圖形程序,圖形應顯示在B機器上。
 
實際上,SSH在A機器上打開了一個監聽端口6010,並且在登錄會話開始時為會話設置了DISPLAY變量為localhost:10.0。隨后此會話中的圖形程序運行時,X11 client庫會將X請求發送到SSH監聽6010端口中,然后A機器上的SSH將X請求轉發到B機器,B機器的SSH客戶端收到X請求后交給B機器上的X Server顯示。
 
SSH隧道轉發Windows版
 
原理與上一節類似,X請求由SSH轉發,只不過圖形在Windows上顯示。
 
首先在Windows上安裝並運行一個X Server,這里選用Xming。然后使用ssh客戶端連接上機器A,這里選用SecureCRT作為ssh客戶端(使用putty同樣可以)。
 
SecureCRT的會話選項作如下 設置:
 實際上這里對SecureCRT的設置與上一節中ssh -X選項相同。
 
如果已經登錄機器A,注銷再重新登錄。查看DISPLAY變量:
 
啟動一個圖形程序,界面將在Windows上顯示:
 
 
小結
通過上述的幾個小實驗,應該對X11的基本原理有了比較清晰的理解,以后遇到某些軟件必須使用圖形界面的時候,可以在Windows上使用Xming來進行遠程圖形顯示,不必為此在服務器上安裝臃腫的圖形環境了。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM