X Window其實是一種規(guī)范,它有很多不同的實現(xiàn),在Linux系統(tǒng)下最流行的是實現(xiàn)Xorg和XFree86固耘,微軟Windows系統(tǒng)下也有X Window的實現(xiàn),蘋果的Mac也是X Window的一種词身。要了解自己機器上運行的X Window究竟是哪一個厅目,可以使用查看進程的ps命令
ps –e |grep tty
Ubuntu 14.04使用的X Window是Xorg。如果使用ps -ef命令法严,還可以看到Xorg運行時的命令行參數(shù)损敷。
在桌面系統(tǒng)上,X Server和Client程序往往安裝在同一臺機器上深啤,日常使用基本感覺不到它是分層的拗馒。但是很顯然,X Server和Client也可以分別運行在不同的機器上溯街,在一臺機器上運行程序诱桂,而在另外一臺機器上顯示圖形界面洋丐。
在X Window中,Server偏偏是我面前的這臺Ubuntu挥等,X Server運行在Ubuntu上友绝。我可以在CentOS中運行GVim,但是窗口顯示在Ubuntu中肝劲,這時迁客,GVim是一個Client程序,它在遠程機器上運行涡相,而它的窗口顯示在本地哲泊。
理解display和虛擬控制臺
很多介紹X Window的文章都是先讓系統(tǒng)進入字符界面剩蟀,然后手動啟動一個X Server催蝗。其實這完全沒有必要,因為在同一臺機器上完全可以運行多個X Server育特,只需要讓每個X Server的display不同即可丙号。那么display究竟是什么?
在X Window中缰冤,可以通過hostname:display_number.screen_number來指定一個屏幕犬缨。可以這樣理解:一臺計算機可以有多個display棉浸,一個display可以有多個屏幕怀薛。所以,display相當于是計算機配備的一套輸入輸出設備迷郑,一般情況下枝恋,一臺電腦只配一套鍵盤鼠標和一個顯示器,特殊情況下嗡害,可以配多個顯示器焚碌。
現(xiàn)在問題出來了,我的電腦只有一套鍵盤鼠標和一個顯示器霸妹,也就是只有一個display十电,那又怎么能運行多個X Server呢?那是因為在Linux中叹螟,還有虛擬控制臺這樣的高級特性鹃骂。只需要同時按下Ctrl+Alt+F1、Ctrl+Alt+F2罢绽、…畏线、Ctrl+Alt+F7,就可以在不同的虛擬控制臺中進行切換有缆。在Ubuntu 14.04中象踊,虛擬控制臺1到6運行的getty温亲,也就是字符界面,虛擬控制臺7運行的是Xorg杯矩。(Fedora/centos中不一樣栈虚,虛擬控制臺1運行的是圖形界面,其它的是字符界面史隆。display:1運行在tty7上)
我們可以直接運行X Server程序來啟動X Server魂务。/usr/bin/X和Xorg都是X Server程序。其實/usr/bin/X是Xorg的符號鏈接泌射,用哪一個都是一樣的粘姜。
啟動X Server的時候可以指定display參數(shù),因為可以省略掉hostname和screen_number熔酷,所以可以用:0孤紧,:1這樣的格式來指定display。在我的機器上拒秘,本來就有一個X Server在運行号显,display :0已經(jīng)被占用了,所以我使用sudo X :1 -retro來在display :1上再運行一個X Server
其中的-retro參數(shù)是為了讓X Server的背景顯示為斜紋躺酒,否則背景為純黑色押蚤,那就看不出來是否啟動了X Server。
按Ctrl+Alt+F7回到display :0(ubuntu)羹应,再用ps命令看一下揽碘,會發(fā)現(xiàn)系統(tǒng)中有兩個Xorg在運行,一個運行在虛擬控制臺7园匹,一個運行在虛擬控制臺8雳刺。
在新啟動的X Server中運行一個GVim看看效果。運行GVim時,使用-display :1參數(shù)指定窗口顯示在新啟動的X Server上,使用-geometry參數(shù)指定窗口的大小和位置昼窗。然后按Ctrl+Alt+F8切換虛擬控制臺,看效果滞详。
gvim –display :1 –geometry 700X500+20+20
遠程連接X Server
如果能讓遠程機器上的GVim也把窗口顯示在本地機器的屏幕上,那就比較過癮了紊馏。所以料饥,使用ssh連接到CentOS-5.10,然后使用gvim -display Ubuntu-14:1命令朱监,希望將GVim顯示到Ubuntu的display :1上岸啡。由于是遠程連接,所以hostname不能省略赫编,需寫成ubuntu:1巡蘸,也可以使用IP地址奋隶,寫成192.168.1.103:1。
gvim –display ubuntu:1
很可惜悦荒,連接失敗唯欣。
失敗的原因是遠程訪問X Server需要安全認證。這個可以理解搬味,就像登陸郵箱需要輸入用戶名和密碼一樣境氢,如果X Server不要認證就可以隨便連接的話,那豈不是桌面上垃圾窗口滿天飛碰纬?安全認證的方式有很多種萍聊,具體請參考man Xsecurity。安全認證可以使用xhost和xauth這兩個程序來進行悦析,具體使用方法參考它們的文檔寿桨。(同時注意防火墻#iptables –F清除所有規(guī)則)
先用xhost來授權(quán),這個比較簡單她按。為了運行xhost牛隅,需要在X Server上有一個終端,所以運行一個xterm
xterm –display :1
在xterm中輸入sodu xhost +192.168.1.109酌泰,這樣,CentOS-5.10中運行的GUI程序都可以連接到這個新開啟的X Server了匕累。(注每一個display的安全和環(huán)境都不一樣陵刹,哪一個display需遠程聯(lián)接,哪個就需要授一次權(quán))
在CentOS-5.10中運行GVim
gvim –display 192.168.1.103:1
新啟動的X Server界面比較丑陋欢嘿,我們還是想讓遠程機器上的GUI程序直接顯示在Ubuntu的桌面環(huán)境中衰琐。所以,指定display為:0
結(jié)果很不幸炼蹦,無法打開display羡宙。連接不上,為什么呢掐隐?是安全認證的問題嗎狗热?不是,是lightdm的問題虑省,請繼續(xù)往下看匿刮。
理解lightdm和X Window桌面環(huán)境的啟動過程
X Server的啟動方式有兩種,一種是通過顯示管理器啟動探颈,另一種是手動啟動熟丸。在前面的例子中,我通過直接運行/usr/bin/X :1來啟動了一個X Server伪节。直接啟動X Server的方法還有運行startx或者xinit光羞。手動啟動X Server的缺點就是啟動的X Server不好看绩鸣。而顯示管理器啟動的不僅有X Server,還有一大堆的Client程序纱兑,構(gòu)成了一個完整的桌面環(huán)境全闷,界面當然就漂亮多了。
顯示管理器(Display Manager)是什么呢萍启?前面我講到display就是一個電腦配備的一套鍵盤鼠標和顯示器总珠,那么顯示管理器就是這一套設備的管理器了。顯示管理器可以直接管理這些設備勘纯,所以它可以控制X Server的運行局服,由它來啟動X Server那是再合適不過了。系統(tǒng)啟動過程是這樣的:內(nèi)核加載–>init程序運行–>顯示管理器運行–>X Server運行–>顯示管理器連接到X Server驳遵,顯示登錄界面–>用戶登錄后淫奔,登錄界面關(guān)閉,加載桌面環(huán)境堤结。從上面的流程可以看出唆迁,顯示管理器是X Server的父進程,它負責啟動X Server竞穷,當X Server啟動后唐责,它又變成了X Server的一個Client程序,連接到X Server顯示歡迎界面和登錄界面瘾带,最后鼠哥,顯示管理器又是所有桌面環(huán)境的父進程,它負責啟動桌面環(huán)境需要的其它Client程序看政。
在Ubuntu 14.04中朴恳,使用lightdm取代了傳統(tǒng)的xdm、gdm等顯示管理器允蚣。簡單來說于颖,就是由lightdm負責啟動X Server和其它的X程序。不知道為什么嚷兔,lightdm在啟動X Server的時候森渐,給X Server加上了-nolisten tcp參數(shù),所以遠程計算機就沒有辦法連接到Ubuntu的桌面了谴垫。
在debian/kali linux的環(huán)境中edit /usr/share/gdm/gdm.schemas, setting the key security/DisallowTCP to false
打開新的使用X :1 –listen tcp 因為默認是不打開tcp端口的章母,只打開6000一個端口。
下一步的目標就是更改lightdm的配置翩剪,去掉這個-nolisten tcp參數(shù)乳怎。
在使用sudo dpkg -L lightdm查看該軟件包的文件時,發(fā)現(xiàn)它的log文件放在/var/log/lightdm文件夾下,過去看看:
終于蚪缀,從log文件中看到了lightdm啟動的全過程秫逝。首先,看到它從哪幾個目錄加載配置文件询枚,接著违帆,看到它啟動X Server。從下圖光標所在的行可以看到X Server啟動的所有參數(shù)金蜀,包括-nolisten tcp選項刷后。
繼續(xù)看log文件,下面光標所在的行顯示lightdm怎么啟動gnome-session:
同時渊抄,我發(fā)現(xiàn)/etc/lightdm/目錄下沒有l(wèi)ightdm.conf文件尝胆,而/usr/share/doc/lightdm/目錄下有一個lightdm.conf.gz文件,把該文件當文檔看了一下护桦,發(fā)現(xiàn)里面果然就是lightdm的配置的解釋含衔。趕快將該文件復制到/etc/lightdm/目錄下并解壓,然后用Vim編輯/etc/lightdm/lightdm.conf文件二庵,將xserver-allow-tcp=false一行前面的注釋去掉贪染,并且改為xserver-allow-tcp=true。如下圖:
最后催享,重啟系統(tǒng)杭隙。再用ps查看進程,發(fā)現(xiàn)-nolisten tcp選項已經(jīng)沒有了睡陪。
搞定xauth
搞定了-nolisten tcp之后寺渗,要想從遠程計算接連接到Ubuntu桌面,還是需要安全認證兰迫。在前面的例子中,我使用了xhost炬称。xhost是最簡單的認證方式汁果。在這里我要試一下別的認證方式,比如MIT-MAGIC-COOKIE-1玲躯。如上圖据德,先使用xauth list命令查看一下當前的授權(quán)記錄,發(fā)現(xiàn)只有一條跷车,而且display是ubuntu-14/unix:0棘利,很顯然,這是一個本地授權(quán)朽缴,所以需要使用xauth add命令添加一個使用ip地址的授權(quán)善玫,后面的key照抄就行了。最后密强,使用xauth extract和xauth merge配合管道和ssh將該授權(quán)記錄合并到CentOS-5.10中茅郎。
在CentOS-5.10中啟動GVim蜗元,指定display為192.168.1.103:0,GVim窗口就出現(xiàn)在了Ubuntu中系冗。
X Server的配置
可以使用不同的方法對X Server進行配置奕扣,前面的例子是直接指定命令行參數(shù)。除了指定命令行參數(shù)掌敬,還可以使用環(huán)境變量和配置文件惯豆。X Server的配置文件為一般是/etc/X11/xorg.conf或/etc/X11/xorg.conf.d/目錄下的.conf文件,當然奔害,配置文件也可以放在其它的目錄中楷兽,具體信息,請參看man xorg.conf舀武。
如果沒有配置文件拄养,X Server將在啟動的時候自動檢測硬件,然后生成一個內(nèi)置的配置银舱。Ubuntu系統(tǒng)就沒有配置文件瘪匿。不過沒關(guān)系,如果需要使用配置文件的時候寻馏,可以通過X Server的-configure參數(shù)生成一個配置文件棋弥,里面包含當前自動檢測出的配置。如果需要任何個性化的配置诚欠,對該文件進行修改即可顽染。
現(xiàn)有的圖形界面中可以運行嵌套的X Server
我們上面運行的X Server都是直接占用了計算機的整個顯示器和鍵盤鼠標,事實上轰绵,在現(xiàn)有的圖形界面中粉寞,還可以以窗口模式運行另外一個X Server,稱為nested X Server左腔。最常用的nested X Server是Xephyr唧垦,在Ubuntu中可以通過如下命令安裝它:
sudo aptitude install xserver-xephyr (yum install Xephyr)
Xephyr的使用非常簡單,可以通過 man Xephyr 命令查看它的使用手冊液样。如果輸入 Xephyr :1 (display號不能和已用dsiplay號沖突)命令振亮,就可以在現(xiàn)有圖形界面中打開一個窗口模式的X Server
以后再啟動GUI程序,就可以通過程序的-display選項讓程序運行在這個嵌套的X Server中鞭莽,如:#xterm –display :1 &
怎么樣坊秸,是不是很好玩呢?除了好玩澎怒,還很有用褒搔,比如調(diào)試窗口管理器啊、連接遠程桌面啊什么的都用得著。當然站超,我這里只是簡單展示一下原來X Window還可以這么玩荸恕。
總結(jié):
1.在一個Linux系統(tǒng)中存在多個虛擬控制臺,所以可以啟動多個X Server死相;
2.啟動X Server的方式有兩種融求,一種是使用/usr/bin/X、startx算撮、xinit手動啟動生宛,一種是通過顯示管理器啟動;
3.Ubuntu使用的顯示管理器是lightdm肮柜,這是一個比較新的陷舅、輕量級的顯示管理器,但是文檔不夠詳細审洞;
4.遠程計算機連接本地的X Server莱睁,需要X Server開放TCP端口,還要搞定安全認證芒澜;
5.X Server的配置仰剿,可以通過命令行參數(shù),可以通過環(huán)境變量痴晦,還可以通過配置文件南吮;
6.可以在現(xiàn)有的圖形界面下以窗口模式運行嵌套的X Server,常用的軟件是Xephyr誊酌;
7.我的《Linux入門學習教程:Linux系統(tǒng)折騰筆記》中介紹的方法不夠用部凑,還要加上兩條:①使用ps命令查看進程;②查看程序啟動的log文件碧浊。
https://blog.csdn.net/seaship/article/details/86233325