天天看點

Linux如何實作開機啟動程式詳解

Linux開機啟動程式詳解

我們假設大家已經熟悉其它作業系統的引導過程,了解硬體的自檢引導步驟,就隻從Linux作業系統的引導加載程式(對個人電腦而言通常是LILO)開始,介紹Linux開機引導的步驟。

加載核心

LILO啟動之後,如果你選擇了Linux作為準備引導的作業系統,第一個被加載的東西就是核心。請記住此時的計算機記憶體中還不存在任何作業系統,PC(因為它們天然的設計缺陷)也還沒有辦法存取機器上全部的記憶體。是以,核心就必須完整地加載到可用RAM的第一個兆位元組之内。為了實作這個目的,核心是被壓縮了的。這個檔案的頭部包含着必要的代碼,先設定CPU進入安全模式(以此解除記憶體限制),再對核心的剩餘部分進行解壓縮。

執行核心

核心在記憶體中解壓縮之後,就可以開始運作了。此時的核心隻知道它本身内建的各種功能,也就是說被編譯為子產品的核心部分還不能使用。最基本的是,核心必須有足夠的代碼設定自己的虛拟記憶體子系統和根檔案系統(通常就是ext2檔案系統)。一旦核心啟動運作,對硬體的檢測就會決定需要對哪些裝置驅動程式進行初始化。從這裡開始,核心就能夠挂裝根檔案系統(這個過程類似于Windows識别并存取C槽的過程)。核心挂裝了根檔案系統之後,将啟動并運作一個叫做init的程式。

注意:在這裡我們故意略去了Linux核心啟動的許多細節,這些細節隻有核心開發人員才感興趣。如果你好奇的話,可以通路http://www.redhat.com:8080位址處的"Kernel Hackers Guide"。

init程序

init程序是非核心程序中第一個被啟動運作的,是以它的程序編号PID的值總是1。init讀它的配置檔案/etc/inittab,決定需要啟動的運作級别(Runlevel)。從根本上說,運作級别規定了整個系統的行為,每個級别(分别由0到6的整數表示)滿足特定的目的。如果定義了initdefault級别,這個值就直接被選中,否則需要由使用者輸入一個代表運作級别的數值。

輸入代表運作級别的數字之後,init根據/etc/inittab檔案中的定義執行一個指令腳本程式。預設的運作級别取決于安裝階段對登入程式的選擇:是使用基于文本的,還是使用基于X-Window的登入程式。

rc指令腳本程式我們已經知道,當運作級别發生改變時,将由/etc/inittab檔案定義需要運作哪一個指令腳本程式。這些指令腳本程式負責啟動或者停止該運作級别特定的各種服務。由于需要管理的服務數量很多,是以需要使用rc指令腳本程式。其中,最主要的一個是/etc/rc.d/rc,它負責為每一個運作級别按照正确的順序調用相應的指令腳本程式。我們可以想象,這樣一個指令腳本程式很容易變得難以控制!為了防止這類事件的發生,需要使用精心設計的方案。

對每一個運作級别來說,在/etc/rc.d子目錄中都有一個對應的下級目錄。這些運作級别的下級子目錄的命名方法是rcX.d,其中的X就是代表運作級别的數字。比如說,運作級别3的全部指令腳本程式都儲存在/etc/rc.d/rc3.d子目錄中。在各個運作級别的子目錄中,都建立有到/etc/rc.d/init.d子目錄中指令腳本程式的符号連結,但是,這些符号連結并不使用指令腳本程式在/etc/rc.d/init.d子目錄中原來的名字。如果指令腳本程式是用來啟動一個服務的,其符号連結的名字就以字母S打頭;如果指令腳本程式是用來關閉一個服務的,其符号連結的名字就以字母K打頭。

許多情況下,這些指令腳本程式的執行順序都很重要。如果沒有先配置網絡接口,就沒有辦法使用DNS服務解析主機名!為了安排它們的執行順序,在字母S或者K的後面緊跟着一個兩位數字,數值小的在數值大的前面執行。比如:/etc/rc.d/rc3.d/S50inet就會在/etc/rc.d/rc3.d/S55named之前執行(S50inet配置網絡設定,55named啟動DNS伺服器)。存放在/etc/rc.d/init.d子目錄中的、被符号連結上的指令腳本程式是真正的實幹家,是它們完成了啟動或者停止各種服務的操作過程。當/etc/rc.d/rc運作通過每個特定的運作級别子目錄的時候,它會根據數字的順序依次調用各個指令腳本程式執行。它先運作以字母K打頭的指令腳本程式,然後再運作以字母S打頭的指令腳本程式。對以字母K打頭的指令腳本程式來說,會傳遞Stop參數;類似地對以字母S打頭的指令腳本程式來說,會傳遞Start參數。編寫自己的rc指令腳本在維護Linux系統運轉的日子裡,肯定會遇到需要系統管理者對開機或者關機指令腳

