linux開機啟動程式詳解
我們假設大家已經熟悉其它作業系統的引導過程,了解硬體的自檢引導步驟,就只從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系統運轉的日子裡,肯定會遇到需要系統管理員對開機或者關機命令腳
本進行修改的情況。
如果確實需要使用乙個命令指令碼程式,這時必須選擇第二個方法。編寫乙個rc命令指令碼程式的過程並不像想象中那麼困難。我們下面就給出乙個例子,看看它是怎樣實現的(順便說一句,你可以把我們的例子當作範本,按照自己的需要進行修改和新增)。
假設你打算每隔60分鐘呼叫乙個特殊的程式來彈出一條訊息,提醒自己需要從鍵盤前面離開休息一會兒,命令指令碼程式將包括下面幾個部分:
●關於這個命令指令碼程式功能的說明(這樣就不會在一年之後忘記它);
●在試圖執行它之前驗證這個命令指令碼程式確實存在;
●接受start和stop引數並執行要求的動作。
引數給定後,我們就可以編寫命令的指令碼程式。這個程式很簡單,大家可以自己編寫一下,我在這裡就不給出了。
編寫好新的命令指令碼程式之後,再從相關的執行級別子目錄中加上必要的符號鏈結,來控制這個命令指令碼程式的啟動或者停止。在我的印象中,只想讓它在執行級別3或者執行級別5中啟動,原因是我認為只有這兩個執行級別才是日常工作的地方。最後,希望這個命令指令碼程式在進入執行級別6(重啟動)的時候被關閉。
啟用或者禁止服務專案有的時候會發現,在引導的時候並不需要某個特定的服務被啟動。如果你正在考慮使用linux替換windows nt的檔案和列印伺服器,就更是如此。我們已經知道,在特定的執行級別子目錄中給符號鏈結改個名稱,就可以讓該服務不被啟動,如把其名稱的第乙個字母由s改為k。一旦熟練掌握了命令列和符號鏈結,就會發現這是啟用或者禁止服務的最快辦法。
在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),如果程式不在了就重新啟動一次。
三、註冊系統服務
作業系統自帶的服務,如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 設定程式開機自動啟動
目錄 1.基礎說明 2.編輯啟動檔案 3.給啟動檔案新增許可權 4.設定軟連線 將程式設定為開機啟動的方法不止一種,這裡記錄的,應該是最常用的一種。root使用者執行命令 ll etc rc.d 可以看到有下面這些檔案 centos ip 172 31 42 26 init.d ll etc rc....
Linux 開機啟動程式
嘗試一下幾種方法 在exit0 前新增啟動命令 在.config下的autostart下建立.desktop 檔案 若autostart資料夾不存在則手動建立 新增以下 關鍵要有type和exec2行。但是我的比較特殊啟動的是wxpython的指令碼,所以以上方法都無效 程式啟動了,但是不顯示介面 ...
linux配置開機自動啟動
1.linux開機啟動過程為 kernel init etc inittab etc rc.d rc.sysinit etc rc.d rc 切換執行級,最後一步呼叫rc.local getty 2.檢查linux啟動的級別,shell 中執行 runlevel 或者檢視 etc inittab檔案...