Linux開機啟動程式詳解

2021-07-28 19:52:04 字數 4851 閱讀 7858

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

載入核心

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

執行核心

核心在記憶體中解壓縮之後,就可以開始執行了。此時的核心只知道它本身內建的各種功能,也就是說被編譯為模組的核心部分還不能使用。最基本的是,核心必須有足夠的**設定自己的虛擬記憶體子系統和根檔案系統(通常就是ext2檔案系統)。一旦核心啟動執行,對硬體的檢測就會決定需要對哪些裝置驅動程式進行初始化。從這裡開始,核心就能夠掛裝根檔案系統(這個過程類似於windows識別並訪問c盤的過程)。核心掛裝了根檔案系統之後,將啟動並執行乙個叫做init的程式。

注意:在這裡我們故意略去了linux核心啟動的許多細節,這些細節只有核心開發人員才感興趣。如果你好奇的話,可以訪問http:位址處的"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引數並完成相應的操作。

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

這是乙個最簡單的方法,編輯「/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),如果程式不在了就重新啟動一次。

三、註冊系統服務

作業系統自帶的服務,如ssh,ftp等等,開機都是自動啟動的,我們也可以通過這種方式讓自己開發的程式提高「身價」。

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

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()

stop()

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

chmod +x hahad                    #增加執行許可權

chkconfig --add hahad             #把hahad新增到系統服務列表

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

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

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

Linux開機啟動程式詳解

由於作業系統正在變得越來越複雜,所以開機引導和關機下電的過程也越來越智慧型化。從簡單的dos系統轉移到windows nt系統,人們已經親身感受到了這些變化 這已不僅僅是核心作業系統的啟動引導和關閉了,還包括必須要同時啟動或者關閉相當數量的服務專案。類似於 windows nt,linux系統啟動過...

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

linux開機啟動程式詳解 我們假設大家已經熟悉其它作業系統的引導過程,了解硬體的自檢引導步驟,就只從linux作業系統的引導引導程式 對個人電腦而言通常是lilo 開始,介紹linux開機引導的步驟。載入核心 lilo啟動之後,如果你選擇了linux作為準備引導的作業系統,第乙個被載入的東西就是核...

Linux 開機啟動程式

嘗試一下幾種方法 在exit0 前新增啟動命令 在.config下的autostart下建立.desktop 檔案 若autostart資料夾不存在則手動建立 新增以下 關鍵要有type和exec2行。但是我的比較特殊啟動的是wxpython的指令碼,所以以上方法都無效 程式啟動了,但是不顯示介面 ...