You are on page 1of 50

第4章

系統啟動流程

這一章,純粹為您介紹一些理論。本章將要為您介紹,從打開電源到使用者可以登入
系統這段期間,Red Hat Enterprise Linux 與 Fedora Core Linux 到底作了哪些事情。有
了本章的基礎,您就可以:

• 輕鬆的瞭解 Linux 系統正在執行什麼工作


• 協助您解決啟動過程中所發生的錯誤
• 更清楚瞭解 Linux 初始化的過程
• 改造您的 Linux

因為上述的原因,我才在本書中特別安排這個章節,為您詳細介紹 Red Hat Enterprise


Linux 與 Fedora Core Linux 啟動過程中的每一個細節。

4.1 主要的啟動流程
從打開電腦的電源,開始啟動 Red Hat Enterprise Linux 或 Fedora Core Linux 系統,到
使用者可以登入為止,共歷經了以下幾個階段:

1
Linux 系統管理寶典

主要階段

開始 初始化 BIOS 執行啟動載入器 載入核心 啟動 init 服務

rc.sysinit

初始化系統環境
rc

rc.local

建立使用環境

完成

圖 4.1. Linux 啟動流程圖

• 初始化 BIOS
• 執行啟動載入器
• 載入核心
• 啟動 init 服務

在上述幾個階段裡,電腦會去執行一些工作,以便產生 Linux 執行的環境。以下將詳


細為您介紹上述的四大階段中,Linux 到底作了哪些事情。

4.1.1 BIOS
當您一打開電腦的電源,電腦會先去啟動 BIOS。BIOS 啟動後,會去執行以下的工
作:

2
第 4 章 系統啟動流程

• 偵測所有周邊設備:首先,BIOS 會先去偵測所有的周邊設備,像是電腦安裝了哪
一種顯示卡、記憶體的數量、安裝了哪些磁碟、...等等。BIOS 偵測周邊設備的目
的,是未來可以把周邊設備的資訊提供給作業系統使用。

• 尋找啟動磁碟:接著,BIOS 會依據其中的設定,去尋找啟動磁碟 (Boot Disk)。


BIOS 如何找出啟動磁碟呢?? 通常 BIOS 是根據 BIOS 裝置啟動順序的設定,來決
定何者為啟動磁碟。例如:您在 BIOS 中定義,依照 CDROM、Floppy、IDE HDD、
USB Disk 的順序來啟動電腦,那麼 BIOS 就會試著先拿 CD-ROM 作為啟動磁碟;
如果 CD-ROM 無法啟動,BIOS 會以 Floppy 當作啟動磁碟;...依此類推。

4.1.2 啟動載入器
BIOS 找到啟動磁碟後,接下來就是要啟動磁碟中的作業系統。BIOS 會試著依照下面
的順序找出啟動磁區 (Boot Sector),並執行位於啟動磁區前 446 個位元組空間中的作
業系統:

1. 先試著尋找硬碟的第一個磁區,也就是主要啟動紀錄 (MBR, Master Boot Record)


磁區

2. 如果主要啟動磁區中沒有儲存作業系統,再尋找磁碟中標註為啟動分割區 (Boot
Partition) 之分割區的第一個磁區中的作業系統

不管是主要啟動紀錄磁區,或者是啟動分割區中的第一個磁區,儲存作業系統的空間
都只有 446 個位元組。但很遺憾的,目前作業系統都無法濃縮到可以擠在 446 個位元
組的磁區裡。如果沒有辦法在上面提到的磁區中儲存作業系統的核心,那麼,就會造
成 BIOS 無法繼續啟動的工作。

3
Linux 系統管理寶典

也許您會想,那為什麼不修改 BIOS 的規格,讓 BIOS 可以從其他磁區讀入作業系統


的核心,這樣不就可以徹底解決這個問題?? 是的,這的確是治本的方法,但問題時,
這樣會造成採用舊規格的 BIOS 無法支援新的規格,最後會無法開機!!

為了避免去重新制訂 BIOS 的規格,又能讓 BIOS 可以順利啟動儲存於其他位置的作


業系統核心,人類想出一個辦法:那就是寫一個小小的程式,儲存到啟動磁區的前
446 個位元組空間內。當 BIOS 試著要去啟動啟動磁區的作業系統時,就可以執行到
這個小程式;然後再由這個小程式,來載入儲存到其他位置的作業系統!! 如此一來,
就可以不用改變 BIOS 的啟動規則,又可以順利啟動各種的作業系統,一舉雙得!!

這個小程式就是啟動載入器 (Boot Loader)。圖 4.2 "GRUB 啟動載入器執行畫面" 就是


我的 Linux 執行 GRUB 這個啟動載入器時的畫面。

圖 4.2. GRUB 啟動載入器執行畫面

4
第 4 章 系統啟動流程

4.1.3 啟動核心
當 BIOS 順利的執行啟動載入器後,啟動載入器會去尋找儲存於其他磁區中的作業系
統,然後啟動這個作業系統。

如果啟動的是 Linux 作業系統,那麼啟動載入器可以在啟動 Linux 核心時,傳遞一些


參數給 Linux 核心,以便讓 Linux 核心能夠改變啟動方式,或者取得啟動時重要的資
訊。像是開機後要進入的 Runlevel、磁碟的順序、靜態驅動程式的參數、…等等。這
些傳遞給 Linux 核心的參數,我們稱為核心啟動參數 (Kernel Boot Parameter)。

圖 4.3. Linux 啟動核心的畫面

Linux 核心啟動後,會執行下面幾項工作:

偵測所有硬體設備

Linux 核心首先會向 BIOS 查詢電腦的所有硬體設備的資訊,然後自己接手下來管理


這些硬體設備,以便提供給 Linux 系統使用。

5
Linux 系統管理寶典

驅動硬體設備

接著 Linux 核心便會試著去驅動電腦的硬體設備。

要驅動硬體設備,Linux 就必須要載入硬體的驅動程式。Linux 的驅動程式可分為編譯


在核心影像檔中的靜態驅動程式 (Static Driver),與核心模組 (Kernel Module) 的動態驅
動程式 (Dynamic Driver) 兩種。其中的核心模組,全部都儲存在檔案系統上。

由於此時 Linux 系統尚未掛載任何檔案系統,因而無法使用儲存於檔案系統上的核心


模組,Linux 自然藉由這些動態驅動程式來驅動硬體設備!! 因此啟動 Linux 核心的階
段只會使用靜態驅動程式驅動必要33的硬體設備。

那其他那些核心影像檔中沒有提供驅動程式的硬體設備怎麼辦?? 不用著急,Linux 會
等到掛載根目錄檔案系統後,再逐一試著安裝尚未驅動的裝置之驅動程式。

以唯讀的方式掛載根檔案系統

接著 Linux 核心會試著去掛載根檔案系統 (Root File System)。

什麼是 "根檔案系統" 呢?? 所謂的根檔案系統,就是儲存根目錄資料的檔案系統,有


時又稱為根裝置 (Root Device)。根檔案系統上需提供哪些東西呢?? Linux 對於根檔案
系統的內容,規定至少需包含下面幾個目錄:

• /etc/:儲存著重要的設定檔

• /bin/:儲存著常用且開機時必須用到的執行檔

• /sbin/:這個目錄儲存著開機過程中所需的系統執行檔

33
"必要",指的是靜態驅動程式可以驅動的硬體設備。

6
第 4 章 系統啟動流程

• /lib/:儲存著 /bin/ 與 /sbin/ 之執行檔所需的程式庫,以及 Linux 核心模組

• /dev/:儲存著裝置檔案

由於這五個目錄儲存著開機所需的各項工具、設定檔、程式庫,所以這五個目錄必須
儲存在 Linux 的根檔案系統上。如果這五個目錄不在根檔案系統上,會造成 Linux 開
機過程會失敗,而無法順利的啟動 Linux。除了這五個目錄外,其他的目錄,像是
/usr/、/var/、/home/、/tmp/、...等等,都可以儲存在其他的檔案系統中。

再次提醒您,/etc/、/bin/、/sbin/、/lib/、/dev/ 五大目錄必須儲
存在根檔案系統上,缺一不可。

掛載根檔案系統的目的是為了:

• 安裝適當的核心模組,以便驅動某些硬體裝置或啟用某些功能
• 啟動儲存於根檔案系統中的 init 服務,以便讓 init 服務接手後續的啟動工作

要特別注意的,此時掛載根檔案系統是採用唯讀 (Read-Only) 的方式進行掛載的,也


