LINUX開機內幕

來源:互聯網
上載者:User

由於作業系統正在變得越來越複雜,所以開機引導和關機下電的過程也越來越智能化。從簡單的DOS系統轉移到Windows NT系統,人們已經親身感受到了這些變化——這已不僅僅是核心作業系統的啟動引導和關閉了,還包括必須要同時啟動或者關閉相當數量的服務項目。類似於Windows NT,Linux系統啟動過程需要開啟的服務項目也是數量極大的。

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

載入核心

LILO啟動之後,如果你選擇了Linux作為準備引導的作業系統,第一個被載入的東西就是核心。請記住此時的電腦記憶體中還不存在任何作業系統,PC(因為它們天然的設計缺陷)也還沒有辦法存取機器上全部的記憶體。因此,核心就必須完整地載入到可用RAM的第一個MB之內。為了實現這個目的,核心是被壓縮了的。這個檔案的頭部包含著必要的代碼,先設定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配置網路設定,S55named啟動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 Hat Linux 7.2下預設安裝的GNOME環境裡也運行得很好。如果想啟動它,只需簡單地開啟一個xterm視窗,並輸入ksysv命令就可以了。螢幕上會出現一個視窗,其中列出了能夠修改的全部參數,需要時還包括線上協助。

警告:如果是在一個現實中的系統上學習本文的知識,要多多運用常識。當試著對啟動指令碼程式進行修改的時候,要記住所做的修改可能會造成你的系統不能正常工作,而且無法採用重啟動的方法恢複。不要在正常運轉的系統上實驗新的設定,對你準備修改的檔案要全部進行備份。最重要的是,在手邊要準備一張引導盤以防不測。

 

附:我對rc啟動的一些理解

1. sbin/init 啟動時讀取/etc/inittab,裝入rc的runlevel

    並執行/etc/rc.d/rc.sysinit

2. 執行rc runlevel,來裝載 /etc/rc.d/rcX.d/S* K*

    這裡S*和K*都是init.d下的符號連結

3. 最後S99local連結到/etc/rc.d/rclocal,並執行

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.