1. 程式人生 > >ubuntu 12.04設定開機啟動圖形應用程式,替換預設圖形桌面

ubuntu 12.04設定開機啟動圖形應用程式,替換預設圖形桌面

想把ubuntu 12.04的開機設定模式改為預設為命令方式,搜尋半天,現將成功的方法轉出,並感謝作者。

一、前言

無論你想要在ubuntu 12.04(11.10適用)開機啟動圖形程式,或者非圖形程式,相信這篇文章能幫上大忙。

我將根據我的需求講解我的做法,並解釋為什麼這麼做。完了以後,各位看官根據自己的需求不加修改或稍加修改即可適用。我這邊,總得來說,需求是做一個RDP瘦客戶端,在一個板子上裝上ubuntu12.04,然後要這個系統啟動後能立即彈出RDPclient登入框,而不是進入ubuntu的圖形桌面。

二,三部分講解我是怎麼做的,四部分總結設定程式為開機啟動的方法,五部分主要針對需要把圖形介面程式弄成開機啟動的同學,講解startx。

第六部分為後來補充的:如何關閉ubuntu的啟動時載入畫面(“loadingscreen”)。

二、阻止預設圖形桌面啟動

ubuntu12.04預設的開機會進入一個圖形介面,用命令pstree可以看到圖形介面所在的程序樹:


首先要做的,就是阻止這個lightdm的程序開機啟動。 做法:

一、檢視檔案/etc/init/rc-sysinit.conf,在第14行附近:確認“envDEFAULT_RUNLEVEL=2”。2是新裝系統預設的,確保不被修改。

二、編輯檔案/etc/init/lightdm.conf,在第12行附近,原句“ and runlevel[!06]” 改為“ and runlevel [!026]”。

解釋:linux系統都有一個執行級別(runlevel)的概念,不同的執行級別配置將導致系統的啟動過程有很大差異,比如當配置runlevel 為 1是,是不進入圖形介面的。系統啟動過程中會有一個init程序來拉起許多其他程序(各種系統服務,視窗介面)。在ubuntu上(11.10,12.04是這樣,其他版本或其他linux發行版不確定)init會執行兩個目錄下的指令碼,一個是/etc/init/下的,另一個是/etc/rc?.d/下的,問號可能是0~6的其中一個數字,代表執行級別。接下來,講解一下流程以加深理解。

在ubuntu上,init程序首先執行/etc/init/目錄下的rc-sysinit.conf,這個檔案指明瞭本次啟動的預設執行級別。這是上面第一步的意義:確保預設執行級別是2。接下來目錄/etc/init下的其他指令碼的執行都會根據不同的執行級別做出不同的動作,比如lightdm會判斷執行級別是否處於1,2,3,4,5中的一個,是則啟動lightdm,不是則不啟動lightdm。這便是上面第二步的意義,修改lightdm.conf,把“2”加入到判斷語句,使得lightdm在執行級別2的時候不要啟動。明白了這些,你就可以靈活一點,例如把預設級別設定為3,而把3加入那個判斷語句,也可以達到阻止lightdm啟動的效果。完成了/etc/init/目錄下的啟動動作,init程序會繼續執行/etc/rc2.d目錄下的指令碼。

三、設定自己的程式為開機啟動

阻止了lightdm的啟動之後,還要做的就是把我的RDPClient設定為開機啟動。做法:

一、在目錄/usr/bin下,有個檔案startx,在當前目錄複製出一份來,命名為mystartx(cpstartx mystartx)。編輯mystartx,在檔案末尾有一行“xinit "$client" $clientargs --"$server" $display$serverargs”,在這一行的前面加入一行"client="/root//myRdpClient/myRdpClient.py"。

二、編輯檔案/etc/rc.local,在"exit0"前新增一行:/usr/bin/mystartx。

解釋:第一步裡,我製作了一個啟動RDPClient的指令碼,第二步裡,我把這個指令碼設定為開機啟動。製作RDPClient或其他圖形應用程式的啟動指令碼請看本文的第五部分,第四部分講解開機啟動的方法和注意事項。

四、新增開機啟動程式的方法及其注意事項

對於開機啟動程式,需要關注4個地方(排序有分先後):1.目錄 /etc/init/下的所有conf都會被init程序首先執行。2.執行級別為2的時候,目錄 /etc/rc2.d/下的所有指令碼會其次執行,其他執行級別雷同。3.檔案/etc/rc.local裡的命令會得到執行。4.在檔案/etc/crontab裡面配置為@reboot的命令會得到執行。 以下分別講解每個地方該怎麼做。

1.在/etc/init/目錄下新增開機啟動程式的方法。該目錄下新建檔案myrdpclient.conf。將下面的內容拷貝至檔案儲存即可。

start on login-session-start

script

    /usr/bin/mystartx
end script