就是說,到目前為止 Linux 核心只能讀取根檔案系統,無法變更其中的內容的。

為什麼要這樣呢?? 主要的原因是此時 Linux 核心仍在啟動階段,可能還不是很穩定;


如果使用可讀可寫 (Read-Write) 的方式掛載根檔案系統,萬一 Linux 不小心當機 (Crash)
了,一來可能會破壞根檔案系統上的資料;再者 Linux 下次開機得花上很長的時間,
來檢查並修復根檔案系統。為了避免這些問題發生,Linux 系統會以唯讀的方式來掛
載根檔案系統。

也許您會好奇:Linux 核心怎麼知道根檔案系統是哪一個呢??

7
Linux 系統管理寶典

我曾經提過:啟動載入器在啟動 Linux 核心時,可以傳遞一些核心啟動參數給 Linux


核心,藉以來改變啟動的方式或取得啟動的重要資訊。Linux 核心就是根據一個名為
root 的核心啟動參數,來決定何者是根檔案系統。例如在我的啟動載入器中有以下
的設定值:
ro root=LABEL=/

此處的 ro 就是用來告訴 Linux 核心,以唯讀的方式掛載根檔案系統;而 root=LAB


EL=/ 就是用來告訴 Linux,以標籤名稱 (Label Name) 為 / 的檔案系統作為根檔案系
統。

啟動 init 服務

Linux 核心啟動後最後一個動作,就是從根檔案系統上找出 init 服務,並且執行 i


nit 服務。Linux 核心會依照下列的順序,尋找 init 服務:

1. 先找 /sbin/ 是否有 init 服務

2. /etc/init

3. /bin/init

4. 如果都找不到,最後就執行 /bin/sh

這個過程中,只有某一個步驟找到 init,Linux 核心就會去執行該目錄中的 init。


如果到最後核心還是找不到 init 服務,Linux 核心就會顯示 "Kernel panic - n
ot syncing: Attempted to kill init!" 的錯誤訊息 (如 圖 4.4 "無法啟動 i
nit 服務之當機畫面"),然後中止啟動工作,Linux 核心再悄悄的死去。此時您必須
自行按下電腦的 "重置 (Reset)" 按鈕,才能重新啟動 Linux。

8
第 4 章 系統啟動流程

圖 4.4. 無法啟動 init 服務之當機畫面

找到 init 服務後,Linux 就會讓 init 服務負責後續初始化系統使用環境的工作。

4.1.4 執行 init 服務
啟動 init 服務的目的,是讓 init 服務來初始化 Linux 的系統環境。init 開始啟動
後,就代表 Linux 已經順利的啟動了 Linux 的核心,接著就由 init 服務來建立 Linux
的使用環境;整個系統啟動工作,就進入到另外一個階段 — 初始化系統環境。

也許您會質疑:Linux 系統把啟動過程分兩個階段 (核心與 init 服務),為


什麼不乾脆全部讓 Linux 核心來完成就好??

我想,會這樣設計的主要的原因不外乎:

• 讓核心更精簡:如果把建立使用環境的工作寫在 Linux 核心,那,Linux


核心可能會非常肥大!!

9
Linux 系統管理寶典

由於 Linux 核心是啟動 Linux 後,由啟動載入器載入到記憶體中。如果核


心很大,就會佔用更多的記憶體空間,也會降低系統執行效能。

再者,初始化系統環境的工作,只需要在啟動 Linux 時執行,而且只會


執行一次,系統啟動後就不需要執行。因此把初始化系統環境的工作,
寫在 Linux 核心,這樣也不符合經濟效益。

• 可以讓啟動過程更彈性:不同的使用者,或者不同的 Linux 發行套件


(Distribution) 廠商,可能需要在啟動 Linux 過程執行不同的工作。

如果把初始化系統環境的工作,寫在 Linux 核心裡,那若有人希望變更


啟動過程中執行的工作內容,那就得重新改寫 Linux 的核心源碼,還得
再編譯一次核心!! 這是一件非常麻煩的事情。

為了讓使用者可以彈性的修改啟動流程,所以 Linux 把啟動系統環境的


工作,交給 init 服務來執行。

4.2 初始化系統環境
啟動 init 服務時,init 服務會讀取 /etc/inittab 檔案,根據 /etc/inittab
中的設定資料34,進行初始化系統環境的工作。/etc/inittab 定義 init 服務在
Linux 啟動過程中必須依序執行下面幾個 Script:

• /etc/rc.d/rc.sysinit
• /etc/rc.d/rc

34
當然,您也可以自行修改 /etc/inittab 中的設定,關於如何設定 inittab,請參閱 4.4, "管理 i
nit 服務"。

10
第 4 章 系統啟動流程

• /etc/rc.d/rc.local

由於這些 Script 檔名都是 rc 開頭命名,習慣上我們稱這些 Script 為 "RC Script"。每


一個 RC Script 負責的工作都不一樣,讓我用一點時間為您深入介紹每一個 RC Script
執行哪些工作。

4.2.1 /etc/rc.d/rc.sysinit
/etc/rc.d/rc.sysinit 主要的功能用來建置系統的基本環境。當 init 服務執行
rc.sysinit 時 (如圖 4.5 "Linux 執行 rc.sysinit 的畫面"),會執行下面幾項工
作:

圖 4.5. Linux 執行 rc.sysinit 的畫面

啟動 udev 與 SELinux 子系統


udev 負責產生 /dev/ 中的所有裝置檔案,而 SELinux 則負責增強 Linux 系統的
安全性。rc.sysinit 執行時,會先去啟動這兩個子系統,才能去進行其他的初
始化系統環境的工作。

11
Linux 系統管理寶典

設定核心參數
rc.sysinit 會執行 sysctl -p,以便從 /etc/sysctl.conf 設定 Linux 的
核心參數 (Kernel Parameter)。

設定系統時間
rc.sysinit 會將硬體時間,設定成為 Linux 的系統時間。

載入鍵盤對應表
為了能讓您可以使用各式各樣的鍵盤,rc.sysinit 也會去載入鍵盤對應表,以
便讓您可以正確的輸入文字、符號。

啟用置換記憶體空間
rc.sysinit 會執行 swapon -a -e 指令,以便根據 /etc/fstab 的設定,啟
用所有的置換記憶體空間。至於置換記憶體的介紹,請參閱 3.5, "置換記憶體的
管理"。

設定主機名稱
rc.sysinit 會根據 /etc/sysconfig/network 的 HOSTNAME 參數,設定
Linux 的主機名稱。

檢查並掛載所有檔案系統
rc.sysinit 會去檢查所有需要掛載的檔案系統,以確保這些檔案系統的完整
性。檢查完畢後,rc.sysinit 就會去掛載所有檔案系統,並且變更根檔案系統
(Root Filesystem) 的掛載參數成為可讀可寫 (Read-Write),以便讓我們可以在根檔
案系統上寫入資料。

初始化硬體設備
Linux 除了在啟動核心時,會以靜態驅動程式 (Static Driver) 驅動部分的硬體外,
在執行 rc.sysinit 時,也會試著驅動剩餘的硬體設備。rc.sysinit 驅動的
硬體設備包含:

12
第 4 章 系統啟動流程

• 定義在 /etc/modprobe.conf 的模組

• ISA PnP 的硬體設備

• USB 設備

啟用軟體磁碟陣列與 LVM
rc.sysinit 也會去啟用所有的軟體磁碟陣列,以及 LVM 的磁碟設備。

如有必要,卸載 /initrd/
/initrd/ 用來掛載核心的初始化記憶體磁碟 (initrd, Initial RAM Disk) 的資料,
Linux 可以透過初始化記憶體磁碟來載入必要的驅動程式,這樣才能讓 Linux 能在
開機前先驅動所需的設備,進而順利進行啟動的工作。

因為初始化記憶體磁碟只有在啟動前有用,當 Linux 進入到 rc.sysinit 這個階


段時,初始化記憶體磁碟已經沒有存在的價值,所以 rc.sysinit 會視情況卸載
初始化記憶體磁碟,以節省更多的磁碟空間。

初始化序列埠設備
init 服務會管理所有的序列埠 (Serial Port) 的設備,像是您的數據機、不斷電系
統、序列埠主控台 (Serial Console)、...等等。init 服務則是透過 rc.sysinit
來初始化 Linux 的序列埠設備。當 rc.sysinit 發現您的 Linux 存在35著 /etc/r
c.serial 時,才會執行 /etc/rc.serial,藉以來初始化所有的序列埠設備。
因此,您可以在 /etc/rc.serial 中定義如何初始化 Linux 所有的序列埠設備。