本進行修改的情況。

有兩種方法可以用來實作修改的目的:

●如果所做的修改隻在引導開機的時候起作用,并且改動不大的話,可以考慮簡單地編輯一下/etc/rc.d/rc.local腳本。這個指令腳本程式是在引導過程的最後一步被執行的。

●如果所做的修改比較細緻,或者還要求關閉程序使之明确地停止運作,則需要在/etc/rc.d/init.d子目錄中添加一個指令腳本程式。這個指令腳本程式必須可以接受Start和Stop參數并完成相應的操作。

第一種方法,編輯/etc/rc.d/rc.local腳本,當然是兩種方法中比較簡單的。如果想在這個指令腳本程式中添加内容,隻需要使用喜歡的編輯器程式打開它,再把打算執行的指令附加到檔案的末尾就可以了。這對一兩行的修改來說的确很便利。

如果确實需要使用一個指令腳本程式,這時必須選擇第二個方法。編寫一個rc指令腳本程式的過程并不像想象中那麼困難。我們下面就給出一個例子,看看它是怎樣實作的(順便說一句,你可以把我們的例子當作範本,按照自己的需要進行修改和添加)。

假設你打算每隔60分鐘調用一個特殊的程式來彈出一條消息,提醒自己需要從鍵盤前面離開休息一會兒,指令腳本程式将包括下面幾個部分:

●關于這個指令腳本程式功能的說明(這樣就不會在一年之後忘記它);

●在試圖運作它之前驗證這個指令腳本程式确實存在;

●接受start和stop參數并執行要求的動作。

參數給定後,我們就可以編寫指令的腳本程式。這個程式很簡單,大家可以自己編寫一下,我在這裡就不給出了。

編寫好新的指令腳本程式之後,再從相關的運作級别子目錄中加上必要的符号連結,來控制這個指令腳本程式的啟動或者停止。在我的印象中,隻想讓它在運作級别3或者運作級别5中啟動,原因是我認為隻有這兩個運作級别才是日常工作的地方。最後,希望這個指令腳本程式在進入運作級别6(重新開機動)的時候被關閉。

激活或者禁止服務項目有的時候會發現,在引導的時候并不需要某個特定的服務被啟動。如果你正在考慮使用Linux替換Windows NT的檔案和列印伺服器,就更是如此。我們已經知道,在特定的運作級别子目錄中給符号連結改個名稱,就可以讓該服務不被啟動,如把其名稱的第一個字母由S改為K。一旦熟練掌握了指令行和符号連結,就會發現這是激活或者禁止服務的最快辦法。

在學習這個改名方法的時候,可能會覺得圖形化的操作界面ksysv比較容易掌握。雖然它原來是設計使用在KDE環境裡的,但在Red HatLinux 7.2下預設安裝的GNOME環境裡也運作得很好。如果想啟動它,隻需簡單地打開一個xterm視窗,并輸入ksysv指令就可以了。螢幕上會出現一個視窗,其中列出了能夠修改的全部參數,需要時還包括線上幫助。警告:如果是在一個現實中的系統上學習本文的知識,要多多運用常識。當試着對啟動腳本程式進行修改的時候,要記住所做的修改可能會造成你的系統不能正常工作,而且無法采用重新開機動的方法恢複。不要在正常運轉的系統上實驗新的設定,對你準備修改的檔案要全部進行備份。最重要的是,在手邊要準備一張引導盤以防不測。

<a href="http://blog.csdn.net/xitong2012/article/details/7260956">http://blog.csdn.net/xitong2012/article/details/7260956</a>

在Linux系統如何讓程式開機時自動啟動

      核心提示:系統的服務在開機時一般都可以自動啟動,那在linux系統下如果想要程式在開機時自動啟動怎麼辦?我們知道在 windows系統“開始”--&gt;“所有程式”--&gt;“啟動”裡面放個快捷方式就行,那Linux系統下呢?...系統的服務在開機時一般都可以自動啟動,那在linux系統下如果想要程式在開機時自動啟動怎麼辦?我們知道在 windows系統“開始”--&gt;“所有程式”--&gt;“啟動”裡面放個快捷方式就行,那Linux系統下呢?