這樣init程序就會啟動的時候執行/usr/bin/mystartx。之前我解釋執行級別(runlevel)的時候,說這個目錄下的是指令碼,是不想在那個地方廢話。其實,這個目錄下的.conf檔案是供init程序讀取的配置檔案,每個配置檔案的內容包含兩個內容,一是一段指令碼在告訴init要啟動哪個程式,即指定一個job,或者說任務;二是一些標籤(如“starton”)表明這個程式在什麼時候啟停。首先被讀取執行的是rc-sysinit.conf。關於具體該如何寫一個conf檔案來讓init在適當的時候執行某個程式請自行搜尋,我給出個這個配置是個非常簡單的配置,如果你需求不多的話,把/usr/bin/mystartx替換為你的程式就夠了。

2.在/etc/rc2.d目錄下新增開機啟動程式的方法。執行命令:

ln -s /usr/bin/mystartx ./S99mystartx

這個命令將會該目錄下建立一個指向/usr/bin/mystartx的連結,這樣init在啟動時就會執行這個連結指向的命令。那個S99打頭的命名規則,我其實不清楚其意義是什麼,大約是在標明啟動優先順序。總之,你只需要將/usr/bin/mystartx替換為你想要執行的命令(你的程式),同時連結的名字以"S99"為字首即可。

3.在/etc/rc.local檔案裡新增啟動程式,在“exit0”之前寫上你的命令就可以了,我正是這麼做的。

4.在檔案/etc/crontab裡新增開機啟動程式,編輯該檔案,在檔案末尾新增一行:

@reboot   root /usr/bin/mystartx

這樣你的程式會被一個叫 cron 的例程拉起(而不是 init ),實際上,是 init在啟動過程中啟動啦 cron 例程,而 cron 例程通常在系統中做一些定時作業,通過配置也可以讓 cron在啟動時做一些作業。

所以,如果你要新增自己的開機啟動程式,以上四個地方都可以,其中要大家注意的幾點:

一、前兩種方法可能是不穩妥的,因為這兩個階段是系統啟動階段,你新增的程式若對系統某些服務有依賴,將導致你的程式出現錯誤,比如我的RDPclient會出現段錯誤。

二、第三種方法,新增到/etc/rc.local裡面,是網上出現最多的答案,這也是我採用的方法。。事實上,rc.local是系統特地為使用者提供的一個新增開機啟動程式的介面。需要注意的是,並非每個執行級別都會執行rc.local,在ubuntu裡只有2,3,4,5執行級別會執行,所以如果執行級別設定不對的話,你寫在rc.local裡的命令可能就不能如期執行了。如果你對rc.local如何被執行感興趣的話讀下面。實際上執行rc.local是rc2.d目錄下所有指令碼中的最後一個指令碼。接下來證明這點,可以在rc2.d目錄下執行命令:ls-l:

S99rc.local ->../init/rc.local

可以看到,rc2.d目錄下的S99rc.local是一個到/etc/init.d/rc.local 的連結,執行 S99rc.local 就是在執行 /etc/init.d/rc.local,而開啟這個檔案發現裡面的註釋:

# Default-Start:    2 3 4 5
# Default-Stop:
# Short-Description: Run /etc/rc.local if it exist

實際上,就是在執行 /etc/rc.local。所以,執行rc2.d目錄下的所有指令碼,最後一步,就是執行 /etc/rc.local。其中的註釋同樣表明了只有2、3、4、5執行級別會執行rc.local,這是因為,只有在2、3、4、5對應的 /etc/rc?.d目錄才有執行 rc.local 的連結。

五、製作圖形應用程式啟動指令碼

對於要開機啟動非圖形介面的同學來說,事情是非常簡單的,在rc.local裡新增你的命令即可(或者使用第四部分的其他方法)。之前的阻止lightdm啟動你都不需要做,做了也無妨。至於執行級別,你沒動過的話應該是2,是ok的。

對於要啟動圖形化介面的同學,要知道為什麼我在startx裡面新增一行,設定為開機啟動,同時遮蔽lightdm的啟動,就可以達到目的,可能還需要進一步的說明。

在linux裡,要執行圖形介面,需要同時有 X server(或者叫X11server,"11"是當前的版本號), 和X client,這是 x windows工作的模式(據說以後會改成wayland什麼的,那是後話)。X server在目錄 /etc/X11 下,Xserver啟動後的程序名字叫 Xorg ,如果你的系統啟動了圖形桌面。那麼執行命令 pstree一定可以看到Xorg,正如我在第一部分的貼圖裡顯示,在那裡,Xorg 是被 lightdm 拉起來的。

所以,如果ubuntu系統要跑圖形程式,不管是它的預設圖形桌面lightdm,還是我的RDPClient,都必須先啟動X server(Xorg),再啟動圖形程式作為Xclient。沒有修改過的ubuntu的圖形桌面就是這樣啟動的,從圖中你可以看到它先啟動了Xorg,再啟動了自己的一大堆metacity什麼的。那麼,我現在阻止了lightdm的啟動,要執行RDPCLient,也同樣要分兩步:一、啟動Xserver,二、啟動RDPClient(作為X client)。