清除老舊的鎖定檔與 IPC 檔
為了確保稍後能夠正確的啟動所有的服務,rc.sysinit 必須要先清楚老舊鎖定
檔 (Stale Lock File) 與 IPC 檔。

35
預設 Linux 不提供 /etc/rc.serial,如有需要,請自行建立。

13
Linux 系統管理寶典

什麼是老舊的鎖定檔??

有時候,某些服務為了確保同時間只能執行有一個實體 (Instance),通常
會用下面的方法達成這個目的:

首先,當服務被執行時,會先檢查是否已經有鎖定檔 (Lock File) 存在。


如果有,就表示之前已經有人執行過這個服務,那麼服務就會結束;如
果沒有,那就產生一個空的檔案並且鎖定 (Lock) 之。等到服務順利的結
束時,再解除這個檔案的鎖定狀態後刪除之。

如此一來,就可以避免同時間有多個行程實體執行著。

那麼,為什麼需要在開機過程中清除這些鎖定檔呢??

您的 Linux 很有可能是因為不正常關機36而重新啟動的。在不正常關機
的那一剎那,服務來不及刪除這些鎖定檔;在重新開機時,鎖定檔仍保
留在磁碟上,這樣就會造成 Linux 啟動服務時發現鎖定檔已經存在,而
無法順利的啟動。

為了避免這種情況導致系統無法順利啟動所需的服務,所以在啟動過程
中,Linux 會強迫清除所有殘留下來的老舊鎖定檔,以確保所有的服務
都能正常的啟動!!

重新設定磁碟參數
rc.sysinit 最後一項工作,則是根據 /etc/sysconfig/harddiskDEVICE
設定檔,重新設定該 DEVICE 裝置的磁碟參數 (Disk Parameter)。

36
像是突然失去電力、Linux 當機、...。

14
第 4 章 系統啟動流程

init 服務執行完 /etc/rc.d/rc.sysinit 後,緊接著就會去執行 /etc/rc.d/rc。

4.2.2 /etc/rc.d/rc
/etc/rc.d/rc 這個 Script 則是用來建置 Runlevel 的環境37。

Linux 定義了許多的 Runlevel,用來建立不同的使用環境。您可以設定 Linux 啟動後,


要進入哪一個 Runlevel 的環境。不同的 Runlevel 可能會執行不同的服務,Linux 藉由
/etc/rc.d/rc 來啟動或停止不同 Runlevel 中的服務。

圖 4.6. Linux 圖形化啟動程式的畫面

37
關於 Runlevel 詳細的介紹,請參閱 4.3, "Runlevel"。

15
Linux 系統管理寶典

如果您的 Linux 將進入圖形化使用介面 (GUI, Graphics User Interface),Linux 在執行


/etc/rc.d/rc 的時候,就會執行 "Red Hat 圖形化啟動程式 (/usr/bin/rhgb)",
產生如 圖 4.6 "Linux 圖形化啟動程式的畫面" 的啟動畫面;但如果 Linux 要進入純文
字的模式,則直接以文字的訊息顯示目前正在啟動哪些 Runlevel 的服務。

4.2.3 /etc/rc.d/rc.local
如果您打算在 Linux 系統啟動的過程中,去執行某些工作,該怎麼處理??

截至目前的介紹,您可以透過 rc.sysinit、rc 這兩個 RC Script 檔案來定義要執行


的工作內容。但我希望您放棄這個念頭!! 因為這兩個檔案是啟動過程中,非常重要的
啟動檔。如果 rc.sysinit 或 rc 有錯誤的內容,輕則導致系統啟動過程出現無法預
期的錯誤,嚴重者可能會造成 Linux 系統根本就無法啟動!! 所以,我建議您除非有十
足的保握,否則不要把腦筋動到 rc.sysinit 與 rc 這兩個 RC Script 上。

既然不能修改 rc.sysinit 與 rc,那該如何讓 Linux 系統啟動時自動執行某些工作


呢?? 此時,請使用 rc.local。

rc.local 是整個啟動過程中,唯一一個您可以修改的 RC Script。如果您希望在 Linux


啟動過程中執行某些指令,或者執行某些工作的話,那麼您就可以把這些工作的指
令,定義在這個檔案裡。當 Linux 開機時,執行到 rc.local 時,就可以依照您所定
義的內容,完成系統初始化工作。

16
第 4 章 系統啟動流程

那麼,哪些工作可以定義在 /etc/rc.d/rc.local 呢?? 我舉一個例子。

從 Linux 的虛擬主控台 (Virtual Console) 登入系統時,您會看到類似像下面


的歡迎畫面:
Fedora Core release 4 (Stentz)
Kernel 2.6.11-1.1369_FC4 on an i686

login:

上面的歡迎畫面係由 /etc/issue 檔案所提供。下面這是我的 /etc/issue


的內容:
Fedora Core release 4 (Stentz)
Kernel \r on an \m

其中的 \r 與 \m,會自動轉成核心的版本與平台的名稱。如果您想要更改登
入的歡迎畫面,就可以更改 /etc/issue 的內容,當下次重新啟動 Linux
就可以產生新的登入歡迎畫面。

例如,如果您希望 Linux 系統的登入訊息中,提供 Linux 最後啟動時間的資


訊,那您就可以在 rc.local 的最後面,加上:
# 下面四行用來產生新的 /etc/issue 內容
cat /etc/redhat-release > /etc/issue
echo 'Kernel \r on an \m' >> /etc/issue
echo "Last boot on $(LANG=C date)" >> /etc/issue
echo >> /etc/issue

不過,請特別注意一件事情:您必須確認要進入的 Runlevel 是否會啟用 local 服務;


如果沒有,Linux 將不會執行 /etc/rc.d/rc.local。因為 local 服務,就是去執
行 /etc/rc.d/rc.local 這個檔案!!

17
Linux 系統管理寶典

4.2.4 建立使用者介面
在執行完三個主要的 RC Script 後,init 服務的最後一個工作,就是用來建立 Linux
的使用者介面 (User Interface),好讓使用者可以使用 Linux。此時 init 會執行以下兩
項工作:

建立虛擬主控台
init 會在若干個虛擬主控台 (Virtual Console) 中,執行 /bin/login,以提供使
用者可以從虛擬主控台登入 Linux。Linux 預設會在前六個虛擬主控台,也就是
tty1 ~ tty6,執行 /bin/login 登入程式。

