翻譯: Feng Dahui xdm 提供了一個管理X任務的有用的途徑,方便而且靈活。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 你曾經想遠程訪問你的工作站的桌面環境吧?如何在一台服務器上面訪問你的台式機?這正是我最近需要解決的問題。我負責安裝並且管理一組Linux服務器。在經過好幾次為了不同的原因(綁定服務,鍵盤代碼,等等)我要到實驗室訪問圖形終端之後,我發現真的需要尋找一個解決方案允許我通過我的工作站訪問不同服務器上面的X桌面環境。 有的人可能認為用來處理遠程任務的標准X工具足以解決我的問題--就像這樣: ---------------------------------- telnet host1 eXPort DISPLAY=mywkstn:0 gnome-session (或者是其他的任務管理器) ---------------------------------- 可是,我要找的解決方案是要提供比這些基本功能更多的東西。關於認證,會話管理等等有一些相應的缺陷,需要一些X工作機制的知識。例如,當使用遠程客戶端的時候我常常會忘記輸入 xhost +host1 。當我對一個linux新手解釋xhost的認證方案的時候,我常看到他一臉迷惑。既然在一個開發項目中沒必要教開發者有關X的基礎知識,我要尋找一個解決方案滿足所有這些要求。需要更容易管理,更加自動化,更容易為Linux的開發新手所使用。 有兩個解決方案可以使我管理X會話更加容易。第一個是我所選擇的X顯示管理器(X display manager)或者說xdm,另一個流行的解決方案是vnc。我選擇xdm而不是vnc出於兩點原因。第一,vnc要有個服務端的守護進程,為每個共享的桌面運行。第二,我已經有X服務器的軟件安裝在所有的工作站上,不想再添加額外的客戶端軟件了。其他的選擇是kdm和gdm ,分別是 KDE 和 GNOME軟件包的一部分。 ************* X 基礎 ************* X是用在大多數UNIX系統中的圖形支持系統。如果你在你的Linux機器上使用GNOME或者KDE的話,你就正在使用X系統。它由X聯盟(www.X.org)定義並維護。大多數的Linux用戶使用的都是由XFree86 項目 (www.xfree86.org)提供的X Window系統的實現。xdm 是一個顯示管理器,提供了靈活的任務管理功能。然而xdm通常被認為是“GUI的登陸屏幕,可以自動啟動我的X任務”,我們會看到實際上它要更為強大。 在X的世界中,術語“客戶“和“服務器“可能會有些迷惑人。明確地說,X服務器控制鍵盤,鼠標和顯示資源的應用,客戶端也是個應用,是制造請求,從服務器來運行它自己的行為(如:顯示一個帶有特定字符的窗口)。這和我們認為的工作站作為客戶端運行的應用有些許的差異。 xdm 使用X聯盟的X顯示管理控制協議,XDMCP,來和X服務器通信。它允許X服務器從運行xdm服務的服務器上獲得會話服務。有3類的請求可以被X服務器發送: Direct(直接的) --請求指定的主機直接顯示一個登陸屏。 Broadcast(廣播的)--給網絡上的所有主機廣播一條消息, 第一個應答的提供這個登錄服務。 Indirect(間接的) --聯系一個指定的運行xdm的主機並詢問是否知道哪個主機可以通信 。 xdm 服務器可以實現一個可用的可以管理X會話的服務器列表。 X server 偶爾會結束與所選的用來得到登陸進程服務的主機的 直接通信。 發明xdm 的一個最初的原因是要允許管理X終端。這些設備基本上就是顯示器,鍵盤,和鼠標並帶有嵌入的X服務器軟件 ;所有的智能都在網絡上的服務器上。xdm 被用來“推“登錄屏幕並管理這些設備的會話。若干年前,這些東西很流行,因為訪問 UNIX 工作站受到限制。一個用戶如果想訪問圖形工作站的話,要不是足夠幸運的擁有一台UNIX工作站就需要一套這樣的設備。後來這些設備變得有些過時,並逐漸被運行X服務器軟件的個人電腦Linux 和其他的 Unices (Solaris x86, xBSD, etc.)或者是Windows(運行Hummingbird Exceed或類似的軟件)代替 。 當使用xdm管理這些X任務的時候在設置上有些費勁兒。乍一看,可能會出現這樣的情況:如果你設置xdm (為了使用 XDMCP 的優點), 沒看到本地的 X 服務器啟動 (i.e.,當xdm啟動的時候控制台進入圖形模式 ),或者,如果你在xdm種禁止了本地的顯示並使用startx,它不會讓你訪問選擇器。這裡描述的設置允許任何的 XDMCP 客戶訪問 Linux 服務器桌面環境(當然了,影響了X的安全)。它也描述了一種方法,設置xdm 可以得到本地的和其他服務器上的桌面。 xdm 也帶來管理安全和訪問控制的問題,不過這超出了這篇文章的范圍。xdm 應該只用在可控制的環境中。另外,接入端口 177 應該在所有的防火牆上鎖定。如果你對X的安全問題感興趣。下面的手冊頁是個不錯的起點:xdm(1), xauth(1), Xsecurity(7), lbxproxy(1)--Low Bandwidth X proxy, xfwp(1)--X Firewall Proxy, 和(1) sshd(8) ,尤其是關於X11 端口轉發的部分。 **************** 設置 xdm **************** xdm 的設置有些難度; 下面是為了達到特定目的唯一的一種方式。 在我的 Red Hat 7 系統上, xdm 在 /etc/X11/xdm。它的主要設置文件是xdm-config (見列表1): -------------------------------------------------- 列表1: xdm-config -------------------------------------------------- ----------------------------------------------------------------- DisplayManager.errorLogFile:/var/log/xdm-errors DisplayManager.pidFile: /var/run/xdm-pid DisplayManager.keyFile: /etc/X11/xdm/xdm-keys DisplayManager.servers: /etc/X11/xdm/Xservers DisplayManager.AccessFile: /etc/X11/xdm/Xaccess DisplayManager.willing: su nobody -c /etc/X11/xdm/Xwilling DisplayManager*resources: /etc/X11/xdm/Xresources DisplayManager*session: /etc/X11/xdm/Xsession DisplayManager*authComplain: false ! Comment out this line if you want to manage ! X terminals with xdm ! SECURITY: This means we will be listening on ! port 177 for XDMCP CHOOSER requests. #DisplayManager.requestPort: 0 ------------------------------------------------------------------ xdm的配置文件是 X resources 的格式。 這些 resources 用於設定不同文件的的位置。我們對 servers 指定的文件感興趣,還有accessFile和 resources。 愛冒險的人會對 session 和DisplayManager._X.setup感興趣,那裡的X 是顯示號。 注意 DisplayManager.requestPort:0 被注釋掉了。 它指定哪個 UDP 端口用來監聽XDMCP請求。 如果設置為0(它的默認值), XDMCP的請求被忽略,並且xdm 只管理本地的顯示(看Xservers 文件)。我們把它注釋掉,這樣 xdm 就會監聽默認端口(USP 端口177 )。 我的 Xservers 文件大致如下: ------------------------------ #:0 local /usr/X11R6/bin/X ------------------------------ 如果這一行沒被注釋掉的話,我就會每次在啟動 xdm 的時候得到一個圖形化的登錄屏幕。也即它通過運行命令 /usr/X11R6/bin/X會在顯示器(diaplay)0上面啟動並管理一個本地的 X 服務器。我們要做的是選擇我們要連接的主機。我們使用Xaccess文件實現了這個: -------------------------------------------- # 任何的間接主機都可以得到一個選項 * CHOOSER BROADCAST # # 如果你想設定每個終端可見的主機的集合 # 注釋掉這些行 #(並注釋掉上面的 CHOOSER行) # 還要編輯 %hostlist 行 # #%hostlist host-a host-b #* CHOOSER %hostlist # ------------------------------------------- 雖然Xaccess是個非常靈活的工具,但是我們將只用它來啟動選擇器(間接的模式)。選擇器是個小的X應用,顯示網絡上可用主機的列表,允許我們選擇所要連接的一個。我喜歡使用BROADCAST選項因為新的主機可以在列表中自動顯示。有的人可能喜歡特定命名某主機,如上面顯示的使用%hostlist宏。這個方法有的時候,尤其是在一個大一些的網絡上,在那裡廣播沒有到達所有的想要的主機時很有必要。如果你對更好的控制層次感興趣的話,你可以使用服務器的列表代替BROADCAST,這將允許你直接指定可用的主機列表。 如果你想用不同的方式設置 xdm 處理來自不同 X servers 的請求 。你可以指定主機名或者是主機列表來代替 * 。 如下面的例子。 下面的行告訴 xdm 自己處理所有來自host-a,host-b或者host-c的請求(直接模式): ----------------------------------------- host-a host-b host-c ----------------------------------------- 要讓 xdm 從host-a發送間接請求給 server-a 或者 server-b,輸入: ----------------------------------------- host-a server-a server-b ----------------------------------------- 也可以寫成這樣 ----------------------------------------- %hostlist server-a server-b host-a %hostlist ----------------------------------------- 你可以設定xdm使用選擇器(chooser)處理間接請求(我們首選的方法)。在我們的下個例子中,host-a 得到一個包括所有應答廣播的主機的列表的選擇窗口,然而其他人只能得到被hostlist指定的列表: ----------------------------------------- %hostlist server-a server-b host-a CHOOSER BROADCAST * CHOOSER %hostlist. ----------------------------------------- 最後,要完成基本的功能,我們可以看看 Xresources 文件。 我的設置取默認值了,不過有的人可能想定制它的外觀。在這個文件中你可以改變顏色,字體和其他的類型選項。我發現chooser*geometry 資源是最有用的,因為它允許你設定選擇窗口的大小。你還可以在xdm-config 中設置些交互管理功能,像 DisplayManager.errorLogFilelogfile 會設定 log 文件的位置。這個log 文件包含 xdm , Xsetup , Xstartup , Xsession 和Xreset腳本的標准錯誤輸出。 以上的登錄進程完成後, xdm 啟動在session resource中指定的腳本文件。它允許定制X會話的行為。管理員可能最想檢驗Xsession 腳本了。用戶會想生成一個 $HOME/.xsession 或者是$HOME/.Xclients 文件 來定制會話管理器的行為(i.e.,啟動一個窗口管理器,一個時鐘等等) ******************** 測試我們的設置 ******************** 為了測試我們的設置,我們要找到 X (可以用which X命令)。在我的系統上,位置是/usr/X11R6/bin/X。 測試直接模式: ----------------------------------------- /usr/X11R6/bin/X -query 遠程的xdm主機 ----------------------------------------- 間接的模式輸入: ----------------------------------------- /usr/X11R6/bin/X -broadcast ----------------------------------------- 如果使用的是帶有選擇器的間接模式,輸入: ----------------------------------------- /usr/X11R6/bin/X -indirect 遠程的xdm主機 ----------------------------------------- 一旦這些正常,我可以生成 /etc/rc.d/init.d 腳本自動啟動和停止 xdm 服務。看一下《用chkconfig 管理init 腳本》的文章(發表在linux雜志2001年四月),可以得到更多信息。 然後,我生成了如下的腳本以方便我的用戶。在他們的工作站上,我生成了一個叫 /usr/bin/X11/startx.xdmcp的腳本。 如果主機叫 ``wkstn1'',那麼這個文件就是這樣: ----------------------------------------- #!/bin/sh /usr/X11R6/bin/X -indirect wkstn1 ----------------------------------------- 主機名就是xdm 服務器的名字(在我這裡工作站既是xdm server又是X server) 接下來,我輸入: --------------------------------------------------- mv /usr/bin/X11/startx /usr/bin/X11/startx.original chmod 755 /usr/bin/X11/startx.xdmcp ln -s /usr/bin/X11/startx.xdmcp /usr/bin/X11/startx --------------------------------------------------- 這允許那些想登錄進他們的工作站輸入startx就得到一個圖形控制台的用戶,得到一個可用主機的列表來登錄(包括他們自己的工作站) ************* 結論 ************* 回顧一下,我們設置了網絡上的服務器和工作站使用 xdm ,間接模式的XDMCP和選擇器以便允許用戶選擇他們想用來管理的X會話。這是個便於管理的解決方案 ,允許對X會話的完美控制(譯者:有些誇張了),它也容易使用。提供給用戶一個可用主機的菜單,管理他們的X會話。 如果需要從windows這樣的平台進行這樣的訪問,並且你不想購買或是在你的工作站上安裝一個X服務器的話, 對你來說,vnc 是個不錯的選擇。