Linux開機啟動程序詳解

轉自:Linux如何實現開機啟動程序詳解  
  我們假設大家已經熟悉其它操作系統的引導過程,了解硬件的自檢引導步驟,就只從Linux操作系統的引導加載程序(對個人電腦而言通常是LILO)開始,介紹Linux開機引導的步驟。

Linux開機引導的步驟

  1. 加載內核
    LILO啟動之后,如果你選擇了Linux作為準備引導的操作系統,第一個被加載的東西就是內核。請記住此時的計算機內存中還不存在任何操作系統,PC(因為它們天然的設計缺陷)也還沒有辦法存取機器上全部的內存。因此,內核就必須完整地加載到可用RAM的第一個兆字節之內。為了實現這個目的,內核是被壓縮了的。這個文件的頭部包含著必要的代碼,先設置CPU進入安全模式(以此解除內存限制),再對內核的剩余部分進行解壓縮。
  2. 執行內核
    內核在內存中解壓縮之后,就可以開始運行了。此時的內核只知道它本身內建的各種功能,也就是說被編譯為模塊的內核部分還不能使用。最基本的是,內核必須有足夠的代碼設置自己的虛擬內存子系統和根文件系統(通常就是ext2文件系統)。一旦內核啟動運行,對硬件的檢測就會決定需要對哪些設備驅動程序進行初始化。從這里開始,內核就能夠掛裝根文件系統(這個過程類似于Windows識別并存取C盤的過程)。內核掛裝了根文件系統之后,將啟動并運行一個叫做init的程序。注意:在這里我們故意略去了Linux內核啟動的許多細節,這些細節只有內核開發人員才感興趣。
  3. init進程
    init進程是非內核進程中第一個被啟動運行的,因此它的進程編號PID的值總是1。init讀它的配置文件<code>/etc/inittab</code>,決定需要啟動的運行級別(Runlevel)。從根本上說,運行級別規定了整個系統的行為,每個級別(分別由0到6的整數表示)滿足特定的目的。
    如果定義了initdefault級別,這個值就直接被選中,否則需要由用戶輸入一個代表運行級別的數值。輸入代表運行級別的數字之后,init根據<code>/etc/inittab</code>文件中的定義執行一個命令腳本程序。
    缺省的運行級別取決于安裝階段對登錄程序的選擇:是使用基于文本的,還是使用基于X-Window的登錄程序。
    rc命令腳本程序我們已經知道,當運行級別發生改變時,將由<code>/etc/inittab</code>文件定義需要運行哪一個命令腳本程序。這些命令腳本程序負責啟動或者停止該運行級別特定的各種服務。由于需要管理的服務數量很多,因此需要使用rc命令腳本程序。其中,最主要的一個是<code>/etc/rc.d/rc</code>,它負責為每一個運行級別按照正確的順序調用相應的命令腳本程序。我們可以想象,這樣一個命令腳本程序很容易變得難以控制!為了防止這類事件的發生,需要使用精心設計的方案。
    對每一個運行級別來說,在<code>/etc/rc.d</code>子目錄中都有一個對應的下級目錄。這些運行級別的下級子目錄的命名方法是<code>rcX.d</code>,其中的X就是代表運行級別的數字。比如說,運行級別3的全部命令腳本程序都保存在<code>/etc/rc.d/rc3.d</code>子目錄中。
    在各個運行級別的子目錄中,都建立有到<code>/etc/rc.d/init.d</code>子目錄中命令腳本程序的符號鏈接,但是,這些符號鏈接并不使用命令腳本程序在<code>/etc/rc.d/init.d</code>子目錄中原來的名字。
    如果命令腳本程序是用來啟動一個服務的,其符號鏈接的名字就以字母S打頭;如果命令腳本程序是用來關閉一個服務的,其符號鏈接的名字就以字母K打頭。許多情況下,這些命令腳本程序的執行順序都很重要。如果沒有先配置網絡接口,就沒有辦法使用DNS服務解析主機名!為了安排它們的執行順序,在字母S或者K的后面緊跟著一個兩位數字,數值小的在數值大的前面執行。比如:<code>/etc/rc.d/rc3.d/S50inet</code>就會在<code>/etc/rc.d/rc3.d/S55named</code>之前執行(S50inet配置網絡設置,55named啟動DNS服務器)。存放在<code>/etc/rc.d/init.d</code>子目錄中的、被符號鏈接上的命令腳本程序是真正的實干家,是它們完成了啟動或者停止各種服務的操作過程。當<code>/etc/rc.d/rc</code>運行通過每個特定的運行級別子目錄的時候,它會根據數字的順序依次調用各個命令腳本程序執行。它先運行以字母K打頭的命令腳本程序,然后再運行以字母S打頭的命令腳本程序。對以字母K打頭的命令腳本程序來說,會傳遞Stop參數;類似地對以字母S打頭的命令腳本程序來說,會傳遞Start參數。編寫自己的rc命令腳本在維護Linux系統運轉的日子里,肯定會遇到需要系統管理員對開機或者關機命令腳本進行修改的情況。

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

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

  2. 如果所做的修改比較細致,或者還要求關閉進程使之明確地停止運行,則需要在/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命令就可以了。屏幕上會出現一個窗口,其中列出了能夠修改的全部參數,需要時還包括在線幫助。警告:如果是在一個現實中的系統上學習本文的知識,要多多運用常識。當試著對啟動腳本程序進行修改的時候,要記住所做的修改可能會造成你的系統不能正常工作,而且無法采用重啟動的方法恢復。不要在正常運轉的系統上實驗新的設置,對你準備修改的文件要全部進行備份。最重要的是,在手邊要準備一張引導盤以防不測。

