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命令就能夠了。屏幕上會出現一個窗口,其中列出了可以修改的所有參數,須要時還包括在線幫助。警告:若是是在一個現實中的系統上學習本文的知識,要多多運用常識。當試着對啓動腳本程序進行修改的時候,要記住所作的修改可能會形成你的系統不能正常工做,並且沒法採用重啓動的方法恢復。不要在正常運轉的系統上實驗新的設置,對你準備修改的文件要所有進行備份。最重要的是,在手邊要準備一張引導盤以防不測。html

 

http://blog.csdn.net/xitong2012/article/details/7260956mysql

 

 

在Linux系統如何讓程序開機時自動啓動linux

 

      核心提示:系統的服務在開機時通常均可以自動啓動,那在linux系統下若是想要程序在開機時自動啓動怎麼辦?咱們知道在 windows系統「開始」-->「全部程序」-->「啓動」裏面放個快捷方式就行,那Linux系統下呢?...系統的服務在開機時通常均可以自動啓動,那在linux系統下若是想要程序在開機時自動啓動怎麼辦?咱們知道在 windows系統「開始」-->「全部程序」-->「啓動」裏面放個快捷方式就行,那Linux系統下呢?
 
這也是一個比較簡單的問題,有很多的方法能夠解決,這裏介紹三種方法。由於是簡單介紹,因此具體細節不是很詳細,能夠經過man看看相關手冊。
 
1、/etc/rc.local
這是一個最簡單的方法,編輯「/etc/rc.local」,把啓動程序的shell命令輸入進去便可(要輸入命令的全路徑),相似於windows下的「啓動」。sql

使用命令 vi  /etc/rc.local   shell

而後在文件最後一行添加要執行程序的全路徑。windows

例如,每次開機時要執行一個haha.sh,這個腳本放在/opt下面,那就能夠在「/etc/rc.local」中加一行「/opt/./haha.sh」,或者兩行「cd /opt」和「./haha.sh」。
 
2、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),若是程序不在了就從新啓動一次。
 
3、註冊系統服務
操做系統自帶的服務,如ssh,ftp等等,開機都是自動啓動的,咱們也能夠經過這種方式讓本身開發的程序提升「身價」。安全

 

好比我想把某個已經安裝了的服務添加爲系統服務,能夠執行如下命令:服務器

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

 

chkconfig -leve 啓動級別 服務名 on         
ssh

(說明,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的服務

 
這時候才完成了所有工做。 

 

文章轉自:http://www.pckezhan.com/Html/?1009.html

相關文章
相關標籤/搜索