跳轉到內容

LPI Linux 認證/啟動系統

來自 Wikibooks,開放世界中的開放書籍

101.2 啟動系統

[編輯 | 編輯原始碼]

(LPIC-1 版本 5.0)

權重:3

描述
考生應該能夠引導系統完成啟動過程。

關鍵知識領域

  • 提供引導載入程式的常用命令和啟動時核心的選項
  • 演示從 BIOS/UEFI 到啟動完成的啟動序列的知識
  • 理解 SysVinit 和 systemd。
  • 瞭解 Upstart。
  • 檢查日誌檔案中的啟動事件


以下是使用的檔案、術語和實用程式的列表

  • dmesg
  • journalctl
  • BIOS
  • UEFI
  • 引導載入程式
  • 核心
  • initramfs
  • init
  • SysVinit
  • systemd


啟動過程概述

[編輯 | 編輯原始碼]

當典型的 PC 開機時,BIOS (基本輸入輸出系統) 檢測硬體裝置,包括硬碟驅動器,並透過引導優先順序列表進行檢查。假設我們從硬碟驅動器啟動,它將執行第一個啟動磁碟的 MBR (階段 1 引導載入程式) 中的前 512 位元組程式碼。階段 1 引導載入程式非常基本,其功能是載入階段 2 (或某些情況下為階段 1.5) 引導載入程式。下一步取決於使用的引導載入程式型別。Linux 中有 2 個流行的引導載入程式:LILOGRUB

LILO (LInux LOader) 是一個較舊的引導載入程式,現代 Linux 發行版使用 GRUB 而不是 LILO,但它可能仍在較舊的系統上使用。當 LILO 階段 2 引導載入程式載入時,根據配置,它可能會顯示一個選單,允許使用者指定核心選項。一旦核心選項被指定,GRUB 就會載入核心和 initrd 並執行核心,並將使用者指定的任何引數傳遞給它。重要的是要記住,LILO 不是檔案系統感知的,因此核心和 initrd 是從硬碟驅動器上的預定義位置載入的。

GRUB (GRand Unified Bootloader) 是一個更新、更靈活的引導載入程式。當階段 1.5 載入時,它會讀取 /boot 分割槽並從那裡載入階段 2 引導載入程式。階段 2 引導載入程式從 /boot/grub/grub.conf (RedHat 基於發行版) 或 menu.lst (Debian 基於發行版) 讀取配置,並向用戶提供選項(如果配置為這樣做)。當做出選擇時,它會從 /boot/ 分割槽載入核心和 initrd 並執行它,將使用者傳遞的任何選項傳遞給它。

當核心載入時,它會檢測裝置。它必須執行的任務之一是掛載根分割槽。如果核心中內建了所需的硬體和檔案系統支援,則可以立即完成,並且 /sbin/init 程式將被載入。這種情況非常罕見,大多數現代系統將需要將動態載入的模組載入到核心中才能掛載根分割槽。這些模組包含在初始 RAM 磁碟 (initrd) 中。一旦根分割槽準備就緒,核心就會執行 /sbin/init 程式,該程式繼續載入作業系統。

/sbin/init 是核心啟動的第一個程序,它成為所有其他程序的父程序。通常它會讀取 /etc/inittab 配置檔案,但是,一些更新的替代方案,例如 upstart,不再使用此檔案。在 RedHat 基於系統中,init 將執行 /etc/rc.d/rc.sysinit,而在 Debian 基於系統中,則執行 /etc/init.d/rcS。此指令碼將掛載分割槽並執行基本系統設定。接下來,它將執行位於 /etc/rcX.d/ 中的所有指令碼,其中 X 是執行級別編號。這可能是 /etc/inittab 檔案中指定的預設值,或者管理員提供的編號作為 核心引數。要執行的最後一個指令碼是 /etc/rc.local,它可以用於新增特定於系統的初始化步驟。一旦此指令碼執行完畢,啟動過程就完成了。


引導載入程式配置

[編輯 | 編輯原始碼]

LILO 是一個較舊的引導載入程式,它有一些侷限性。其中之一是核心和 initrd 位置硬編碼到階段 2 引導載入程式中。這意味著每次新增新的核心映像時,管理員都必須執行 /sbin/lilo 命令來重新安裝 LILO;/sbin/lilo 可執行檔案使用的配置檔案位於 /etc/lilo.conf 中,可能如下所示


