by Guido Socher Display的概念 每個X Window應用程序在啟動的時候都會去讀取DISPLAY這個環境變量來 確定要把圖像送到哪台計算機的顯示器。這個再配合X的網絡性能使遠程運行 圖形化程序成為可能。當你遠程操作一個應用程序的時候,你用的是遠程那台 計算機的CPU資源。完整的圖形化用戶界面(GUI:Graphical User Interface)將顯示在你本地的 計算機上。 在這裡,網絡速度當然也是一個需要考慮的因素,不過普通的10Mbit/s連接的局域網就足夠了。 為什麼你要這麼做? 有很多“network graphics”的應用程序。一些公司使用這類程序來遠程控制設備, 而這些設備可能遠在幾千公裡之外,你可以用同樣的軟件來控制它們,就好像你就在 那裡一樣。 你可能有兩台機器,一台高速的1GHz的電腦,另一台133MHz的老奔騰。 你可以盡情的享受新機器,但是不必坐在它前面。也許你的妹妹正坐在那台新電腦前 並登錄在上面。但這並不影響你使用你的新電腦的功能 怎樣實現? 所有的X Window應用程序,如: gimp,xterm,konquerer,netscape等等都是 一個網絡客戶端,它們都連到一個服務器上,這就是:X-server。 X-server的任務就是告訴圖形硬件,在你的顯示器上繪制圖像,讀取鼠標和 鍵盤的輸入。客戶端(也就是你的應用程序比如:gimp,netscape等等)發送 諸如怎麼樣繪制框架、按鈕等指令給X-server,反過來,客戶端從X-server接收 鼠標和鍵盤的事件。很顯然,你需要某種驗證,否則任何人都可以弄亂別人的屏幕了。 這裡有兩個程序來進行控制: - xhost: 使用這個程序你可以允許給定機器上的任何用戶寫你的屏幕。 比如:你正坐在一台叫philosophus的機器前,為了允許主機movietux上的任何程序 可以寫你的philosophus的屏幕,你可以鍵入如下命令: xhost +movietux 必須在philosophus的shell下鍵入 - xauth: 這是一個基於cookie的可靠的驗證方法。這裡你可以給單獨的人設定權限。 這種方法比xhost安全很多,它使用存儲在用戶主目錄裡的文件.Xauthority裡的cookie, 如果遠程的機器在這個文件裡有一個有效的cookie,則同意訪問。為了拷貝你面前的 機器(philosophus)的cookie到你想要在運行程序的機器(movietux)裡,你可以 使用下列方法中的一種: xauth extract - philosophus:0.0 ssh movietux /usr/X11R6/bin/xauth merge or scp ~/.Xauthority movietux: 在程序開始運行之前經過了如下的過程: 客戶端檢查DISPLAY環境變量來查找另外的服務器,連接到這台主機的X-server上。 服務器端檢查客戶端是否被允許發送給自己,如果客戶端是經過驗證的,則服務端 將開始在屏幕上顯示圖像。 環境變量DISPLAY的語法: bash:eXPort DISPLAY=hostname:displaynumber.screennumber tcsh:setenv DISPLAY hostname:displaynumber.screennumber 在這裡不討論displaynumber和screennumber,它們通常是0:0 這是一個bash下的例子: export DISPLAY=philosophus:0.0 遠程啟動一個應用程序 在理論過後,我們來看一個實際的例子。我們重新回到philosophus這台機器前,並且准備 在movietux機器上遠程運行一些程序。 告訴你的X-server允許movietux上的客戶端再你的屏幕上顯示圖像: xhost +movietux 登錄到遠程主機movietux: slogin -l username movietux 現在你已經登錄到movietux上,並且你執行的每條命令都在movietux上執行 export DISPLAY=philosophus:0.0 運行程序 比如: netscape & 如果movietux是一台比較強勁的機器,你會注意到在netscape裡顯示Html的時候會比 在本地的時候快一點。同時,你不會從使用方面注意到這個netscape不是運行在本地的, 因為你同樣是用鼠標、鍵盤進行著和本地一樣的操作。 很酷,不是嘛? Taking the display with you 雖然遠程運行一個應用程序是比較簡單的,可是這裡還需要為設置DISPLAY再動動手,也可以 自動完成: 如果你使用ssh來登錄到遠程主機的話,那樣DISPLAY會自動的被正確的設置。 這裡最好有其他的遠程登錄程序支持DISPLAY,不過,ssh是非常普及的。 如果你用slogin或者其他的命令,那你可以安裝下面的腳本到遠程主機上。 For tcsh: # take your display with you at remote login: # Put it into your ~/.login file set whoami=`who -ml` set remhost=`expr "$whoami" : '.*((.*))'` if ( "$remhost" != "" ) then setenv DISPLAY "$remhost":0.0 endif 這個腳本通過運行"who -ml"來得到遠程主機的機器名。這個命令將返回類似下面的結果: >who -ml movietux!guido pts/3 Oct 26 21:55 (philosophus.tux.org) If you are using bash then you need to the following script: 如果你使用bash那麼你需要下面的腳本: # take your display with you at remote login: # Put it into your ~/.bash_profile whoami=`who -ml` remhost=`expr "$whoami" : '.*((.*))'` if [ -n "$remhost" ]; then DISPLAY="$remhost":0.0 export DISPLAY fi OpenGL 當X Windows System的網絡性能很好的時候,圖形顯示有一點慢是應為你是通過 網絡協議來傳送你的數據。通常你不會注意到什麼差別。 圖形加速和快輸的應用程序如圖形加速的游戲,通常都是基於OpenGL(Open Graphics Library) 和GLX(OpenGL Extension to the X Window System)的。這些庫提供了一個直接訪問 顯卡上的3D加速器的和硬件無關的程序接口。那就是:也應用程序用點、線、多邊形來描述 一個物體的外形,並把這些傳送給顯卡,所有的渲染工作都是在圖形硬件內部進行的。 這提供了很快的圖形速度。 目前大多數的Linux顯卡驅動(X servers)不支持遠程的GLX/OpenGL硬件加速, 但支持本地的加速。結果就是,遠程的OpenGL程序幾乎根本不動,非常慢。 不過,封閉代碼的NVidia顯卡的驅動是一個例外。它們有一個支持遠程應用程序非直接 渲染的直接渲染接口。 結論 X11可以很方便的發揮你的網絡的力量。你可以像在本地一樣在遠程工作。唯一一點不同的是 你看到的文件和目錄是在遠程主機上的。可是,通過安裝NFS和NIS,你可以把連這點小的不同也 隱藏起來,放心的使用和你同在一個網絡的強勁的計算機上的CPU資源。 鏈接 X11 system, x.org xfree86.org the X11 system used with Linux