Linux系統是十分優秀的作業系統,但啟動時間長是該系統的缺點之一。那麼能否通過一些設定來縮短Linux系統的啟動時間呢?當然可以。本文將向讀者展示如何在不犧牲Linux系統可用性的前提下,縮短系統的啟動時間。要實現這一目標,需要瞭解系統的各類服務及它們之間的從屬關係,進而使它們在條件允許的前提下同時啟動,從而大大節省系統啟動時間。
準備工作
如果想採用本文介紹的方法對Linux系統進行設定,首先要熟悉Linux系統的設定語言。對系統的啟動過程進行設定是一項比較危險的行為,容易造成系統無法啟動。一旦發生這種情況,最好重新啟動系統後選擇單一使用者模式,將系統還原並重啟。當然,最重要的是在設定前備份重要資料。
其次,建議使用者最好在對本機系統進行修改前,先進行修改測試。如果使用者只有一台電腦,那麼這裡建議使用使用者模式Linux系統UML)進行測試。UML是一個核心補丁,它可以將Linux系統的核心轉譯成為二進位,以便使用者可以像使用普通軟體那樣運行Linux系統。一旦出現意外情況,損失的只是UML,而原系統卻可安然無恙。
Linux系統的啟動順序和runlevel
Linux系統的啟動包括多個步驟,這裡主要介紹一下核心載入後的系統啟動步驟。使用者可以通過運行/sbin/runlevel命令來查看系統目前的runlevel。runlevel是Linux系統用來區別系統進階啟動設定類型的數字。這些數字十分常見,它們中的絕大多數都有著明確的含義。以Red Hat Linux系統為例,它的runlevel主要有以下幾種見表1):
表1
init如何初始化系統
init可以通過一個ASCⅡ設定檔案得知如何改變系統的runlevel。通常情況下該設定檔案可以指引init來執行/etc/rc.d/rc命令,從而獲得runlevel的相關資訊。
系統服務
使用者所需要的各種系統服務都是由rc指令程式來啟動的。系統潛在的服務紛繁複雜。大多數Linux系統通常只提供sshd(SecureShell服務)、syslog(系統日誌工具)和lpd(列印服務)等功能。
使用者可以從/etc/rc.d/目錄?姓業剿械姆瘛H綣蚩飧瞿柯跡岱⑾中磯嚳裰皇且恢滯飪淺絛潁皇且計淥絛蚶賜瓿曬ぷ鼇R殘磧腥嘶崳剩瑀c程式是如何知道每個runlevel要運行哪些程式呢?答案是在/etc/rc.d/目錄下面與init.d/目錄並列的還有一些目錄,它們各自對應著自己的runlevel。它們的名稱為rc*.d/,例如runlevel 5就是/etc/rc.d/rc5.d/。每個rc*.d/目錄中包含著兩個符號連結,這些連結可以串連到/etc/init.d/目錄中的指定服務程式。
動手改造
務的啟動和終止
如果使用者決定要啟動Linux系統並進入圖形模式runlevel 5),那麼當init引導rc指令程式運行並將runlevel的級數告知它時,rc指令程式將對/etc/rc.d/rc5.d/進行查看,接著它將執行從該目錄中找到所有連結。rc指令程式執行連結的過程可分為兩部分,首先它將執行所有名稱以“K”打頭的連結,將“stop”參數傳遞給它們,並停止這些連結指向的所有服務。這些服務停止後,rc指令程式將執行所有名稱以“S”打頭的連結,並將“start”參數傳遞給它們,啟動這些連結所指向的服務。
另外,rc指令程式可以根據連結名稱的兩個十進位數,確定連結的執行順序,數字小的先執行。
下面將舉一個例子,協助使用者加深理解。當使用者啟動系統進入runlevel 5時,首先要執行的連結是K05saslauthd,由於它是以“K”打頭的,而且後兩位十進位數要小於其它以“K”打頭的連結。第一個要執行的啟動連結是S05kudzu。最後執行的將是S99local。下面是runlevel 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 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 16 Jan 1 2000 S12syslog -> ../init.d/syslog
-
- lrwxrwxrwx 1 root root 17 Jan 1 2000 S13portmap -> ../init.d/portmap
-
- lrwxrwxrwx 1 root root 17 Jan 1 2000 S14nfslock -> ../init.d/nfslock
-
- lrwxrwxrwx 1 root root 18 Jan 1 2000 S17keytable -> ../init.d/keytable
-
- lrwxrwxrwx 1 root root 16 Jan 1 2000 S20random -> ../init.d/random
-
- lrwxrwxrwx 1 root root 16 Jun 21 08:52 S24pcmcia -> ../init.d/pcmcia
-
- lrwxrwxrwx 1 root root 15 Jan 1 2000 S25netfs -> ../init.d/netfs
-
- lrwxrwxrwx 1 root root 14 Jan 1 2000 S26apmd -> ../init.d/apmd
-
- lrwxrwxrwx 1 root root 16 Jan 1 2000 S28autofs -> ../init.d/autofs
-
- lrwxrwxrwx 1 root root 14 Jan 1 2000 S55sshd -> ../init.d/sshd
-
- lrwxrwxrwx 1 root root 20 Jan 1 2000 S56rawdevices -> ../init.d/rawdevices
-
- lrwxrwxrwx 1 root root 16 Jan 1 2000 S56xinetd -> ../init.d/xinetd
-
- lrwxrwxrwx 1 root root 14 Feb 1 2003 S58ntpd -> ../init.d/ntpd
-
- lrwxrwxrwx 1 root root 13 Jun 21 10:42 S60afs -> ../init.d/afs
-
- ……
-
- lrwxrwxrwx 1 root root 18 Jan 1 2000 S80sendmail -> ../init.d/sendmail
-
- lrwxrwxrwx 1 root root 13 Jan 1 2000 S85gpm -> ../init.d/gpm
-
- lrwxrwxrwx 1 root root 15 Mar 22 08:24 S85httpd -> ../init.d/httpd
-
- ……
-
- lrwxrwxrwx 1 root root 14 Jul 15 09:29 S98wine -> ../init.d/wine
-
- lrwxrwxrwx 1 root root 13 Feb 8 17:26 S99db2 -> ../init.d/db2
-
- lrwxrwxrwx 1 root root 11 Jun 21 08:52 S99local -> ../rc.local
-
如果使用者想暫時終止某一runlevel的一項服務,只要刪除相對應的連結就行了。然而,對連結進行手動設定是一項繁重而又易錯的工作,但有一個十分有用的幫手,它的名字叫chkconfig。