<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > Linux開(kāi)機程序內幕

Linux開(kāi)機程序內幕

——
作者: 時(shí)間:2007-05-18 來(lái)源: 收藏
由于操作系統正在變得越來(lái)越復雜,所以開(kāi)機引導和關(guān)機下電的過(guò)程也越來(lái)越智能化。從簡(jiǎn)單的DOS系統轉移到Windows NT系統,人們已經(jīng)親身感受到了這些變化??這已不僅僅是核心操作系統的啟動(dòng)引導和關(guān)閉了,還包括必須要同時(shí)啟動(dòng)或者關(guān)閉相當數量的服務(wù)項目。類(lèi)似于 Windows NT,Linux系統啟動(dòng)過(guò)程需要打開(kāi)的服務(wù)項目也是數量極大的。

這里,我們假設大家已經(jīng)熟悉其它操作系統的引導過(guò)程,了解硬件的自檢引導步驟,就只從Linux操作系統的引導加載程序(對個(gè)人電腦而言通常是LILO)開(kāi)始,介紹Linux開(kāi)機引導的步驟。

加載內核

LILO啟動(dòng)之后,如果你選擇了Linux作為準備引導的操作系統,第一個(gè)被加載的東西就是內核。請記住此時(shí)的計算機內存中還不存在任何操作系統,PC (因為它們天然的設計缺陷)也還沒(méi)有辦法存取機器上全部的內存。因此,內核就必須完整地加載到可用RAM的第一個(gè)兆字節之內。為了實(shí)現這個(gè)目的,內核是被壓縮了的。這個(gè)文件的頭部包含著(zhù)必要的代碼,先設置CPU進(jìn)入安全模式(以此解除內存限制),再對內核的剩余部分進(jìn)行解壓縮。

執行內核

內核在內存中解壓縮之后,就可以開(kāi)始運行了。此時(shí)的內核只知道它本身內建的各種功能,也就是說(shuō)被編譯為模塊的內核部分還不能使用。最基本的是,內核必須有足夠的代碼設置自己的虛擬內存子系統和根文件系統(通常就是ext2文件系統)。一旦內核啟動(dòng)運行,對硬件的檢測就會(huì )決定需要對哪些設備驅動(dòng)程序進(jìn)行初始化。從這里開(kāi)始,內核就能夠掛裝根文件系統(這個(gè)過(guò)程類(lèi)似于Windows識別并存取C盤(pán)的過(guò)程)。內核掛裝了根文件系統之后,將啟動(dòng)并運行一個(gè)叫做 init的程序。

注意:在這里我們故意略去了Linux內核啟動(dòng)的許多細節,這些細節只有內核開(kāi)發(fā)人員才感興趣。如果你好奇的話(huà),可以訪(fǎng)問(wèn)http://www.redhat.com:8080地址處的 “Kernel Hackers Guide”。

init進(jìn)程

init進(jìn)程是非內核進(jìn)程中第一個(gè)被啟動(dòng)運行的,因此它的進(jìn)程編號PID的值總是1。init讀它的配置文件/etc/inittab,決定需要啟動(dòng)的運行級別(Runlevel)。從根本上說(shuō),運行級別規定了整個(gè)系統的行為,每個(gè)級別(分別由0到6的整數表示)滿(mǎn)足特定的目的。如果定義了 initdefault級別,這個(gè)值就直接被選中,否則需要由用戶(hù)輸入一個(gè)代表運行級別的數值。

輸入代表運行級別的數字之后,init根據/etc/inittab文件中的定義執行一個(gè)命令腳本程序。缺省的運行級別取決于安裝階段對登錄程序的選擇:是使用基于文本的,還是使用基于X-Window的登錄程序。


rc命令腳本程序


我們已經(jīng)知道,當運行級別發(fā)生改變時(shí),將由/etc/inittab文件定義需要運行哪一個(gè)命令腳本程序。這些命令腳本程序負責啟動(dòng)或者停止該運行級別特定的各種服務(wù)。由于需要管理的服務(wù)數量很多,因此需要使用rc命令腳本程序。其中,最主要的一個(gè)是/etc/rc.d/rc,它負責為每一個(gè)運行級別按照正確的順序調用相應的命令腳本程序。我們可以想象,這樣一個(gè)命令腳本程序很容易變得難以控制!為了防止這類(lèi)事件的發(fā)生,需要使用精心設計的方案。

對每一個(gè)運行級別來(lái)說(shuō),在/etc/rc.d子目錄中都有一個(gè)對應的下級目錄。這些運行級別的下級子目錄的命名方法是rcX.d,其中的X就是代表運行級別的數字。比如說(shuō),運行級別3的全部命令腳本程序都保存在/etc/rc.d/rc3.d子目錄中。

在各個(gè)運行級別的子目錄中,都建立有到/etc/rc.d/init.d子目錄中命令腳本程序的符號鏈接,但是,這些符號鏈接并不使用命令腳本程序在 /etc/rc.d/init.d子目錄中原來(lái)的名字。如果命令腳本程序是用來(lái)啟動(dòng)一個(gè)服務(wù)的,其符號鏈接的名字就以字母S打頭;如果命令腳本程序是用來(lái)關(guān)閉一個(gè)服務(wù)的,其符號鏈接的名字就以字母K打頭。

許多情況下,這些命令腳本程序的執行順序都很重要。如果沒(méi)有先配置網(wǎng)絡(luò )接口,就沒(méi)有辦法使用DNS服務(wù)解析主機名!為了安排它們的執行順序,在字母S或者 K的后面緊跟著(zhù)一個(gè)兩位數字,數值小的在數值大的前面執行。比如:/etc/rc.d/rc3.d/S50inet就會(huì )在 /etc/rc.d/rc3.d/S55named之前執行(S50inet配置網(wǎng)絡(luò )設置,S55named啟動(dòng)DNS服務(wù)器)。