#begin LILO global section
boot=/dev/hda
bitmap=/boot/image.bmp
bmp-colors=255,0,255,0,255,0
append="vt.default_utf8=0"
map=/boot/System.map
install=/boot/boot.b
prompt
timeout=50
#VESA framebuffer console @ 1246x768x256
vga=773
#end LILO global section
#Linux bootable partition config begins
image=/boot/vmlinuz-2.0.36
	label=linux
	root=/dev/hda2
	read-only
#Linux bootable partition config ends
#second bootable partition config begins...
  • boot - 此引數指定 LILO 將安裝的位置。在上面的示例中,它將是 /dev/hda 磁碟的 MBR (或在某些情況下為 /dev/sda)。
  • bitmap - 它將為您的發行版附加一個自定義背景影像。
  • bmp-colors - 它將設定載入程式的其他背景顏色方案。
  • append - 將在啟動期間為特定設定向核心提供任何其他命令,新增或刪除核心功能或模組。
  • map - 地圖檔案由 LILO 自動生成,並在內部使用。建議不要更改此選項。
  • install - 指定要用於引導扇區的映像。同樣,建議不要更改此引數。
  • prompt - 此選項允許管理員在系統啟動時附加核心命令列選項。
  • timeout - 指定提示超時(以十分之一秒為單位),因此在上面的示例中,超時設定為 5 秒。
  • vga - 在某些系統中,這將指示啟動過程將處於什麼影片解析度。
  • image - 核心位置。(對於單獨的引導部分,使用不同的核心名稱)
  • label - 啟動期間在 LILO 選單中顯示的名稱。
  • root - 根檔案系統位置。
  • read-only - 請參見下面的 核心引數 部分


Grub 在 LILO 上提供了許多優勢。其中之一是它提供了類似 bash 的命令列,該命令列可用於動態更改使用的核心或 initrd 映像。下面列出了示例配置檔案

default         0
timeout         5
title           Debian GNU/Linux, kernel 2.6.26-2-686
root            (hd0,0)
kernel          /vmlinuz-2.6.26-2-686 root=/dev/mapper/Disk-root ro quiet
initrd          /initrd.img-2.6.26-2-686

第一行指定預設映像,在本例中為映像編號 0,這是唯一配置的映像。第二行指定提示超時(以秒為單位)。如果將其設定為 0,grub 將立即啟動預設映像,沒有任何提示。接下來的 4 行定義選單項

  • title - 選單項的名稱
  • root - 要查詢核心和 initrd 的分割槽。在上面的示例中,(hd0,0) 是第一個磁碟上的第一個分割槽
  • kernel - 要載入的核心映像以及 核心引數。核心的位置相對於 root 分割槽的頂部,通常為 /boot (不要與 linux 根分割槽或 / 混淆)
  • initrd - 初始 RAM 磁碟映像。

grub 通常包含許多用於不同核心版本的 title/root/kernel/initrd 集。

核心引數

[編輯 | 編輯原始碼]

如上所述,核心需要一些引數,這些引數可以在 grub、LILO 中配置,或者在系統啟動期間由使用者動態附加。以下是常見核心引數的列表

  • root=<disk> - 指定將被掛載為 / 的根檔案系統。它可以是分割槽 (例如 root=/dev/sda2)、磁碟標籤 (root=LABEL=root_partition) 或邏輯卷 (root=/dev/mapper/vg_root-root)
  • roread-only - 指示核心將根檔案系統以只讀方式掛載。這允許在分割槽以讀寫方式重新掛載之前檢查檔案系統。此選項幾乎在所有情況下使用
  • quiet - 不要將診斷訊息列印到螢幕上
  • single - 將系統引導到單使用者模式 (執行級別 1)
  • console= - 告訴核心將輸出傳送到控制檯。例如,要將其傳送到序列埠,請使用 console=/dev/ttyS0
  • init=/ - 可用於指定 /sbin/init 程序的替代品,例如,要獲取沒有密碼的 root shell,請使用 init=/bin/bash

檢查日誌

[編輯 | 編輯原始碼]

所有核心訊息診斷訊息都被髮送到核心環形緩衝區。可以使用 dmesg 命令檢視其內容,但是輸出可能很繁瑣,最好使用 dmesg | less,使用箭頭鍵垂直滾動,使用 Q 退出 dmesg。請記住,此緩衝區具有有限的容量,當出現新訊息時,最舊的訊息可能會被刪除。一旦所有分割槽被掛載,其中一個 init 指令碼將把核心緩衝區的內容寫入日誌檔案,通常為 /var/log/messages,以便在需要時可以獲得診斷訊息。

[編輯 | 編輯原始碼]
華夏公益教科書