這看起來真難,因為我其實也不知道如何啟動X server。但是在 /usr/bin下有一個指令碼叫 startx。這個指令碼是個歷史遺留指令碼,在過去的ubuntu,或者現在某些其發行版本linux,是這個指令碼負責啟動預設的圖形桌面的。它會做兩件事,一、啟動X11server,二,啟動圖形桌面作為Xclient。我可以拿這個指令碼稍作修改,替換掉其中的圖形桌面為我的RDPClient就可以了,具體做法在第二部分。

為什麼我不修改lightdm.conf來達到目的?lightdm也是做了兩件事,不是也可以替換它的Xclient為我的Xclient就可以了麼?也許這樣是可以的,但是,lightdm.conf那個指令碼,哥們兒,你去看看吧,我反正下不了手。反觀startx,startx的啟動邏輯是非常清晰的,它通過執行了一個xinit 命令來同時啟動X server 和 X client,建議你使用命令“man xinit”檢視xinit的相關內容。修改startx來達到目的比較容易,這就是為什麼我不修改lightdm。

總結,阻止lightdm啟動預設桌面,通過修改startx來製作一個指令碼mystartx以啟動Xserver和我的RDPClient,把mystartx搞成開機啟動。這是這樣!

六、關閉Ubuntu的載入畫面

ubuntu啟動時,會有一個ubuntu字樣出現在螢幕,文字下方有閃爍的點,這時按ESC可以在動畫和文字介面之間切換。這一步驟不屬於lightdm,而是一個叫plymouth 的程序在起作用。實際上,plymouth的意義就在於,在開機到圖形桌面(lightdm)起來這段時間裡展示出一個動畫,從而提高使用者體驗。

遮蔽的方法:

一、編輯 /etc/default/grub 檔案,原文11行附近:

GRUB_CMDLINE_LINUX_DEFAULT="quietsplash" 

去掉”splash“,改後:

GRUB_CMDLINE_LINUX_DEFAULT="quiet"

二、執行命令:

sudu updat-grub

重啟,即可看到,不再有載入畫面出現了。


Ubuntu的預設開機的runlevel是2,可以用runlevel來檢視當前的預設執行級別。

debian系(ubuntu是基於debian)的Linux一直是用runlevel2來預設啟動,並且runlevel定義也與redhat有區別。

debian的runlevel級別定義如下:
0 - Halt
1 - Single
2 - Full multi-user with display manager (GUI)
3 - Full multi-user with display manager (GUI)
4 - Full multi-user with display manager (GUI)
5 - Full multi-user with display manager (GUI)
6 - Reboot

可以發現2~5級是沒有任何區別的。

######而redhat的runlevel級別定義如下:
######0 - Halt
######1 - Single
######2 - Not used/User definable
######3 - Full multi-user NO display manager
######4 - Not used/User definable
######5 - Full multi-user with display manager (GUI)
######6 - Reboot

對應的配置資料夾如下:
/etc/rc0.d Run level 0
/etc/rc1.d Run level 1
/etc/rc2.d Run level 2
/etc/rc3.d Run level 3
/etc/rc4.d Run level 4
/etc/rc5.d Run level 5
/etc/rc6.d Run level 6

這裡的runlevel3-5都是進入圖形介面。這與其他的linux發行版不太一致,通常runlevel3是Multi user mode,即直接登入到字元介面;而runlevel 5是Multi user mode withGUI,即登入到圖形介面

    首先說一下我用的系統是:Linux version2.6.26-2-686 (Debian 2.6.26-17)    每次都進視窗介面,慢,而且也一般不用視窗介面,這個。。。要專業點嘛:)          網上找了N多相關資訊,大部分是說改/etc/inittab裡的defaultrunlevel,我裝完debian後的defaultrunlevel是2,改成3之後(大部分這樣說),reboot後還是進入了圖形視窗介面。

正確的方法應該是這樣的(說白了,runlevel2~5隨便,你選定x就去修改/etc/rcx.d裡的內容即可):

       第一步:先把/etc/inittab裡的The defaultrunlevel改成3,因為以前其他版本的linux的3 runlevel就可以從字元介面啟動。我們也把defaultrunlevel改成3。

       第二步:cd
到/etc/rc3.d目錄,因為當系統以runlevel=3啟動時,會到/etc/rc3.d這個目錄裡執行裡面的指令碼。有個
README檔案,內容如下:

The scripts in this directory are executed each time the systementers
this runlevel.

The scripts are all symbolic links whose targets are locatedin
/etc/init.d/ .

To disable a service in this runlevel, rename its script in thisdirectory
so that the new name begins with a 'K' and a two-digit number,where the
number is the difference between the two-digit number following the'S'
in its current name, and 100.  To re-enable theservice, rename the script
back to its original name beginning with 'S'.

說得很清楚:這個目錄下的指令碼會在系統啟動時執行(當runlevel=3時),如果想要某個指令碼不執行,就重新命名一下,重新命名是有方法的:新的檔名是以“K”開頭的(注意大小寫),後面緊跟兩位數字,這兩位數字不能是原檔名中“S”後面的兩位數字,當然也不能是100(都三位數了)。OK,看懂README後,就把S30gdm重新命名為K31gdm。

      完成,reboot,直接進入字元介面了:)      要想從字元介面進入圖形介面,執行startx即可,當然,你得有這個許可權。