存放在/etc/rc.d/init.d子目錄中的、被符號鏈接上的命令腳本程序是真正的實(shí)干家,是它們完成了啟動(dòng)或者停止各種服務(wù)的操作過(guò)程。當 /etc/rc.d/rc運行通過(guò)每個(gè)特定的運行級別子目錄的時(shí)候,它會(huì )根據數字的順序依次調用各個(gè)命令腳本程序執行。它先運行以字母K打頭的命令腳本程序,然后再運行以字母S打頭的命令腳本程序。對以字母K打頭的命令腳本程序來(lái)說(shuō),會(huì )傳遞Stop參數;類(lèi)似地對以字母S打頭的命令腳本程序來(lái)說(shuō),會(huì )傳遞 Start參數。

編寫(xiě)自己的rc命令腳本


在維護Linux系統運轉的日子里,肯定會(huì )遇到需要系統管理員對開(kāi)機或者關(guān)機命令腳本進(jìn)行修改的情況。有兩種方法可以用來(lái)實(shí)現修改的目的:

● 如果所做的修改只在引導開(kāi)機的時(shí)候起作用,并且改動(dòng)不大的話(huà),可以考慮簡(jiǎn)單地編輯一下/etc/rc.d/rc.local腳本。這個(gè)命令腳本程序是在引導過(guò)程的最后一步被執行的。

● 如果所做的修改比較細致,或者還要求關(guān)閉進(jìn)程使之明確地停止運行,則需要在/etc/rc.d/init.d子目錄中添加一個(gè)命令腳本程序。這個(gè)命令腳本程序必須可以接受Start和Stop參數并完成相應的操作。

第一種方法,編輯/etc/rc.d/rc.local腳本,當然是兩種方法中比較簡(jiǎn)單的。如果想在這個(gè)命令腳本程序中添加內容,只需要使用喜歡的編輯器程序打開(kāi)它,再把打算執行的命令附加到文件的末尾就可以了。這對一兩行的修改來(lái)說(shuō)的確很便利。

如果確實(shí)需要使用一個(gè)命令腳本程序,這時(shí)必須選擇第二個(gè)方法。編寫(xiě)一個(gè)rc命令腳本程序的過(guò)程并不像想象中那么困難。我們下面就給出一個(gè)例子,看看它是怎樣實(shí)現的(順便說(shuō)一句,你可以把我們的例子當作范本,按照自己的需要進(jìn)行修改和添加)。

假設你打算每隔60分鐘調用一個(gè)特殊的程序來(lái)彈出一條消息,提醒自己需要從鍵盤(pán)前面離開(kāi)休息一會(huì )兒,命令腳本程序將包括下面幾個(gè)部分:

● 關(guān)于這個(gè)命令腳本程序功能的說(shuō)明(這樣就不會(huì )在一年之后忘記它);

● 在試圖運行它之前驗證這個(gè)命令腳本程序確實(shí)存在;

● 接受start和stop參數并執行要求的動(dòng)作。

參數給定后,我們就可以編寫(xiě)命令的腳本程序。這個(gè)程序很簡(jiǎn)單,大家可以自己編寫(xiě)一下,我在這里就不給出了。

編寫(xiě)好新的命令腳本程序之后,再從相關(guān)的運行級別子目錄中加上必要的符號鏈接,來(lái)控制這個(gè)命令腳本程序的啟動(dòng)或者停止。在我的印象中,只想讓它在運行級別 3或者運行級別5中啟動(dòng),原因是我認為只有這兩個(gè)運行級別才是日常工作的地方。最后,希望這個(gè)命令腳本程序在進(jìn)入運行級別6(重啟動(dòng))的時(shí)候被關(guān)閉。


激活或者禁止服務(wù)項目


有的時(shí)候會(huì )發(fā)現,在引導的時(shí)候并不需要某個(gè)特定的服務(wù)被啟動(dòng)。如果你正在考慮使用Linux替換Windows NT的文件和打印服務(wù)器,就更是如此。

我們已經(jīng)知道,在特定的運行級別子目錄中給符號鏈接改個(gè)名稱(chēng),就可以讓該服務(wù)不被啟動(dòng),如把其名稱(chēng)的第一個(gè)字母由S改為K。一旦熟練掌握了命令行和符號鏈接,就會(huì )發(fā)現這是激活或者禁止服務(wù)的最快辦法。

在學(xué)習這個(gè)改名方法的時(shí)候,可能會(huì )覺(jué)得圖形化的操作界面ksysv比較容易掌握。雖然它原來(lái)是設計使用在KDE環(huán)境里的,但在Red Hat Linux 7.2下缺省安裝的GNOME環(huán)境里也運行得很好。如果想啟動(dòng)它,只需簡(jiǎn)單地打開(kāi)一個(gè)xterm窗口,并輸入ksysv命令就可以了。屏幕上會(huì )出現一個(gè)窗口,其中列出了能夠修改的全部參數,需要時(shí)還包括在線(xiàn)幫助。

警告:如果是在一個(gè)現實(shí)中的系統上學(xué)習本文的知識,要多多運用常識。當試著(zhù)對啟動(dòng)腳本程序進(jìn)行修改的時(shí)候,要記住所做的修改可能會(huì )造成你的系統不能正常工作,而且無(wú)法采用重啟動(dòng)的方法恢復。不要在正常運轉的系統上實(shí)驗新的設置,對你準備修改的文件要全部進(jìn)行備份。最重要的是,在手邊要準備一張引導盤(pán)以防不測。
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


關(guān)鍵詞: linux

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>