加快Linux的引導(轉)

BSDLite發表於2007-08-11
加快Linux的引導(轉)[@more@]  毫無疑問 Linux 是一個優秀的系統,但仍然無法擺脫一個常見的責難(尤其是來自具有 Microsoft Windows 背景的人),那就是 Linux 系統從按下“on”鍵開始到可以使用,需要的時間太長。其實他們說的沒錯,Linux 確實需要比較長的引導時間。
  
  在這裡我所描述的加快 Linux 引導速度的技術雖然理解起來很簡單,但真正實現卻需要謹慎行事。我希望 Linux 的發行商能採用這種方法,這樣使用者就可以省去那些配置任務。不過如果您喜歡冒險,請繼續閱讀本文。
  
  寫在開始之前
  如果您想體驗一下這種方法,您首先必須得熟悉 Linux 的配置指令碼。修改系統的啟動設定可能會帶來危險,甚至可能會導致您的系統無法啟動。如果出現這種情況,請重新啟動機器並進入單一使用者模式(執行級1),把您所做的修改還原回來,然後再重新啟動。永遠記住要備份您所修改過的所有檔案,為了防止最壞的情況發生,您還需要有至少一個系統備份的映像。
  
  我強烈建議您在考慮用我所建議的方法修改一個正式的系統之前,先去修改一個無關緊要的測試系統。如果您只有一臺機器,那麼您可以使用 UML (User Mode Linux) 這一非常有用的工具。UML是一個核心補丁,它可以將Linux核心編譯成為一個二進位制檔案,然後您可以像執行一個普通的程式一樣去執行這個核心。也就是說,您可以在您的正常的系統之上以一個程式的方式來執行一個完整的 Linux 系統。您可以將其想象為在一個正常的系統中執行一個 Linux 系統。(請參閱本文末尾的參考資料,可以找到可以下載UML的站點以及 developerWorks 網站上關於UML的教程)。
  
  使用UML您可以工作於一個測試系統,哪怕把這個測試系統完全破壞掉,也不會影響您正常的系統。
  
  概述
  本文的第一部分介紹當 Linux 核心(Linux 機器的的“核心”)載入後,一個 Linux 系統怎樣在後臺啟動。然後介紹加快您的系統引導速度的技術。
  
  如果您對執行級和服務啟動指令碼已經熟悉,您可能希望直接跳轉到傳統服務框架的侷限。
  
  Linux 引導次序和執行級
  
  一個 Linux 系統的引導過程可以分為幾個階段。本文並不會解釋所有的不同階段,因為我們所關心只是當核心載入後的那一個階段。
  
  您可以執行 /sbin/runlevel 命令來確定您的系統當前的執行級。(更多詳細資訊請查閱 man runlevel)。
  
  當核心被載入並開始執行時會呼叫 /sbin/init 程式。這個程式以 root 身份執行,並且在開始引導時按照要求設定為“執行級”。(更多關於 init 程式的詳細資訊,請參考 man init)
  
  什麼是執行級?
  
  一個執行級僅僅是一個數字,Linux根據這個數字來區分不同型別的高層次配置,系統將按照不同的高層次配置來進行引導。由於絕大部分執行級數字都定義了明確的含義,因而它們基本上是“眾所周知”的。Red Hat Linux 系統的主要執行級見表1。
  
  表 1. Red Hat Linux執行級
  
  執行級 說明
  0 關閉
  1 單一使用者模式(一般僅用於管理目的)
  2 多使用者模式,不允許使用網路
  3 多使用者模式,允許使用網路
  4 沒有用到的執行級
  5 多使用者模式,允許使用網路,X-Windows 方式(圖形登入介面)
  6 重新引導
  
  init如何初始化系統
  
  init 透過一個ASCII配置檔案(/etc/inittab)來確定如何改變執行級。通常,init 會根據這個配置檔案去執行 /etc/rc.d/rc 指令碼,並將執行級數字傳遞給這一指令碼。
  
  rc.sysinit 指令碼
  
  在 Red Hat 系統中,在執行 rc 指令碼之前,init 將首先執行 /etc/rc.d/rc.sysinit 指令碼,這個指令碼執行那些必需的底層設定任務,比如設定系統時鐘,檢查磁碟錯誤,然後掛載檔案系統。
  
  在本文看來,正是從執行 rc 指令碼開始,事情才變得有趣。
  
  系統服務
  
  rc 指令碼負責啟動使用者需要的所有服務。就像名字所描述的一樣,所謂服務就是系統提供的有用的工具。可能會有很多服務需要啟動。大部分的 Linux 系統會啟動 sshd(安全Shell服務)、syslog(系統日誌工具)和 lpd(列印服務),但還會有更多的服務需要啟動。比如,我的 Red Hat 9 系統現在執行著29個服務,但如果我把所有的服務都啟動,那麼我的系統中將會有近50服務在執行。
  
  還有一點很重要,我們應該明白有的服務可能只能由特定的執行級來啟動。比如,除了執行級5(多使用者圖形方式)以外,幾乎不會啟動某種形式的圖形服務,因為其它所有的執行級都是非圖形方式的。接下來我們將深入討論這一問題。
  
  服務程式在哪裡?
  
  可選的服務程式目錄
  
  在一些 Linux 系統中,服務程式有時候是在 /etc/init.d 目錄下。
  
  通常在 /etc/rc.d/init.d/ 目錄下可以找到服務程式。
  
  如果你瀏覽一下這個目錄,你就會發現相當多的(如果不是全部都是的話)服務程式實際上都是 shell 指令碼,用於呼叫其他程式完成實際的工作。
  
  rc 指令碼如何知道在每個執行級下去執行哪些指令碼?
  回顧一下,如果我們不希望在某個執行級下執行某個指令碼,我們如何告訴系統這樣去做?答案是在 /etc/rc.d/ 目錄下,在這個目錄下,除了我們已經討論過的 init.d/ 目錄以外,還有一組目錄,每一個目錄對應一個執行級。這些目錄以 rc.d 的形式來命名,比如,對應執行級5的目錄為 /etc/rc.d/rc5.d/ 。在這些rc.d目錄中,每一個目錄下都有一組符號連結,指向 /etc/rc.d/init.d 中的真正的服務程式。實際上,後邊我們會發現,每個服務事實上有兩個符號連結。
  
  服務連結名
  
  這些指向實際服務程式的符號連結的名字很重要,它們遵循嚴格的命名約定,這樣 rc 指令碼就知道如何處理它們。
  
  為了便於標識,每個連結的名字都以它們所指向的服務的名字做為字尾。
  
  字首由兩部分構成:一個大寫字母,緊跟著是一個兩位的十進位制數。字首中的大寫字母是“S”(表示“啟動”),或者“K”(表示“殺死”,或者停止)。兩位數的大小範圍是自00到99。
  
  服務連結名正規表示式
  
  符號連結的名字可以用 egrep 正規表示式來描述,[SK][0-9]{2}[a-zA-Z]+。(更多詳細資訊請參閱 man egrep)。
  
  啟動和停止服務
  
  如果我們決定讓 Linux 機器引導到圖形模式(執行級5),當 init 呼叫 rc 指令碼並傳遞給它執行級數字時,rc 指令碼將到 /etc/rc.d/rc5.d/ 中查詢,並且去執行它所能找到的所有符號連結(也就是說,它將執行每個連結指向的程式/指令碼)。它將在兩個截然不同的階段來執行這些連結;首先它會執行所有以“K”開頭的連結,同時傳遞給它們引數“stop”。執行完以後,所有這些連結指向的服務都被停止。
  
  當 rc 指令碼把所有需要停止的服務都停止後,它將去執行所有以“S”開頭的連結,同時傳遞給它們引數“start”。執行完以後,所以這些連結指向的服務都被啟動。rc 指令碼也把引數“start”傳遞給每一個程式。
  
  rc 把引數“tart”或者“stop”傳遞給每一個服務程式,這樣做是為了只用一個服務程式可以啟動或停止那個服務——服務程式根據傳遞給它的引數值分辨系統是正在引導還是正在關閉。
  
  有一個重要的方面我還沒有解釋——連結名的數字部分。在“S”或者“K”之後的兩位十進位制數是 rc 指令碼用來確定啟動連結(就是連結指向的服務)的順序的。數字較小(比如00,01,等等)的連結在數字較大(99是最大的)連結之前執行。我們會在本文後邊的內容中再次提到這一重點問題。
  
  現在還迷惑嗎?清單1列出了執行級5對應目錄下的所有連結。當引導到執行級5的時候,最先被執行的連結將是 K05saslauthd,因為它以“K”開頭,並且在所有的以“K”開頭的連結中兩位十進位制數是最小。最先被執行的啟動連結將是 S05kudzu,因為它以“S”開頭,並且在所有以“S”開頭的連結中兩位十進位制數是最小的。最後一個執行的連結將是 S99local。
  清單 1. 執行級5的指向服務程式的連結
  
  
QUOTE:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-946544/,如需轉載,請註明出處,否則將追究法律責任。

加快Linux的引導(轉)
請登入後發表評論 登入
全部評論

相關文章