具體操作步驟

  1. <code>/etc/rc.local</code>這是一個最簡單的方法,編輯“/etc/rc.local”,把啟動程序的shell命令輸入進去即可(要輸入命令的全路徑),類似于windows下的“啟動”。
    使用命令 <code>vim /etc/rc.local </code>,然后在文件最后一行添加要執行程序的全路徑。例如,每次開機時要執行一個haha.sh,這個腳本放在/opt下面,那就可以在<code>/etc/rc.local</code>中加一行<code>/opt/./haha.sh</code>,或者兩行<code>cd /opt</code>和<code>./haha.sh</code>。

  2. crontab(類似于windows的任務計劃服務)
    通過crontab可以設定程序的執行時間表,例如讓程序在每天的8點,或者每個星期一的10點執行一次。

  • crontab -l 列出時間表
  • crontab -e編輯時間表
  • crontab -d刪除時間表
  • “-l”沒什么可說的,就是一個查看而已
  • “-e”是編輯,和vi沒什么差別(其實就是用vi編輯一個特定文件)
  • “-d”基本不用,因為它把該用戶所有的時間表都刪除了,一般都是用“-e”編輯把不要了的時間表逐行刪除;
    那到底該如何編輯呢?
    crontab文件的格式是:<code>M H D m d CMD</code>。一個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,就是<code>5 8 * * * /opt/./haha.sh</code>。 好像和“開機程序自動啟動”扯遠了,現在回歸正題。其實上面介紹的crontab的功能已經具備了開機自動啟動的能力,可以寫一個監測腳本,每5分鐘執行一次(<code>/5 * * * * ./haha.sh</code>),如果程序不在了就重新啟動一次。
  1. 注冊系統服務
    操作系統自帶的服務,如ssh,ftp等等,開機都是自動啟動的,我們也可以通過這種方式讓自己開發的程序提高“身價”。比如我想把某個已經安裝了的服務添加為系統服務,可以執行以下命令:
  • <code>chkconfig --add 服務名稱 </code> (首先,添加為系統服務,注意add前面有兩個橫杠)
  • <code>chkconfig -leve 啟動級別 服務名 on</code>(說明,3級別代表在命令行模式啟動,5級別代表在圖形界面啟動,on表示開啟)
  • <code>chkconfig -leve 啟動級別 服務名 off</code>說明,off表示關閉自啟動)
  • <code>chkconfig -level 3 mysql on</code>說明:讓mysql服務在命令行模式,隨系統啟動
  • <code>chkconfig --add 服務名稱</code> 來刪除系統服務

  • 如果要查看哪些服務被添加為系統服務可以使用命令 :
    <code>ntsysv </code>或者<code>chkconfig --list</code>

  • 如果要查看哪些程序被添加為自啟動,可以使用命令 :
    <code>cat /etc/rc.local </code> (查看這個文件中添加了哪些程序路徑)


** 下面舉例說說,如何把一個shell腳本添加為系統服務,并跟隨系統啟動:**
  可以看到<code>/etc/rc.d/init.d</code>下有很多的文件,每個文件都是可以看到內容的,其實都是一些shell腳本。系統服務的啟動就是通過<code>/etc/rc.d/init.d</code>中的腳本文件實現的。我們也可以寫一個自己的腳本放在這里。
腳本文件的內容也很簡單,類似于這個樣子(例如起個名字叫做“hahad”):
<pre>
. /etc/init.d/functions
start() {
echo "Starting my process "
cd /opt
./haha.sh
}
stop() {
killall haha.sh
echo "Stoped"
}
</pre>
寫了腳本文件之后事情還沒有完,繼續完成以下幾個步驟:

  • <code>chmod +x hahad</code>   ** # **增加執行權限
  • <code>chkconfig --add hahad</code>    ** # ** 把hahad添加到系統服務列表
  • <code>chkconfig hahad on</code>  ** # **設定hahad的開關(on/off)
  • <code>chkconfig --list hahad</code>   ** # **就可以看到已經注冊了hahad的服務

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

本文轉自:Linux如何實現開機啟動程序詳解

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,702評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,143評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,553評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,620評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,416評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,940評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,170評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,709評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,597評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,029評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,407評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,663評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,403評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,746評論 2 370

推薦閱讀更多精彩內容