Ict-創新/LPI/101.2
候選人應該能夠為 Linux 系統設計磁碟分割槽方案。候選人應該能夠選擇、安裝和配置引導管理器。
關鍵知識領域
- 在啟動時向引導載入程式和核心提供通用命令和選項。
- 展示從 BIOS 到啟動完成的啟動順序知識。
- 檢查日誌檔案中的啟動事件。
當一臺 x86 計算機啟動時,它會按照一組預定義的步驟來啟動作業系統。在啟動時,CPU 會跳轉到 BIOS 的地址並開始載入它。BIOS 會執行一些檢查並初始化硬體,然後找到已配置的啟動裝置。啟動裝置是在 BIOS 使用者介面中配置的,透過設定連線的儲存裝置的啟動順序。
一旦找到啟動裝置,BIOS 就會繼續載入啟動裝置的主引導記錄 (MBR)。MBR 是啟動裝置的第一個扇區(512 位元組),它包含第一階段引導載入程式和分割槽表。第一階段引導載入程式可以在 Linux 第一個階段引導載入程式的情況下直接啟動作業系統,但通常第一階段引導載入程式負責查詢和載入第二階段引導載入程式,在 Linux 引導載入程式的情況下,這允許在選擇要啟動的核心和作業系統方面具有更大的靈活性。
分割槽表是第一階段引導載入程式能夠找到第二階段引導載入程式偏移量的必要條件。由於 MBR 的大小有限,分割槽表只包含主分割槽的位置,因此要求第二階段引導載入程式必須位於主分割槽上。
第一階段引導載入程式透過檢視標記為活動/可啟動的分割槽的引導扇區來查詢第二階段引導載入程式的分割槽。(稍後在檢視磁碟分割槽時,我們將介紹將分割槽(而不是整個裝置)標記為可啟動。)
第二階段引導載入程式的任務是為 Linux 載入作業系統;這意味著 Linux 核心和初始 RAM 磁碟。第二個引導載入程式可能會向用戶呈現一個選單來選擇要啟動的核心,甚至允許使用者啟動異構作業系統(即雙啟動)。
一旦第二個引導載入程式載入了核心,它就會將控制權傳遞給核心。核心啟動並配置 CPU 型別、中斷處理、記憶體管理的其餘部分(如分頁表和記憶體分頁)、裝置初始化、驅動程式等。
核心還會將任何可能存在的初始 RAM 磁碟映像載入到記憶體中,並在 ram 中將其安裝為臨時根檔案系統。初始 RAM 磁碟 (initrd) 包含核心需要訪問系統硬體的系統配置檔案和模組的映像。正是在這裡載入了各種檔案系統和磁碟驅動程式,使核心能夠找到並掛載真正的根分割槽。例如,如果真正的根分割槽位於 RAID 1 裝置上,則需要載入 raid1 的模組才能使核心能夠掛載和讀取根檔案系統。一旦核心能夠訪問真正的根檔案系統,臨時根檔案系統就會被替換。
一旦核心完全執行,它就會啟動一個初始程式,預設情況下是 /sbin/init。init 程式設定使用者空間並啟動登入 shell 和/或圖形登入。init 程序完成其初始化後,哪些服務啟動以及機器的狀態取決於預設執行級別及其配置。
圖 101.2.1:啟動過程
Linux 有兩個廣泛使用的引導載入程式,分別是 GRUB 和 LILO。這兩個引導載入程式至少被分成兩個階段。第一階段是一個位於 MBR 上的小型機器程式碼二進位制檔案。它的唯一工作是查詢和載入第二階段引導載入程式。然後,第二階段引導載入程式找到並載入 Linux 核心,並將它提供的任何引數傳遞給它。
當第二階段引導載入程式執行時,您有機會透過引導載入程式的一部分文字控制檯向 Linux 核心傳遞其他引數。您可能傳遞給核心的典型引數包括
- init
- 覆蓋核心在完成載入後執行的程序。“init=/bin/bash” 用於在忘記 root 密碼的情況下繞過登入提示。因為這提供了對 root shell 的訪問,這也突出了為什麼對計算機控制檯進行良好的物理訪問控制很重要,以及為什麼用密碼保護引導載入程式是一個好主意。這將阻止使用者修改啟動時核心引數。
- root
- 通知核心將哪個裝置用作根檔案系統。通常在對配置錯誤的引導載入程式進行故障排除時使用。例如,root = /dev/hda1 告訴核心使用 /dev/hda1 作為根裝置檔案系統,而不是它已配置為使用的檔案系統。
- noapic/nolapic
- 告訴核心不要使用高階可程式設計中斷控制器或本地高階可程式設計中斷控制器來分配 IRQ 和資源。這實際上是在 Linux 核心中關閉了 PnP。
- noacpi
- 關閉 Linux 核心的 高階配置和電源介面 功能。在 BIOS 有缺陷的情況下通常需要它。
還有許多其他引數可以在啟動時傳遞給核心。有關更多選項,請參閱核心文件。
Init 程序概述 (SysV init 風格)
核心完成載入後,它會啟動 init 程序。Init 負責檢查和掛載 檔案系統,以及啟動配置的服務,例如網路、郵件和 Web 伺服器,它透過進入其預設執行級別來完成這些操作。這在 /sbin/init 應用程式配置檔案 /etc/inittab 中配置。下面給出了 inittab 檔案的一個示例
# inittab This file describes how the INIT process should set up
# the system in a certain run-level.
id:3:initdefault:
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
# When our UPS tells us power has failed, assume we have a few minutes
# of power left. Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm -nodaemon
inittab 檔案中的一行具有以下格式
id:runlevels:actions:process
- id
- 1-4 個字元,標識函式,
- runlevels
- 將執行 process 的執行級別,
- action
- 定義的事件列表中之一,對於該事件應執行該程序,或者是對 init 的指令,說明在執行該程序時該怎麼做。最常用的操作是
- wait
- init 將等待它啟動的程序完成,然後繼續,
- respawn
- 告訴 init 每當程序終止時重新啟動程序,這對登入程序很有用。
- Ctrl-Alt-Del
- 它捕獲 ctrl-alt-delete 鍵組合,
- initdefault
- 設定預設執行級別
- powerfail 和 powerokwait
- 用於在發生電源故障和恢復時響應連線的 UPS 裝置的通知
- process
- 要執行的命令
第 5 行 設定 init 的預設執行級別。為了確定預設執行級別,init 程序會搜尋 initdefault 條目,如果沒有這樣的條目(或者根本沒有 /etc/inittab),則必須在系統控制檯上輸入一個執行級別。有 6 個執行級別。在 RedHat 風格的系統上,伺服器的預設執行級別是 3(沒有 GUI)或桌面計算機的 5。
第 8 行 用於 sysinit 操作,此程序會針對每個執行級別執行。
第 10-16 行 定義了應為每個執行級別執行的指令碼。
第 19、25、28 行 定義了在發生指定操作時要執行的程序。這些操作是
- 第 19 行 當按下 ctrl-alt-delete 組合鍵時,計算機將關閉,
- 第 25 行 當收到電源中斷時來自 ups 的訊號時,計算機將在 2 分鐘後關閉,
- 第 28 行 當恢復供電且機器沒有關閉時,計劃的關閉將被取消。
第 32-37 行 生成控制檯登入。它們被設定為在程序死亡時自動重啟。
第 40 行 - 啟動執行級別 5 的圖形登入控制檯
在生成所有指定的程序後,init 會進入休眠狀態,並等待以下三種事件之一發生:- 它啟動的程序結束或死亡、電源故障訊號或透過 /sbin/telinit 請求進一步更改執行級別。
在啟動過程中,核心會載入/探測各種模組以查詢其支援的硬體,從而在程序中產生大量日誌輸出。這些是在系統啟動期間飛過的控制檯訊息。
由於日誌服務尚未啟動,核心將訊息記錄到記憶體中的環形緩衝區。它被稱為環形緩衝區,因為一旦日誌達到設定的記憶體大小,較早的訊息就會被較新的訊息覆蓋。
由於環形緩衝區中的資訊可能會在重啟時或被覆蓋時丟失,因此大多數發行版會將環形緩衝區條目寫入磁碟,具體位置取決於其日誌服務配置,例如 /var/log/dmesg、/var/log/messages 或 /var/log/syslog。
可以使用 dmesg 命令讀取環形緩衝區的內容。這通常與分頁工具(如 less)結合使用,因為環形緩衝區中包含的資料量通常太大,無法在一屏上顯示。
dmesg | less
如果您在啟動過程中硬體配置不正確,則環形緩衝區是查詢線索的好地方,以確定可能存在的問題,因為通常驅動程式會寫入一些錯誤訊息,可以幫助解決問題。
除了環形緩衝區之外,您還可以檢查日誌服務配置的系統日誌檔案。這些檔案位於 /var/log 目錄下,可能是 /var/log/syslog 或 /var/log/messages。
無法啟動到命令提示符
在某些情況下,您可能會在啟動過程中被轉到命令列,並出現訊息提示根裝置無法找到,或者您可以鍵入 Template:Key prass 加上根密碼以執行維護操作。這通常意味著根裝置配置不正確,您可能可以在命令列中解決此問題。
在其他情況下,您可能會收到一條訊息,提示“核心恐慌”,並且機器會自動重啟,或者在不可用狀態下等待,直到重啟。這類問題的起因很多,從 initrd 映象配置不正確到缺少根裝置。系統故障前螢幕上的輸出可以為您提供有關配置錯誤的線索。這可能是由於
- 引導載入程式的配置問題,即它配置為錯誤的根裝置,
- initrd 映象中缺少模組,
- 根檔案系統的配置錯誤。
在引導載入程式配置不正確的情況下,您可以在第二階段按 e 進入引導載入程式編輯器(適用於 grub 載入程式),或者在 lilo 提示符下輸入正確的引數以使計算機啟動,並在系統成功啟動後編輯配置檔案。在其他情況下,可能需要啟動一個 live CD,然後在不掛載的情況下對根檔案系統進行故障排除。
使用的檔案、術語和工具
- /var/log/messages
- dmesg
- BIOS
- 引導載入程式
- 核心
- init