建立圖形使用介面的登入程式
如果您的系統預設要進入 Runlevel 5,那麼就會啟動 X Window System 藉以提供
一個圖形化的使用介面的登入程式 (如圖 4.7 "Linux 提供的圖形使用介面的登入畫
面"),以便讓使用者可以登入 Linux。

圖 4.7. Linux 提供的圖形使用介面的登入畫面

18
第 4 章 系統啟動流程

等 init 建立完所有的虛擬主控台以及圖形化登入環境後,使用者就可以利用虛擬主
控台或圖形化的登入程式,來登入並使用 Linux 了。當您看到登入的畫面時,就代表
Linux 已經跑完所有啟動流程,整個啟動工作已大功告成!!

4.3 Runlevel
執行等級 (Runlevel) 定義了不同軟體執行的組合,Linux 透過 Runlevel 來定義不同的
環境下,要執行哪些程式。

例如,在啟動 X Window System 的時候,可能需要啟動 X Window System 的字型伺服


器 (Font Server)。那您就可以定義一個 Runlevel,代表要啟動 X Window System 以及
X Window System 所需的服務,像是這裡舉例的 X Window System 的字型伺服器。當
Linux 進入這個 Runlevel 時,Linux 就可以去啟動 X Window System 與字型伺服器;
而當系統管理者離開這個 Runlevel 時,Linux 就可關閉字型伺服器,與 X Window
Systme。

目前的 Runlevel 分為兩種:

• 標準的 Runlevel:這些 Runlevel 要執行哪些程式都已經被規定成為標準,在各種


不同的 Linux 產品中都遵守這些規定。這些 Runlevel 我們稱為 "標準的 Runlevel
(Standard Runlevel)"。

• 自訂的 Runlevel:另外還有一些 Runlevel 是提供給系統廠商,或者系統管理者定


義的,這些 Runlevel 稱為 "自訂的 Runlevel (Custom Runlevel)"。

目前的 Linux 定義了以下幾個標準的 Runlevel:

19
Linux 系統管理寶典

Runlevel 0
Runlevel 0 代表 Linux 要開始關閉 (Shutdown) 了!! 當 Linux 切換 Runlevel 0 時,會
進行下面的工作:
• 關閉所有可登入的虛擬主控台 (VC, Virtual Console),以強迫所有使用者登出
系統
• 結束所有啟動的服務
• 卸載所有檔案系統
• 停止所有的周邊設備

完成上述動作後,如果電腦有支援 ATX 電源的話,Linux 便會通知 BIOS 關閉電


源;如果電腦不支援 ATX 電源設備的話,Linux 就會在螢幕上顯示 "System ha
lted" 的訊息,代表 Linux 已經完成關機的程序,等待您手動的關閉電源,以關
閉 Linux。

Runlevel 1
當 Linux 切換到 Runlevel 1 環境時,會執行下面的動作:
• 關閉所有可登入的虛擬主控台
• 關閉網路
• 關閉大部分的服務與應用程式
• 直接以 root 身份開啟一個虛擬主控台,並且執行 Shell 程式

當您切換 Runlevel 1 時,會關閉所有可登入的虛擬主控台,最後直接以 root 身份


開啟一個主控台,執行 Shell 程式。在切換到 Runlevel 1 後,您可以不需要密碼,
就可以直接以 root 身份使用 Linux 系統。

由於此時沒有任何使用者可以透過網路、或者本機的虛擬主控台,甚至 X Window
System 可以登入 Linux 系統,只有 root 可以直接使用整個 Linux 系統,因此 Run-
level 1 也被稱為 "單人模式 (Single User Mode)"。

20
第 4 章 系統啟動流程

什麼時候需要進入 Runlevel 1??

簡單來說,如果您希望擁有一個完全不受干擾的環境,來管理您的 Li-
nux,此時您就可以考慮進入 Runlevel 1。

例如,如果您打算要卸載檔案系統,可是仍有人正在使用這個檔案系統,
雖然您可以使用 fuser 強迫中止相關的行程,但這樣很容易造成使用者
資料遺失的問題發生。此時您可以先讓 Linux 進入 Runlevel 1,然後再來
進行卸載磁碟的工作,就可以減少可能造成的損失。

Runlevel 2
在 Runlevel 2 環境,Linux 會啟動網路,以及大部分的網路服務,並開啟所有的主
控台,允許本機使用者 (Local User) 可以登入 Linux。但是 Runlevel 2 不允許網域
使用者 (Domain User) 登入您的 Linux,所以,Runlevel 2 不會啟動網域功能的伺
服器或用戶端服務38。

Runlevel 3
當 Linux 切換成為 Runlevel 3 環境時,會執行下面的工作:
• 開啟可登入的虛擬主控台,啟用本機帳號與網域帳號
• 開啟網路連線
• 啟動所需的網路服務

值得注意的是,在 Runlevel 3 不會啟動 X Window System,可以降低系統的負擔,


進而提高 Linux 運作的效率。

38
像是 NIS、NFS、LDAP、...等提供網域功能的服務。

21
Linux 系統管理寶典

大部分的 Linux 是作為網路伺服器,通常安裝並組態好 Linux 後,就會丟到機房,


靜靜的提供服務給用戶端使用。這時候,您可以考慮把 Linux 設定在開機後,直
接就進入 Runlevel 3。

Runlevel 4
目前的 Runlevel 4 被定義為保留 (Reserved),您可以自行定義 Runlevel 4 要執行或
停止哪些服務,或者 Runlevel 4 的環境。如果沒有定義的話,進入 Runlevel 4 時,
Linux 將保有原本的環境狀態,不會變更任何資訊。

Runlevel 5
Runlevel 5 相當等於 Runlevel 3 加上圖形模式;也就是說當 Linux 進入 Runlevel 5
時,會執行與 Runlevel 3 相同的工作,完成後再啟動 X Window System 的顯示管
理員 (DM, Display Manager),讓使用者可以使用 X Window System 登入 Linux。

Runlevel 6
Runlevel 6 代表著 Linux 要重新啟動 (Reboot),當切換至 Runlevel 6 時,Linux 會
先執行與 Runlevel 1 相同的工作;但與 Runlevel 1 不同的地方,Runlevel 6 完成關
閉系統工作後,會通知 BIOS 重置 (Reset) 整個系統,就像是您按下電腦面版上的
重置按鈕一樣,以便重新啟動 Linux。

我把各種 Runlevel 的差異整理成為如 表 4.1 "各種 Runlevel 比較表",您可以藉由這個


表格快速瞭解各種 Runlevel 的差異。

22
第 4 章 系統啟動流程

Runlevel 簡述 可登入人數 網路 圖形模式

Runlevel 0 關機 無 ✗ ✗

Runlevel 1 單人模式 只有 root ✗ ✗

Runlevel 2 多人模式 只有本機使用者 ✓ ✗

Runlevel 3 多人 + 網路 本機使用者 + 網域使用者 ✓ ✗

Runlevel 4 保留 本機使用者 + 網域使用者 ✓ ✗

Runlevel 5 多人 + 網路 + 圖形 本機使用者 + 網域使用者 ✓ ✓

Runlevel 6 重新開機 無 ✗ ✗

表 4.1. 各種 Runlevel 比較表

4.3.1 察看目前的 Runlevel


如果您想察看 Linux 目前在哪個 Runlevel,您可以使用 runlevel 這個指令。

當您執行 runlevel 指令時會依序顯示 "先前的 Runlevel (Previous Runlevel)" 與 "目


前的 Runlevel (Current Runlevel)":

範例 4.1. 查詢 Runlevel
[root@linux ~]# runlevel
N ❶ 5 ❷
[root@linux ~]#

❶ 這是先前的 Runlevel。

❷ 這是目前的 Runlevel。

根據 範例 4.1, "查詢 Runlevel" 顯示的結果,可以知道我的 Linux 目前的 Runlevel 是


5;而先前的 Runlevel 則為 N,代表沒有任何 Runlevel,也就是開機直接就進入 Runl-
evel 5。

23
Linux 系統管理寶典

4.3.2 切換至不同的 Runlevel


您可以透過下面幾種方法,切換到其他的 Runlevel:

• 在啟動載入器中指定39:在載入 Linux 核心時,可以把 Runlevel 當作核心參數傳遞


給 Linux 核心。Linux 核心啟動後,就會要求 init 服務,直接進入到指定的 Run-
level。

• 開機後使用 init 切換:如果是已經啟動完畢的 Linux,您也可以使用 init 指令


切換所處的 Runlevel。

• 使用 telinit 工具切換:telinit 與 init 一樣,都可以讓您在啟動 Linux 後,


變更目前的 Runlevel 環境。

以下是我在啟動 Linux 後,使用 init 切換目前的 Runlevel 之示範:

範例 4.2. 使用 init 指令切換 Runlevel


[root@linux ~]# runlevel
N 5 ❶
[root@linux ~]# init 3 ❷
[root@linux ~]# runlevel
5 3 ❸
[root@linux ~]# init 5 ❹
[root@linux ~]# runlevel
3 5 ❺
[root@linux ~]#

❶ 現在,我處在 Runlevel 5 的環境中。

❷ 使用 init 3,切換至 Runlevel 3 環境。

❸ 靜待幾秒鐘,現在就是在 Runlevel 3,而先前的 Runlevel 則是 Runlevel 5。

39
關於如何在啟動載入器中指定 Linux 啟動後要進入哪個 Runlevel,請參閱 4.5, "管理啟動載入器"。

24
第 4 章 系統啟動流程

❹ 再切換回 Runlevel 5!!

❺ 果然,我的 Linux 現在就回到 Runlevel 5 了。

切換至不同 Runlevel 時,您必須要注意:

• 不用理會切換 Runlevel 時產生的訊息:由於切換到其他 Runlevel 時,Linux 會去


啟動或停止某些服務,此時,Linux 會在背景 (Background) 執行啟動、停止服務的
工作。

然而,這些啟動、停止服務會產生的一些訊息,而這些訊息可能會干擾前景 (Fore-
ground) 的操作 (如 圖 4.8 "切換 Runlevel 時延遲的畫面"),讓您誤以為無法繼續輸
入其他的指令!! 事實上,您的 Shell 仍然接受您輸入其他的指令,因此您可以完全
不用理會畫面上的狀況。

• 離開 Runlevel 1 的 Shell 後,會回到預設的 Runlevel:每一個 Linux 中可以在 init


服務中,設定預設的 Runlevel (Default Runlevel),當您結束 Runlevel 1 的 Shell 程式
時,Linux 會切換回預設的 Runlevel。

圖 4.8. 切換 Runlevel 時延遲的畫面

25
Linux 系統管理寶典

4.4 管理 init 服務
init 服務是 Linux 中重要的服務之一,如果您要深入掌握 Linux,您就有必要深入研
究 init 服務的管理方法。

本節將為您深入探討 init 服務的相關知識與技術。

4.4.1 init 服務的介紹


Linux 啟動過程中,init 服務是第一個執行的程式。init 服務負責下面幾項任務:

• 建立系統使用環境:Linux 中所有的環境皆是由 init 服務所管控的,像是提供虛


擬主控台、啟動 X Window System 的登入程式、切換到其他 Runlevel、...。

• 確保系統正常運作:Linux 上所有的行程皆可視為是 init 服務的衍生後代,如果


Linux 上出現了殭屍行程 (Zombie Process),init 服務必須要結束這些殭屍行程,
以確保 Linux 正常運轉。

• 監控序列埠的周邊裝置:init 服務也會監控透過序列埠 (Serial Port) 連接到的周


邊設備,例如像是 UPS、數據機、...等等。

• 攔截並處理 Ctrl-Alt-Del 事件:當使用者在虛擬主控台按下 Ctrl-Alt-Del 時,Linux


預設會重新啟動。這個動作,就是由 init 服務執行的。

此外,init 服務還具備下面幾項特色:

• PID 永遠為 1:由於 init 服務是 Linux 啟動後第一個被啟動的應用程式,因此 i


nit 服務第一個特性就是其行程識別碼 (PID, Process Id) 永遠為 1。

26
第 4 章 系統啟動流程

• 無法被系統管理者中止:Linux 系統上所有的行程皆可以視為 init 的後代,如果


init 可以被任意終止的話,那麼 Linux 所有的行程都將會被結束掉。為了避免這
種情況發生,init 服務被設計成為沒有辦法被任何使用者給中止掉 — 即使是超
級使用者也沒有權力。

4.4.2 組態 init 服務
與 Linux 其他服務一樣,init 服務也有自己的設定檔。init 服務的設定檔是 /etc/i
nittab。以下是我的 /etc/inittab 檔案內容:
1 #
2 # inittab This file describes how the INIT process should set up
3 # the system in a certain run-level.
4 #
5 # Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
6 # Modified for RHS Linux by Marc Ewing and Donnie Barnes
7 #
8
9 # Default runlevel. The runlevels used by RHS are:
10 # 0 - halt (Do NOT set initdefault to this)
11 # 1 - Single user mode
12 # 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
13 # 3 - Full multiuser mode
14 # 4 - unused
15 # 5 - X11
16 # 6 - reboot (Do NOT set initdefault to this)
17 #
18 id:5:initdefault:
19
20 # System initialization.
21 si::sysinit:/etc/rc.d/rc.sysinit
22
23 l0:0:wait:/etc/rc.d/rc 0
24 l1:1:wait:/etc/rc.d/rc 1
25 l2:2:wait:/etc/rc.d/rc 2
26 l3:3:wait:/etc/rc.d/rc 3
27 l4:4:wait:/etc/rc.d/rc 4
28 l5:5:wait:/etc/rc.d/rc 5
29 l6:6:wait:/etc/rc.d/rc 6
30
31 # Trap CTRL-ALT-DELETE
32 ca::ctrlaltdel:/sbin/shutdown -t3 -r now

27
Linux 系統管理寶典

33
34 # When our UPS tells us power has failed, assume we have a few minutes
35 # of power left. Schedule a shutdown for 2 minutes from now.
36 # This does, of course, assume you have powerd installed and your
37 # UPS connected and working correctly.
38 pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
39
40 # If power was restored before the shutdown kicked in, cancel it.
41 pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
42
43 # Run gettys in standard runlevels
44 1:2345:respawn:/sbin/mingetty tty1
45 2:2345:respawn:/sbin/mingetty tty2
46 3:2345:respawn:/sbin/mingetty tty3
47 4:2345:respawn:/sbin/mingetty tty4
48 5:2345:respawn:/sbin/mingetty tty5
49 6:2345:respawn:/sbin/mingetty tty6
50
51 # Run xdm in runlevel 5
52 x:5:respawn:/etc/X11/prefdm -nodaemon

/etc/inittab 檔案中使用井字符號 (#) 作為註解符號,每一行代表一筆設定值。每


一行中以冒號 (:) 符號分隔出四個欄位,分別為:
ID:RUNLEVELS:ACTIONS:PROCESS

每一個欄位的說明如下:

欄位 說明

ID init 服務參數的識別名稱,由 1 ~ 4 個字元所組成。

RUNLEVELS 代表在哪些 Runlevel 要套用這個參數。

ACTIONS init 服務如何執行程式的方法。

PROCESS 要執行的程式檔案,這個欄位中定義的程式名稱必須是絕對路徑。

inittab 的四個欄位中,比較重要的是 ID 欄位,請參閱表 4.2 "/etc/inittab 的


ID 欄位一覽表";至於其他的欄位,請參閱 inittab(5) 的手冊頁 (man page)文件。

28
第 4 章 系統啟動流程

參數 說明

id Linux 的 "預設 Runlevel (Default Runlevel)"。

當 Linux 啟動時,沒有指定要進入那個 Runlevel,或者結束 Runlevel


1 的 Shell 時,Linux 就會自動進入預設的 Runlevel。

si 系統初始化 (System Initial) 要執行的程式。

Linux 啟動過程中,會去執行 rc.sysinit,就是 si 參數定義的。

l0 ~ l6 進入不同 Runlevel 時,要執行的動作。l0 代表 Runlevel 0;l1 代


表 Runlevel 1...依此類推。

ca 當攔截到 Ctrl-Alt-Del 事件時要怎麼處置。

pf 電源失效時要執行的工作。

例如筆記型電腦中的電池電力不夠,或者當 init 服務接到由 UPS


發出的電源不足的通知。

pr 電源恢復時要執行的工作。

N 如何配置第 N 號虛擬主控台的方法。N 為虛擬主控台的編號。

x 啟動 X Window System 的顯示管理員 (DM, Display Manager) 之方


法。

表 4.2. /etc/inittab 的 ID 欄位一覽表

4.4.3 重新啟動 init 服務


當您組態好 init 服務的設定檔後,必須要讓 init 服務重新讀取一次新的設定檔,
方能套用新的組態。有三種方法可以讓 init 服務重新讀取設定檔:

29
Linux 系統管理寶典

• 重新啟動 Linux:init 服務啟動時會讀取 /etc/inittab 設定檔,因此您可以


讓 init 服務重新啟動一次,便可以套用新的組態資料。由於 init 服務只會在開
機的時候啟動,所以您只能重新啟動您的 Linux,以便讓系統重新啟動一次 init
服務。

• 傳送 SIGHUP 訊號給 init 行程:重新啟動您的 Linux 可能會造成別人無法繼續


使用 Linux 系統,因此上面的方法不是一個好方法。init 服務會接收 SIGHUP 的
訊號 (Signal),當 init 服務接收到 SIGHUP 訊號時,便會重新讀取設定檔,然後
配置所有功能,因此您也可以以傳送 SIGHUP 訊號的方式,讓 init 服務重新套
用新的組態設定。

• 執行 init q 或 telinit q 指令:您也可以直接使用 init q 或者 telinit


q 等指令,讓 init 服務重新讀取一次設定檔。

下面就為您示範重新啟動 init 服務的方法:

範例 4.3. 重新啟動 init 服務的方法


[root@linux ~]# init q
[root@linux ~]# kill -HUP 1
[root@linux ~]#

4.5 管理啟動載入器
與 Linux 啟動關係密切的,就是啟動載入器。啟動載入器用來載入作業系統核心,並
且傳遞一些核心啟動參數 (Kernel Boot Parameter) 給作業系統。

啟動載入器若是設定錯誤,可能會造成無法順利啟動您的 Linux,因此,在本節中,
將為您介紹如何使用與管理啟動載入器。

30
第 4 章 系統啟動流程

4.5.1 RHEL 提供的啟動載入器


Linux 提供以下兩種啟動載入器:

LILO
LILO (Linux Loader),是為 Linux 作業系統量身打造的啟動載入器,也是 Linux 作
業系統標準的啟動載入器,幾乎各種 Linux 發行套件 (Distribution) 產品,都會提
供 LILO 這個啟動載入器軟體,Red Hat Enterprise Linux 與 Fedora Core Linux 當
然也不例外。

LILO 具備下面幾項特性:

• 修改過設定檔後,必須要重新安裝 LILO:只有在安裝 LILO 時,Linux 才會


依據設定檔的內容產生新的 LILO 啟動載入器。

• 只能儲存明文的密碼:在 LILO 中可以設定密碼,當您試著修改 LILO 啟動參


數時,LILO 便會要求您輸入密碼,以便確認身分正確與否。LILO 只支援明
文 (Clear Text) 型態的密碼,任何人只要閱讀 LILO 的設定檔,就可以直接獲
知 LILO 的密碼內容。

GRUB
GRUB 是 GNU 計畫的一項成品。GRUB 設計的目標,是作為 GNU 作業系統的啟
動載入器,並且支援啟動各種40作業系統。

GRUB 具備下面幾項特性:

• 修改過設定檔後,無須重新安裝:LILO 是在安裝時,依據設定檔的組態,產
生新的 LILO,因此修改過 LILO 的設定,必須重新安裝 LILO 才能讓 LILO

40
當然也包含 Linux。

31
Linux 系統管理寶典

套用新的設定;而 GRUB 則是在執行時,才去讀取設定檔的資料,所以,如果


您變更過 GRUB 的設定檔,在下次執行 GRUB 時就會馬上生效。

• 可儲存 MD5 加密過的密碼:LILO 與 GRUB 都支援設定密碼,當啟動作業系


統或變更作業系統啟動參數時,LILO 與 GRUB 就會要求使用者輸入密碼。不
過,LILO 只能使用明文型態的密碼;而 GRUB 則支援明文與經由 MD5 加密
後的密碼。

一個 Linux 系統,同時間只能選擇使用 LILO 或 GRUB。Red Hat 建議您使用 GRUB 作


為 Red Hat Enterprise Linux 或 Fedora Core Linux 的啟動載入器,主要的原因包含:

• 使用 GRUB 可獲得更高的安全性:GRUB 中可以儲存經 MD5 雜湊演算法計算過的


密碼資料,由於密碼經過雜湊的處理,故沒有人可以得知 GRUB 的原始密碼為何,
GRUB 的安全性會比 LILO 來的高許多。

• Linux 核心的影像檔 (Kernel Image File) 可以儲存在各種不同的檔案系統上:GRUB


支援 ext2、ext3、ResierFS、XFS、JFS... 等 Linux 常用的檔案系統,因此使用 GRUB
時,您可以把 Linux 的核心影像檔儲存在任何種類的檔案系統上,而不一定是 ext2
或 ext3。

基於上述種種因素,Red Hat Enterprise Linux 或 Fedora Core Linux 中預設的啟動載入


器是 GRUB,而非 LILO。雖然如此,但 Red Hat Enterprise Linux 4 與 Fedora Core Linux
3 仍提供 LILO,因此我除了會介紹 GRUB 的管理與用法外,也會介紹如何使用與管理
LILO 這個啟動載入器。

Fedora Core Linux 4 已經不提供 LILO 這個啟動載入器了。

32
第 4 章 系統啟動流程

4.5.2 使用 LILO
如果您的 Linux 安裝的是 LILO,當啟動 Linux 時,將看到如 圖 4.9 "LILO 執行的畫
面" 的畫面。在 LILO 的畫面中,會顯示可以使用 LILO 來啟動的作業系統標籤名稱
(Label Name) 清單。作業系統的標籤名稱是在設定 LILO 時決定的,用來代表電腦中
的某一個作業系統之識別名稱。

圖 4.9. LILO 執行的畫面

此時,您可以移動方向鍵,選擇您要啟動的作業系統,按下 Enter,LILO 就會去啟動


選擇的作業系統。如果沒有選擇任何作業系統,LILO 預設在 2 秒鐘後會自動啟動預
設的作業系統41。

變更 Linux 啟動參數

如果您要變更 LILO 啟動 Linux 的啟動參數,您必須在 LILO 的畫面中按下 Ctrl-X ,


原本的選單畫面就會消失,取而代之的是 Boot: 這樣的提示字串。接著,您就可以

41
至於預設的作業系統是哪一個,端看 LILO 中的設定。

33
Linux 系統管理寶典

透過 LILO 的 Boot: 提示字串,輸入要啟動哪個作業系統,以及該作業系統的啟動


參數。至於在 Boot: 提示字串後,如何知道 LILO 可以啟動哪些作業系統?? 您可以
按下兩次 Tab 按鍵,LILO 就會顯示所有的作業系統清單。

圖 4.10 "LILO 變更啟動參數" 的畫面,就是我在 LILO 的提示字串中,要求啟動 li


nux 這個標籤名稱的作業系統;並且請 LILO 載入這個作業系統核心時,附加 1 這個
啟動參數給該作業系統核心。

圖 4.10. LILO 變更啟動參數

由於我的 LILO 中標籤名稱為 linux 的就是 Linux,附加給 Linux 的 1 啟動參數,就


是讓 Linux 啟動後直接進入 Runlevel 1。所以,當我按下 Enter 啟動 Linux 後,Linux
就會直接切換至 Runlevel 1 的環境。

4.5.3 組態 LILO
如果您打算變更 LILO 的設定,舉凡像是作業系統的標籤名稱、預設的作業系統、…
等,就得重新組態 LILO 的設定檔。

34
第 4 章 系統啟動流程

LILO 的設定檔是 /etc/lilo.conf。不過,要注意的是:在安裝 Linux 的時候,若


選擇使用 GRUB 作為系統的啟動載入器,而不是 LILO 的話,Linux 會把 LILO 的設定
值儲存為 /etc/lilo.conf.anacoda,您必須要手動的將其改為 /etc/lilo.c
onf。

下面是我的 /etc/lilo.conf 的內容:


1 prompt
2 timeout=20
3 default=linux
4 boot=/dev/hda
5 map=/boot/map
6 install=/boot/boot.b
7 message=/boot/message
8 lba32
9
10 image=/boot/vmlinuz-2.6.9-5.EL
11 label=linux
12 initrd=/boot/initrd-2.6.9-5.EL.img
13 read-only
14 append="rhgb quiet root=LABEL=/"

/etc/lilo.conf 包含兩部分的設定:

• 作業系統參數:用來組態某一個作業系統如何啟動的設定資料,像是作業系統的
核心檔案、作業系統的標籤名稱 (Label Name)、...。

• 全域參數:用來組態 LILO 本身,或者所有作業系統的預設值。

以我的 /etc/lilo.conf 來說,1 ~ 8 行是 LILO 的全域參數;而 10 ~ 14 行則是一


個 Linux 作業系統的設定。

作業系統參數

首先,先為您介紹 LILO 中用來設定作業系統啟動資訊的設定值。LILO 可以用來啟


動 Linux 與其他的 (Others) 作業系統,LILO 為這兩類的作業系統,提供了不同的啟
動參數。

35
Linux 系統管理寶典

以下僅介紹如何利用 LILO 啟動 Linux 作業系統的參數,至於用來啟動其他作業系統


的部分,請您自行參閱 /usr/share/doc/lilo-VERSION/ 與 lilo.conf(5) 中
相關的文件。

啟動 Linux 作業系統的參數

要在 LILO 中設定啟動 Linux 作業系統,必須要以 image 參數為開頭。從一個 image


參數到下一個 image 之間的參數,即是該 Linux 作業系統的啟動參數。在每一個 Linux
作業系統啟動參數區域中,可使用下列的參數:

參數 說明

image=IMAGEFILE 指定 Linux 核心影像檔的檔案路徑。IMAGEFILE 即是影像


檔的檔案名稱。

label=LABELNAME 指定該 Linux 啟動時的標籤名稱,當 LILO 出現選單時,便


會顯示這個標籤名稱。

initrd=INITRDFILE 這個參數用來設定 "初始化記憶體磁碟 (initrd, Initial RAM


Disk)" 的影像檔路徑。INITRDFILE 就是該影像檔路徑名
稱。

append=STRINGS 當啟動 Linux 核心影像檔案時,要傳遞給 Linux 核心影像的


參數。

STRINGS 即是傳遞給 Linux 核心的參數。

read-only 用來指定 Linux 核心以唯讀方式掛載根檔案系統。

36
第 4 章 系統啟動流程

全域參數

LILO 設定檔在第一個作業系統42啟動參數設定值前,是 LILO 全域參數的區域。以下


是 LILO 常見的全域參數一覽表:

參數 說明

prompt 顯示 boot: 提示字串 (Prompt String),強迫 LILO 等待使


用者從鍵盤輸入。使用者如按下 Enter,就立即啟動預設的
作業系統;如按下 Tab 則出現可以啟動的作業系統之標籤
名稱。

若指定了 prompt,但沒有指定 timeout 參數,LILO 就


會一直等待使用者輸入要啟動的作業系統;如果沒有指定
prompt,LILO 則不會讓使用者選擇,直接啟動預設的作
業系統。

timeout=SECONDS 逾時的秒數。

SECONDS 的單位是 1/10 秒。所以,如果要設定 10 秒就算


逾時,SECONDS 就得指定 100。

default=LABEL 預設啟動的作業系統標籤名稱。

boot=DEVICE 指定 LILO 要安裝在哪個裝置。

如果 DEVICE 是一個磁碟,代表把 LILO 安裝在該磁碟的


主要啟動記錄 (MBR, Master Boot Record) 磁區;如果是一個
分割區,則表示把 LILO 安裝到該分割區的啟動磁區 (Boot
Sector)。

42
不管是 Linux 作業系統,還是其他的作業系統。

37
Linux 系統管理寶典

參數 說明

map=FILENAME 指定 LILO 的對應檔 (Map File) 是哪一個檔案。

install=FILENAME 指定 LILO 的第二階段,要儲存成為 FILENAME。

message=FILENAME 要以 FILENAME 作為 LILO 顯示的訊息。

lba32 用來啟動儲存於 1024 磁柱 (Cylinder) 以後的 Linux 核心影


像檔。

至於 LILO 其他用來啟動 Linux 作業系統的參數,還請您自行參閱 lilo.conf(5)


的介紹。

4.5.4 安裝 LILO
有兩種情況,您必須要重新安裝 LILO:

• 要使用 LILO 取代其他的啟動載入器:當您打算使用 LILO 取代其他的啟動載入器


時,您就得重新安裝一次 LILO。

最常見的情況就是,在安裝 Linux 之後,又安裝 Windows 等作業系統!! 由於 Win-


dows 會強迫使用自己的啟動載入器,很不幸的,Windows 的啟動載入器程式是無
法用來啟動 Linux 的。像這樣的情況下,您就得重新安裝一次 LILO。

• 要套用新的 /etc/lilo.conf 設定值:LILO 會把設定檔的內容,寫入到啟動磁


區中,所以假若您變更了 lilo.conf 的設定,那麼您也得重新安裝一次 LILO,
以便套用新的設定值。

38
第 4 章 系統啟動流程

• 修改過核心相關檔案時:由於 LILO 記錄的是核心檔案的磁區 (Sector) 位置,因


此,若您變更了核心相關的檔案43時,就得重新安裝 LILO。

要安裝 LILO,您可以執行 lilo 這個指令:


lilo [-v...] [-C CONFIG_FILE]

執行 lilo 時,lilo 會根據 /etc/lilo.conf 安裝 LILO,如果您的 LILO 設定檔


不是 /etc/lilo.conf,那您一定要配合 -C 參數,指定 LILO 設定檔的位置。在安
裝 LILO 的時候,您也可以指定若干個 -v 參數,此時 LILO 會顯示更多的訊息;-v
參數越多,訊息會越詳細。

以下是我安裝 LILO 的範例:

範例 4.4. 安裝 LILO
[root@linux ~]# lilo -v
LILO version 21.4-4, Copyright (C) 1992-1998 Werner Almesberger
'lba32' extensions Copyright (C) 1999,2000 John Coffman

Reading boot sector from /dev/hda


Merging with /boot/boot.b
Mapping message file /boot/message
Boot image: /boot/vmlinuz-2.6.9-5.EL
Mapping RAM disk /boot/initrd-2.6.9-5.EL.img
Added linux *
/boot/boot.0300 exists - no backup copy made.
Writing boot sector.
[root@linux ~]#

4.5.5 察看 LILO 的啟動項目


如果您想要知道安裝好的 LILO 中,可以啟動哪些作業系統,您可以透過 lilo -q
來查詢。

43
像是核心影像檔 (Kernel Image)、初始化記憶體磁碟 (Initial RAM Disk)、...等等。

39
Linux 系統管理寶典

範例 4.5. 察看 LILO 的啟動項目


[root@linux ~]# lilo -q
linux *
[root@linux ~]#

4.5.6 使用 GRUB
當您使用 GRUB 作為系統的啟動載入器,啟動 Linux 時,將看到如 圖 4.11 "GRUB 啟動
畫面" 的畫面。

圖 4.11. GRUB 啟動畫面

GRUB 預設會倒數五秒後,自動啟動預設的作業系統;如果您要啟動非預設的作業系
統,一定要在這個畫面中按下任一鍵,才能中止 GRUB 的倒數計時。

40
第 4 章 系統啟動流程

中止了 GRUB 啟動預設作業系統後,GRUB 會在螢幕上顯示如圖 4.12 "GRUB 的選單"


的選單,讓您選擇要啟動哪一個作業系統。您可以使用方向鍵,移動選單中的光棒到
要啟動的作業系統後,然後按下 Enter,GRUB 就會去啟動您所選擇的作業系統。

圖 4.12. GRUB 的選單

不過,要提醒您,當您中止 GRUB 啟動預設的作業系統後,GRUB 會靜靜的等待您的


選擇 — 直到您按下 Enter 為止。

更改啟動參數

LILO 允許您變更 Linux 的啟動參數,那 GRUB 呢?? GRUB 當然也可以。在 GRUB 的選


單畫面中,您可以使用下面的按鍵,變更 GRUB 的作業系統啟動參數:

41
Linux 系統管理寶典

按鍵 說明

e 編輯選擇的作業系統之設定值。

使用 e 按鍵時,GRUB 會讓您編輯該作業系統的全部設定值。

a 在啟動該作業系統前,讓您修改作業系統之啟動參數。

與 e 按鍵不同處,a 按鍵只會讓您修改附加在作業系統核心影像檔後的啟動
參數。

c 直接開啟一個指令列 (Command Line) 來編輯該作業系統設定值。

以下是我在 GRUB 的主選單中,按下 e 按鍵,編輯我的 Fedora Core (2.6.11-


1.1369_FC4) 作業系統之設定值畫面。

圖 4.13. GRUB 的作業系統啟動參數選單

42
第 4 章 系統啟動流程

在 圖 4.13 "GRUB 的作業系統啟動參數選單" 畫面的下方,提醒您可以使用以下的按


鍵:

按鍵 說明

b 啟動這個作業系統。

e 編輯光棒所在的設定值。

c 直接開啟一個指令列來編輯該設定值。

o 新增一行設定值。

d 刪除選擇的設定值。

Esc 回到上一層選單。

圖 4.14. 編輯 GRUB 作業系統的啟動參數

43
Linux 系統管理寶典

圖 4.14 "編輯 GRUB 作業系統的啟動參數" 就是當我在 GRUB 作業系統啟動參數選單


中,選擇 "kernel ... " 這一行,然後按下 e 按鍵,GRUB 出現的畫面。而我在這
個 Linux 作業系統啟動參數中,新增了 1 參數,用來告訴 GRUB 等一下啟動這個作業
系統時,傳遞 1 參數給作業系統。

在修改作業系統啟動參數後,按下 Enter,就可回到上一層選單 (如 圖 4.13 "GRUB 的


作業系統啟動參數選單")。之後,您就可以繼續其他的工作,像是啟動這個作業系統,
或是退回到更上一層的畫面。

4.5.7 組態 GRUB
與 LILO 一樣,您也可以組態 GRUB!! 與大部分的設定檔不一樣的是,GRUB 的設定檔
位於 /boot/grub/grub.conf,而非 /etc/ 中。我要提醒您,因為 GRUB 是在啟
動時,才去讀取設定檔,如果不小心刪除了 /boot/grub/grub.conf,會導致 GRUB
啟動時找不到設定檔,而宣告啟動失敗!! 所以,請您盡可能妥善備份好您的 /boot/g
rub/grub.conf。

以下是我的 /boot/grub/grub.conf 檔案的內容:


1 # grub.conf generated by anaconda
2 #
3 # Note that you do not have to rerun grub after making changes to this file
4 # NOTICE: You have a /boot partition. This means that
5 # all kernel and initrd paths are relative to /boot/, eg.
6 # root (hd0,0)
7 # kernel /vmlinuz-version ro root=/dev/hda5
8 # initrd /initrd-version.img
9 #boot=/dev/hda
10 default=0
11 timeout=5
12 splashimage=(hd0,0)/grub/splash.xpm.gz
13 hiddenmenu
14 title Linux ES-up (2.6.9-5.EL)
15 root (hd0,0)
16 kernel /vmlinuz-2.6.9-5.EL ro root=LABEL=/ rhgb quiet
17 initrd /initrd-2.6.9-5.EL.img

44
第 4 章 系統啟動流程

GRUB 的設定檔一樣可以區分兩大區域:

• 全域參數:用來設定 GRUB 本身的參數。

• 作業系統參數:用來定義啟動作業系統的方法。

以我的 GRUB 設定檔而言,9 ~ 13 行是屬於全域參數區域;14 ~ 17 行則是某一個作業


系統參數。

全域參數

首先,在 GRUB 設定檔的前段,就是 GRUB 的全域參數。GRUB 的全域參數常見的參


數如下所示:

參數 說明

default=NUM 預設的作業系統之編號。

NUM 為作業系統的索引值 (Index),也就是從 0 開始的數字,


因此,第一個作業系統的 NUM 為 0;第二個為 1;...依此類
推。

timeout=SECONDS 使用者選擇作業系統的逾時時間,SECONDS 單位為秒。

如果使用者沒有選擇作業系統,在 SECONDS 時間到達時,


GRUB 將會直接啟動預設的作業系統。

splashimage=FILE 指定 GRUB 底圖的圖檔。

hidemenu 要求 GRUB 啟動的時候隱藏選單。

如果您希望 GRUB 啟動時顯示作業系統的選單,您可以把


這個參數註解起來。

45
Linux 系統管理寶典

作業系統參數

GRUB 設定檔的第二個部分,是作業系統的參數。您可以指定 GRUB 可以啟動多個作


業系統,此時只需要在 GRUB 設定檔中,定義

參數 說明

title TITLESTR 用來作為顯示的名稱。TITLESTR 則是顯示的名稱。

root DEVICE 啟動的磁碟裝置,請注意:這必須是 Linux 核心存放的分割


區,在 Linux 會把 Linux 核心安裝至 /boot/ 目錄中。因
此,DEVICE 通常為儲存 /boot/ 目錄的分割區。

kernel FILENAME Linux 核心影像檔案名稱。FILENAME 為核心影像檔案名


稱。

initrd FILENAME 核心的初始化記憶體磁碟影像檔案名稱。FILENAME 為初


始化記憶體磁碟影像檔案名稱。

值得注意的是,在 grub.conf 中,若要指定磁碟或是某一個分割區44,必須以 (DI


SKn[,m]) 格式定義之。其中的 DISK 為磁碟機的種類,IDE 磁碟一律使用 hd,軟碟
為 fd,SCSI 磁碟機為 sd。而 n 則是磁碟機的順序之索引值 (Index),m 則是分割區的
索引值。例如,(hd0,0) 就代表第一個 IDE 磁碟機的第一個分割區;而 (fd0) 則是
第一個軟碟機、...依此類推。

4.5.8 安裝 GRUB
如果您打算使用 GRUB,替換掉別的啟動載入器,那您就得重新安裝 GRUB。要安裝
GRUB 時,請使用 grub-install 工具:

44
例如 grub.conf 的 root 參數。

46
第 4 章 系統啟動流程

grub-install DEVICE

其中的 DEVICE 是 GRUB 要安裝的裝置。如果 DEVICE 是一個磁碟機,GRUB 就會安


裝到該磁碟機的主要啟動記錄 (MBR, Master Boot Record) 磁區;如果 DEVICE 是一個
分割區,GRUB 就會安裝到該分割區的啟動磁區 (Boot Sector)。

以下是我把 GRUB 安裝到我的 /dev/hda 磁碟機的主要啟動記錄之示範:

範例 4.6. 安裝 GRUB
[root@linux ~]# grub-install /dev/hda
Installation finished. No error reported.
This is the contents of the device map /boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.

# this device map was generated by anaconda


(fd0) /dev/fd0
(hd0) /dev/hda
[root@linux ~]#

4.5.9 設定 GRUB 密碼
GRUB 支援以下兩種類型的密碼,以提高 Linux 的安全性:

• 變更啟動參數的密碼:當使用者試圖去變更 GRUB 的啟動參數時,GRUB 會要求使


用者提供此密碼,唯有密碼正確時,GRUB 才會開啟變更啟動參數的選單。
• 作業系統啟動密碼:當使用者啟動某一個作業系統時,GRUB 會要求使用者提供密
碼,如果密碼不正確,GRUB 就不會啟動該作業系統。

GRUB 的密碼內容您可以使用下面兩種格式:

• 明文的密碼 (ClearText Password):這種格式的密碼之安全性最差,因為密碼資料


沒有作任何的保護,任何人都可以輕鬆的得知原始密碼的內容。

47
Linux 系統管理寶典

• MD5 加密後的密碼 (MD5 Encrypted Password):使用者輸入的密碼將經 MD5 雜湊


演算法進行加密。而 /boot/grub/grub.conf 設定檔中儲存的只是加密後密碼
資料。即使有人取得密碼,也無法得知原始的密碼為何,其安全性比較高。

GRUB 的密碼將儲存在 GRUB 的設定檔中,您必須以 password 參數指定 GRUB 的密


碼 (如 圖 4.15 "GRUB 設定檔中的密碼參數位置")。若 password 參數儲存在某一個作
業系統設定值中,就表示啟動該作業系統時必須輸入的密碼;如果儲存在全域參數區
域,那就表示當您修改每一個作業系統之啟動參數時,必須要輸入的密碼內容。

/boot/grub/grub.conf
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/hda5
定義在全域參數區域的密碼,是當
# initrd /initrd-version.img
修改 GRUB 啟動參數時使用的密碼
#boot=/dev/hda
default=0
timeout=5
password –md5 $1$Skjlzl84fade
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu 定義在作業系統區域的密碼,
則是啟動該作業系統時使用的
title Red Hat Enterprise Linux ES-up (2.6.9-5.EL)
root (hd0,0) 密碼
password 12345
kernel /vmlinuz-2.6.9-5.EL ro root=LABEL=/ rhgb
initrd /initrd-2.6.9-5.EL.img

圖 4.15. GRUB 設定檔中的密碼參數位置

如果要儲存的是本文密碼,您只需要在 password 參數後指定密碼的內容即可;如果


是 MD5 雜湊後的密碼,那就需要透過 grub-md5-crypt 工具,產生一個經 MD5 加
密後的密碼文字,再填入在 password 參數後 (如 圖 4.16 "設定 GRUB 的 MD5 加密密
碼")。請注意:此時 password 參數後必須指定 --md5,GRUB 才會把後面的密碼視
為 MD5 加密的密碼。

48
第 4 章 系統啟動流程

[root@linux ~]# grub-md5-crypt


Password:
Retype password: 直接把 grub-md5-crypt 產生的
$1$Skjlzl84fade 密碼複製過來
[root@linux ~]#

#boot=/dev/hda
default=0
timeout=5
password –md5 $1$Skjlzl84fade
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux ES-up (2.6.9-5.EL)

圖 4.16. 設定 GRUB 的 MD5 加密密碼

輸入 GRUB 密碼

圖 4.17. GRUB 編輯作業系統啟動參數的密碼使用時機

當您為 GRUB 設定密碼後,下次啟動 GRUB 時,GRUB 的作業系統選單就會有一些改


變!! 原本下方的提示,現在全部不見了!! GRUB 會提示您可以按下 p 按鍵,以便輸入
GRUB 的密碼 (如圖 4.17 "GRUB 編輯作業系統啟動參數的密碼使用時機")。

49
Linux 系統管理寶典

此時,如果您需要修改這個作業系統的啟動參數,就得按下 p 按鍵,GRUB 就會在下


方出現 "Password:" 的提示字串,讓您輸入原先設定的密碼。若您輸入的密碼正確,
GRUB 才會出現如 圖 4.12 "GRUB 的選單" 的畫面,讓您修改該作業系統的啟動參數。

圖 4.18. 輸入 GRUB 作業系統的啟動密碼

但如果設定 GRUB 的作業系統啟動密碼,那麼當 GRUB 啟動該作業系統之前,就會出


現如 圖 4.18 "輸入 GRUB 作業系統的啟動密碼" 的畫面,您可以在此處,輸入方才設
定的密碼。如果密碼正確,GRUB 就會正式啟動您所選擇的作業系統。

4.6 結論
本章為您安排了 Linux 啟動流程、Runlevel、init 服務,與啟動載入器。本章對於身
為系統管理者的您來說,是非常重要的一個章節。如果您打算完全掌握 Linux,您一
定得徹底熟悉本章介紹的內容。

50

You might also like