這也是一個比較簡單的問題,有不少的方法可以解決,這裡介紹三種方法。因為是簡單介紹,是以具體細節不是很詳細,可以通過man看看相關手冊。

一、/etc/rc.local

這是一個最簡單的方法,編輯“/etc/rc.local”,把啟動程式的shell指令輸入進去即可(要輸入指令的全路徑),類似于windows下的“啟動”。

使用指令 vi  /etc/rc.local   

然後在檔案最後一行添加要執行程式的全路徑。

例如,每次開機時要執行一個haha.sh,這個腳本放在/opt下面,那就可以在“/etc/rc.local”中加一行“/opt/./haha.sh”,或者兩行“cd /opt”和“./haha.sh”。

二、crontab(類似于windows的任務計劃服務)

通過crontab可以設定程式的執行時間表,例如讓程式在每天的8點,或者每個星期一的10點執行一次。

crontab -l 列出時間表;

crontab -e編輯時間表;

crontab -d删除時間表;

“-l”沒什麼可說的,就是一個檢視而已;

“-e”是編輯,和vi沒什麼差别(其實就是用vi編輯一個特定檔案);

“-d”基本不用,因為它把該使用者所有的時間表都删除了,一般都是用“-e”編輯把不要了的時間表逐行删除;

那到底該如何編輯呢?

crontab檔案的格式是:M H D m d CMD。

一個6個字段,其中最後一個CMD就是所要執行的程式,如haha.sh。

M:分鐘(0-59)

H:小時(0-23)

D:日期(1-31)

m:月份(1-12)

d:一個星期中的某天(0-6,0代表周日)

這5個時間字段用空格隔開,其值可以是一個數字,也可以用逗号隔開的多個數字(或其他) ,如果不需設定,則預設為“*”。

例如,每天的8點5分執行haha.sh,就是“5 8 * * * /opt/./haha.sh”。

好像和“開機程式自動啟動”扯遠了,現在回歸正題。其實上面介紹的crontab的功能已經具備了開機自動啟動的能力,可以寫一個監測腳本,每5分鐘執行一次(*/5 * * * * ./haha.sh),如果程式不在了就重新啟動一次。

三、注冊系統服務

比如我想把某個已經安裝了的服務添加為系統服務,可以執行以下指令:

chkconfig --add 服務名稱          (首先,添加為系統服務,注意add前面有兩個橫杠)

chkconfig -leve 啟動級别 服務名 on         

(說明,3級别代表在指令行模式啟動,5級别代表在圖形界面啟動,on表示開啟)

chkconfig -leve 啟動級别 服務名 off              

(說明,off表示關閉自啟動)

例如:chkconfig -level 3 mysql on                     (說明:讓mysql服務在指令行模式,随系統啟動)

也可以使用   chkconfig --add 服務名稱    來删除系統服務

******************************************************************************************

如果要檢視哪些服務被添加為系統服務可以使用指令 :

   ntsysv  或者chkconfig --list

如果要檢視哪些程式被添加為自啟動,可以使用指令  :

cat   /etc/rc.local    (檢視這個檔案中添加了哪些程式路徑)

*******************************************************************************************

 下面舉例說說,如何把一個shell腳本添加為系統服務,并跟随系統啟動:

可以看到“/etc/rc.d/init.d”下有很多的檔案,每個檔案都是可以看到内容的,其實都是一些shell腳本。

系統服務的啟動就是通過“/etc/rc.d/init.d”中的腳本檔案實作的。我們也可以寫一個自己的腳本放在這裡。

腳本檔案的内容也很簡單,類似于這個樣子(例如起個名字叫做“hahad”):

. /etc/init.d/functions

start() {

        echo "Starting my process "

        cd /opt

        ./haha.sh

}

stop() {

        killall haha.sh

        echo "Stoped"

寫了腳本檔案之後事情還沒有完,繼續完成以下幾個步驟:

chmod +x hahad                    #增加執行權限

chkconfig --add hahad             #把hahad添加到系統服務清單

chkconfig hahad on                 #設定hahad的開關(on/off)

chkconfig --list hahad               #就可以看到已經注冊了hahad的服務

這時候才完成了全部工作。