歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> 更多Linux >> 加快Linux的引導

加快Linux的引導

日期:2017/2/27 14:31:57   编辑:更多Linux
  毫無疑問 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的指向服務程序的鏈接    # cd /etc/rc.d/rc5.d  # ls -al  total 8  drwxr-xr-x 2 root root 4096 Jul 15 09:29 .  drwxr-xr-x 10 root root 4096 Jun 21 08:52 ..  lrwxrwxrwx 1 root root 19 Jan 1 2000 K05saslauthd -> ../init.d/saslauthd  lrwxrwxrwx 1 root root 20 Feb 1 2003 K15postgresql -> ../init.d/postgresql  lrwxrwxrwx 1 root root 13 Jan 1 2000 K20nfs -> ../init.d/nfs  lrwxrwxrwx 1 root root 14 Jan 1 2000 K24irda -> ../init.d/irda  lrwxrwxrwx 1 root root 17 Jan 1 2000 K35winbind -> ../init.d/winbind  lrwxrwxrwx 1 root root 15 Jan 1 2000 K50snmpd -> ../init.d/snmpd  lrwxrwxrwx 1 root root 19 Jan 1 2000 K50snmptrapd -> ../init.d/snmptrapd  lrwxrwxrwx 1 root root 16 Jun 21 09:43 K50vsFTPd -> ../init.d/vsftpd  lrwxrwxrwx 1 root root 16 Jun 21 08:57 K73ypbind -> ../init.d/ypbind  lrwxrwxrwx 1 root root 14 Jun 21 08:54 K74nscd -> ../init.d/nscd  lrwxrwxrwx 1 root root 18 Feb 8 11:15 K92iptables -> ../init.d/iptables  lrwxrwxrwx 1 root root 19 Feb 1 2003 K95firstboot -> ../init.d/firstboot  lrwxrwxrwx 1 root root 15 Jan 1 2000 S05kudzu -> ../init.d/kudzu  lrwxrwxrwx 1 root root 14 Jun 21 08:55 S09isdn -> ../init.d/isdn  lrwxrwxrwx 1 root root 17 Jan 1 2000 S10network -> ../init.d/network  lrwxrwxrwx 1 root root




Copyright © Linux教程網 All Rights Reserved