虛擬網絡計算工具(VNC,Virtual Network Computing)本質上來說是一個遠程顯示系統,管理員通過它不僅僅可以在運行程序的本地機上察看桌面環境,而且可以從Internet上的任何地方察看遠程機器的運行情況,而且它具有跨平台的特性。
本文將討論為Linux系統設置基於VNC的X Windows系統桌面的一個全新的方法,通過閱讀本文,你將能夠配置實現通過一個顯示管理器登錄進入X-Window桌面。更重要的是,用戶能在網絡任何位置通過工作站控制台安全地訪問同一個桌面。
典型情況下,一個圖形工作站系統運行有一個顯示管理器。在本文中我們討論的顯示管理器指XDM, GDM (GNOME顯示管理器)或KDM (KDE顯示管理器)等應用。一個顯示管理器為用戶提供圖形化的登錄界面。當一個用戶登錄進入系統,顯示管理器啟動合適的窗口管理器(例如fvwm2, GNOME或KDE)。從窗口管理器中用戶可以運行任何應用程序。當用戶退出登錄,應用程序被關閉,窗口管理器同樣退出,顯示管理器再次出現,等待再次登錄。如果同一個用戶重新登錄,那麼顯示管理器啟動一個新的窗口管理器,並且所有的應用必須重新啟動。這就是傳統的X-Window系統桌面的工作過程。我們將這樣一個桌面會話稱為一個X桌面。當一個用戶使用工作站的鍵盤和監視器來使用工作站時,我們就稱之為用戶通過控制台登錄,這是為了和通過網絡登錄區分。
圖 1.一個顯示管理器
在虛擬網絡計算一文中我們學習了如何配置VNC以實現通過網絡上的任何機器保持狀態地訪問一個桌面。這裡“保持狀態”我的意思是當一個用戶沒有連接到桌面時,桌面並沒有終止,而是保持等待連接請求的狀態。當一個用戶使用VNC客戶端連接到VNC服務器時,每個窗口仍然保持在上次離開時的狀態,每個被打開的文件仍然保持狀態。控制窗口管理器和應用程序的VNC服務器的特性保證了桌面狀態的連續性。
因此,網絡上的任何計算機可以運行VNC客戶端(例如vncviewer)來連接到工作站來顯示桌面。我們甚至可以在運行VNC服務器的工作站上運行VNC客戶端。我們將這種桌面會話稱為VNC桌面,我們把運行VNC服務器(和其窗口管理器)的工作站稱為VNC工作站。
對於VNC桌面,有一個問題。假設你希望通過控制台登錄到VNC工作站,那麼這個工作站同樣在運行在VNC桌面。你可能通過網絡上其他機器連接登錄該工作站,這時候你往往希望能繼續通過網絡連覸NC桌面。同時當你通過一個顯示管理器登錄到控制台時,你希望看到和通過VNC連接登錄時看到的同樣的桌面。但是如果如果你通過顯示管理器登錄到工作站,那麼它將會啟動一個新的窗口管理器。基本上來說你啟動的是一個新的X桌面,它和已經運行在該工作站的VNC桌面是沒有關系的。
如果你希望在一個Unix系統上連接到VNC桌面,你必須運行一個VNC客戶端,例如vncviewer。這樣很愚蠢,因為基於X的桌面的一個應用程序窗口(vncviewer)本身是另外一個機器上的桌面(VNC桌面)。象這樣保持多級別的重定向是非常麻煩的,除了容易引起混淆,而且效率也很低下因為需要系統運行兩個窗口管理器,雖然實際上應該只需要一個。
本文將討論如何配置一個X服務器,顯示管理器和一個VNC服務器,使得可以直接登錄到VNC桌面,而不需要再啟動一個窗口管理器,並且在離開時保持所有的文件和應用程序狀態直到下次登錄。
前提
我們這裡討論的情況可以應用於在任何Linux發行版中。但是需要一個可以運行的X服務器,一個顯示管理器和VNC。我們可以使用下面的命令來測試前提條件:
rpm -q XFree86 vnc XFree86-xdm kdebase gdm
只要保證安裝有XFree86-xdm kdebase或gdm就可以了。我們這裡討論的所有配置文件存放位置都是以redhat7.1為標准。當然可以配置任何Linux系統來使用通明VNC桌面,但是文章中討論的配置文件可能會在不同的位置。
無論你喜歡采用任何顯示管理器,它都應該在系統啟動時啟動。一般都是在/etc/inittab文件中配置如下內容:
x:5:respawn:/etc/X11/prefdm -nodaemon
prefdm一般都是一個指向你希望采用的顯示管理器的一個符號連接。X和你喜歡的顯示管理器必須保證啟動和運行。
配置VNC服務器
VNC服務器同樣也必須在運行,同時也要配置VNC服務器運行你喜歡的窗口管理器。這通過編輯文件$HOME/.vnc/xstartup來啟動你喜歡的窗口管理器。使用startkde &來啟動KDE,使用gnome-session &來啟動GNOME,fvwm2 &來啟動FVWM2。同時要,確保在$HOME/.vnc/passwd中啟動vncpasswd 來創建密碼文件。
RedHat7.1提供了一些簡單的方法在系統啟動時來啟動VNC。使用linuxconf來設置vncserver啟動腳本(/etc/init.d/vncserver)實現系統自啟動時啟動vncserver。但是默認的啟動腳本靈活性不夠,因此編輯/etc/init.d/vncserver,修改:
"su - ${display##*:} -c "cd && [ -f .vnc/passwd ]
&& vncserver :${display%%:*}""
為:
"su - ${display##*:} -c "cd && [ -f .vnc/passwd ]
&& vncserver ${ARGS} :${display%%:*}""
然後編輯/etc/sysconfig/vncservers:
# The VNCSERVERS variable is a list of
# display:user pairs.
#
# Uncomment the line below to start a VNC server on
# display :1 as my 'myusername' (adjust this to your
# own). You will also need to set a VNC password;
# run 'man vncpasswd' to see how to do that.
#
# DO NOT RUN THIS SERVICE if your local area network
# is untrusted! For a secure way of using VNC, see
# .
VNCSERVERS="1:jdimpson"
ARGS="-geometry 1024x768 -alwaysshared "
在ARGS中修改"1024x768"來適應自己的X桌面實際參數配置。可以在這裡添加任何其他VNC服務器參數配置。在VNCSERVERS中修改jdimpson為你希望運行VNC桌面的用戶。VNCSERVERS中的1表示VNC以桌面1運行,如果希望添加其他的桌面,可以修改配置如下:
VNCSERVERS="1:jdimpson 2:phred 3:sysadmin"
在RedHat系統上,使用以下命令啟動VNC:
/etc/init.d/vncserver start
現在你就可以使用VNC任何客戶端來使用VNC桌面。
配置顯示管理器
在我的Red Hat 7.1系統中,我創建了名為$HOME/.xsession的文件。這個文件用來設定當通過顯示管理器時應該運行哪個窗口管理器。當登錄進入時,顯示管理器檢測這個配置文件。如果該文件存在,顯示管理器將運行該文件中設定的程序。顯示管理器認為該文件包含有啟動用戶希望的窗口管理器程序的命令。不是運行GNOME或KDE這樣的窗口管理器,然而我們將運行VNC客戶端。編輯$HOME/.xsession為如下:
exec vncviewer -passwd $HOME/.vnc/passwd
-fullscreen localhost:1
如果你使用的是其他的linux發行版,那麼文章的說明可能同樣適合你。一個快速檢測的方法是在該文件中添加如下命令:
exec fvwm2
當登錄到顯示管理器,如果fbwm2成功啟動,那麼表示你成功了。如果沒有成功啟動,那就需要察看系統文檔。
登錄
登錄到顯示管理器的登錄窗口。你將可以看到你喜歡的桌面。
當你通過顯示管理器登錄到服務器,它將被你選擇的運行在VNC服務器的窗口管理器所替代。如果在網絡中有其他的計算機,那麼可以試一試使用客戶端連接服務器。那麼你就可能看到兩個桌面。當使用一個計算機移動一個窗口,你可以看到在另外的計算機上的窗口同樣在移動。
在登錄到顯示服務器以後,如果顯示屏閃爍以後,重新出現登錄界面,那麼說明出現了錯誤。首先確保VNC服務器在運行和.xsession文件配置是正確的。
應該注意的是在設置中你不應該使用任何退出窗口管理器的登錄特性。這樣將終止VNC桌面,這可能不是你希望的結果。這時使用Ctrl-Alt-Backspace來殺除X服務器,顯示管理器返回到屏幕。如果你重新登錄,你將進入到你剛才離開的環境,因此你可以將控制台給別的用戶使用,而不丟失你的桌面狀態。
系統原理
當服務器啟動時,它將為在文件/etc/sysconfig/vncservers中定義的每個用戶運行VNC服務器。當VNC啟動時將讀取用戶主目錄的.vnc/xstartup文件,並使用它運行你希望的窗口管理器。然後VNC服務器就等待連接請求。
圖三:整個流程
顯示管理器同樣會在系統啟動時啟動,並且為用戶提供一個圖形登錄界面。
對於哪些沒有配置VNC服務器和沒有在主目錄下正確設置.xsession文件的用戶來說,他們在登錄進入顯示管理器時將得到常見的X桌面。對於那些具有適當的配置的用戶來說將會得到一個VNC桌面, 而且能夠在網絡上任何位置訪問VNC桌面。
缺點和其他選項
這裡討論的設置具有很多長處,對於我來說主要的優勢是從網絡上的任何計算機訪問我的桌面。而將VNC作為默認桌面的一個最主要的缺點是GUI的圖形性能不夠穩定。例如在VNC桌面上播放電影效果就很差。大多數的圖形變換很快的游戲在VNC上運行也不是很好。同樣當vnc服務器運行時,它是作為你運行的所有應用X服務器,它不可能獲得任何圖形加速特性,即使本機的X服務器試用了圖形加速。(你可以退出登錄,以其他用戶身份登錄到系統,播放電影或打游戲然後再退出登錄;最後再以原始用戶身份進入系統,你可以得到以該身份上次退出時的桌面)
該配置對於多用戶應用環境來說可伸縮性不夠好,你能在/etc/sysconfig/vncservers文件中定義很多VNC會話來實現在系統啟動時啟動。。但是所有的這些VNC桌面都會處於空閒狀態直到它們被使用。對應每個VNC桌面都會有一個VNC服務器,一個窗口管理器在運行。對於GNOME和KDE還會運行有很多輔助應用。所有的這些應用都會占用內存,而且相互之間會競爭資源。對於諸如類似Citrix MetaFrame和Microsoft Terminal Server 的商業解決方案都需要有強大的計算機來支持多用戶應用環境。
另外一個可選的方式是使用XDMCP,它是實現遠程訪問X桌面的傳統方法,但是這種方法可能使你丟掉桌面狀態的連續性,因為在這種方式下每次登錄都是啟動一個新的桌面,這樣你就不能實現本地和遠程共享同一個桌面。可以在www.linuxdoc.org/HOWTO/XDMCP-HOWTO得到更多關於XDMCP的資料。
另外一個解決方法是以inetd/xinetd方式運行VNC,也就是使用-inetd參數。但是這可能導致VNC為每個連接都重新啟動,使得多個連接使用一個桌面,而且初始連接斷開以後對應的VNC進程也隨之結束。所以失去了保持連接狀態和在本地遠程之間共享桌面的特性。察看VNC得到更多的資料。
另外一個選擇是使用x0rfbserver,這個應用以正常的X桌面方式運行,但是其卻依賴於VNC客戶端的顯示內容。它能很好的利用X服務器支持的任何加速顯卡的特性。而且它比X服務器加VNC服務器的方式占用更少的內存(它只需要一個X服務器和本來就很小的x0rfbserver應用程序)。但是它卻要求你總是保持X桌面運行在控制台,因此它不適用於多個用戶公用機器的情況。可以從www.hexonet.de/software.en得到更多的資料。
Jeremy D. Impson 是來自Owego的Lockheed Martin Systems Integration的一名高級副研究員。他是移動通信和移動計算中心的成員,在這裡他使用開放源碼軟件來開發移動計算系統。你可以通過電子郵件地址[email protected]和他聯系。
編者按:除了VNC以外,還有一個更好的協議-tight VNC同樣可以選擇使用,它完全和VNC兼容(同樣的配置文件和同樣的可執行文件名)。