引導檔案

引導檔案

NTLDR一般存放於C糟根目錄下,是一個具有隱藏和唯讀屬性的系統檔案。它的主要職責是解析Boot.ini檔案。如果你對它的理解還不是很清楚,那么下面我們就以Windows XP為例介紹NTLDR在系統引導過程中的作用。 Windows XP在引導過程中將經歷預引導、引導和載入核心三個階段,這與Windows 9X直接讀取引導扇區的方式來啟動系統是完全不一樣的,NTLDR在這三個階段的引導過程中將起到至關重要的作用。

基本介紹

在預引導階段里計算機所做的工作有:運行POST程式,POST將檢測系統的總記憶體以及其他硬體設備的狀況,將磁碟第一個物理扇區載入到記憶體,載入硬碟主引導記錄並運行,主引導記錄會查找活動分區的起始位置。接著活動分區的引導扇區被載入並執行,最後從引導扇區載入並初始化NTLDR檔案。

引導階段

在引導階段中,Windows XP將會依次經歷初始引導載入器階段、作業系統選擇階段、硬體檢測階段以及配置選擇階段這四個小的階段。

(1)在初始引導載入器階段中,NTLDR將把計算機的微處理器從實模式轉換為32位平面記憶體模式,在實模式中,系統會為MS-DOS預留640KB大小的記憶體空間,其餘的記憶體都被看做是擴展記憶體,在32位平面模式中系統將所有記憶體都視為可用記憶體,然後NTLDR執行適當的小型檔案系統驅動程式,這時NTLDR可以識別每一個用NTFS或FAT格式的檔案系統分區,至此初始引導載入器階段結束。

(2)當初始引導載入器階段結束後將會進入作業系統選擇階段,如果計算機上安裝了多個作業系統,由於NTLDR載入了正確的Boot.ini檔案,那么在啟動的時候將會出現要求選擇作業系統的選單,NTLDR正是從boot.ini檔案中查找到系統檔案的分區位置。如果選擇了NT系統,那么NTLDR將會運行NTDETECT.COM檔案,否則NTLDR將載入BOOTSECT.DOS,然後將控制權交給BOOTSECT.DOS。如果Boot.ini檔案中只有一個作業系統或者其中的timeout值為0,那么將不會出現選擇作業系統的選單畫面,如果Boot.ini檔案非法或不存在,那么NTLDR將會嘗試從默認系統卷啟動系統。

小提示:NTLDR啟動後,如果在系統根目錄下發現有Hiberfil.sys檔案且該檔案有效,那么NTLDR將讀取Hiberfil.sys檔案里的信息並讓系統恢復到休眠以前的狀態,這時並不處理Boot.ini檔案。

(3)當作業系統選擇階段結束後將會進入硬體檢測階段,這時NTDETECT.COM檔案將會收集計算機中硬體信息列表,然後將列表返回到NTLDR,這樣NTLDR將把這些硬體信息載入到註冊表“HKEY_LOCAL_MACHINE”中的Hardware中。

(4)硬體檢測階段結束後將會進入配置選擇階段,如果有多個硬體配置列表,那么將會出現配置檔案選擇選單,如果只有一個則不會顯示。

載入核心

在載入核心階段中,NTLDR將載入NTOKRNL.EXE核心程式,然後NTLDR將載入硬體抽象層(HAL.dll),接著系統將載入註冊表中的“HKEY_MACHINESystem”鍵值,這時NTLDR將讀取“HKEY_MACHINESystemselect”鍵值來決定哪一個ControlSet將被載入。所載入的ControlSet將包含設備的驅動程式以及需要載入的服務。再接著NTLDR載入註冊表“HKEY_LOCAL_MACHINESystemservice”下的start鍵值為0的底層設備驅動。當ControlSet的鏡像CurrentControlSet被載入時,NTLDR將把控制權傳遞給NTOSKRNL.EXE,至此引導過程將結束。

小提示:如果在啟動的時候按F8鍵,那么我們將會在啟動選單中看到多種選擇啟動模式,這時NTLDR將根據用戶的選擇來使用啟動參數載入NT核心,用戶也可以在Boot.ini檔案里設定啟動參數。

“BOOT.INI”檔案會在已經安裝了Windows NT/2000/XP的作業系統的所在分區,一般默認為C:下面存在。但是它默認具有隱藏和系統屬性,所以你要設定你的資料夾選項,以便把“BOOT.INI”檔案顯示出來。我們可以用任何一種文本編輯器來打開他它。一般情況下,它的內容如下:

timeout=30

default=multi(0)disk(0)rdisk(0)partition(1)Windows

[operating systems]

multi(0)disk(0)rdisk(0)partition(1)Windows="Microsoft Windows XP Professional" /fastdetect

在Windows 2000或者是XP系統中,我們可以很容易的設定“BOOT.INI”檔案。那就是在“我的電腦”上麵點擊右鍵,選擇“屬性”打開“系統屬性”對話框,再點擊“高級”選項卡,在“啟動和故障修復”裡面點擊“設定”按鈕,就可以打開“啟動和故障修復”對話框了,在這裡面我們就可以對它進行詳細設定。

編輯檔案

如果你擁有Windows XP作業系統,那么你可以用“系統配置實用程式”來更方便的編輯“BOOT.INI”檔案。具體做法是:打開“開始”選單,點擊“運行”命令,再在彈出的文本框中輸入“msconfig”點擊“確定”後就會彈出“系統配置實用程式”,再點擊“BOOT.INI”選項卡,就會出現如圖所示的界面。在這裡,我們可以很方便地設定檔案。

言歸正傳,現在,來說明一下這個檔案內容的含義。

系統載入部分

這一部分很簡單,只有兩個設定。那就是“timeout=”和“default=”。

“timeout=”就是設定開機時系統引導選單顯示的時間,超過設定值則自動載入下面“default=”指定的作業系統。默認值是30,單位為秒。我們可以在這裡面設定等待時間的長短。如果將其設為“0”那么就是不顯示系統引導選單。

“default=”則是設定默認引導的作業系統。而等號後面的作業系統必須是已經在“[operating systems]”中存在的。如果想默認為載入另外的作業系統,我們可以參看“[operating systems]”中的作業系統列表,然後把想要載入的作業系統按照格式寫到“default=”後面就可以了。

作業系統部分

([operating systems])

在這裡面,列出了機器上所安裝的全部作業系統。比如機器上只有一個作業系統,那么就只有一條信息,那就是“multi(0)disk(0)rdisk(0)partition(1)Windows="Microsoft Windows XP Professional" /fastdetect”

在這裡需要注意的是,在英文引號內的文字就是引導作業系統選單時顯示出來的讓我們選擇作業系統的提示文字,在這裡面我們可以隨意更改。而“multi(0)disk(0)rdisk(0)partition(1) Windows”這一句就需要些解釋了。因為它涉及ARC(高級RISC計算機)命名,它是x86或RISC計算機中用於標識設備的動態方法。

ARC命名的第一部分用於標識硬體適配卡/磁碟控制器,它有兩個選項:SCSI和Multi。

Multi表示一個非SCSI硬碟或一個由SCSI BIOS訪問的SCSI硬碟,而SCSI則表示一個SCSI BIOS禁止的SCSI硬碟。(x)是硬體適配卡序號。Disk(x)表示SCSI匯流排號。如果硬體適配卡為Multi,其正確表示方法就為disk(0),rdisk(x)則表示硬碟的序號,如果硬體適配卡為SCSI則忽略此值;

partition(x)表示硬碟的分區序號。了解這些,我們就可以解釋前面那條信息的含義了,即“multi(0)disk(0)rdisk(0)partition(1) Windows”為,在0號非SCSI設備上的第0號磁碟上的第一個分區裡面的“Windows”目錄下可以找到能夠啟動的作業系統。

等號後的內容前面已經說過,那個就是引導選單顯示出來的供我們選擇的提示文字。而後面的“/fastdetect”又是作什麼用的呢?這是一個開關符,用來控制啟動該作業系統時的具體選項,下面再來詳細的介紹各種開關符的含義:

/3GB:這是Win2000 SP3新引入的。這使得用戶區和系統區分為3G比1G的比例。只有用戶使用NT企業版,應用程式也支持3GB選項時,此選項才生效。

/BASEVIDEO:使用標準VGA方式啟動。這種方式主要用於顯示驅動程式失效時。

/BAUDRATE:指出用於調度的波特率,如果用戶不設定,則使用默認的9600,而對於線纜Modem則使用19200。

/BOOTLOG:使Win2000將日誌寫入 %SystemRoot%NTBTLOG.TXT 。

/BURNMEMORY=:使NT在已知的記憶體上少使用指定的數量,如果/burnmemory=64,則有64M記憶體NT不使用。

/CRASHDEBUG:調度器在NT啟動時啟動,只有在核心錯誤時才有用,如果系統經常會無故出錯,這個選項就很有用了。

/DEBUG:在啟動NT時調入調度器,它可以在任何時間激活,在錯誤可以再次出現時使用它比較合適。

/DEBUGPORT= comx :指定用於調度的連線埠,其它X就指連線埠號。

/FASTDETECT:對於Win2000啟動時,它使系統不檢查串列口和並行口。

/HAL=:允許用戶不使用默認的HAL。

/INTAFFINITY:設定多處理器HAL(HALMPS.DLL),使編號最大的處理器接收中斷請求。如果不設定此選項,Win2000會使所有處理器接收中斷請求。

/KERNEL=:與上面的功能相同,不過是針對SMP中的核心而言的。

/MAXMEM:n:指定NT可以使用的最大記憶體數,如果一個記憶體片損壞,這個開關就十分有用了。

/NODEBUG:不使用調試信息。

/NOGUIBOOT:指定此選項會使Win2000不載入VGA驅動程式,也就不會顯示啟動過程和失敗時的蘭屏信息。

/NOSERIALMICE=[COMx | COMx,y,z…]:在特定的COM中上禁止對串列滑鼠的檢測。如果用戶有一個非滑鼠設備接在COM口上,這個選項會十分有用。如果此開關未加參數,系統會禁止所有COM口。

/NUMPROC=n:只允許前N個系統處理器工作。

/ONECPU:在多處理器中只使用一個處理器。

/PCILOCK:不讓NT為PCI設定分配IO/IRQ資源,而啟用BIOS設定。

/SAFEBOOT:安全啟動,這個大家一定十分熟悉,Win2000隻啟動HKLMSystemCurrentControlSet

ControlSafeBoot中的驅動程式和服務,其後跟三個參數MINIMAL,NETWORK或DSREPAIR之一。MINIMAL和NETWORK在允許網路下啟動系統。而DSREPAIR要求系統從備份設備中調入活動目錄的設定。還有一個選項是"(ALTERNATESHELL)",它讓系統調入由HKLMSystemCurrentControlSet

SafeBootAlternateShell指定的SHELL程式,而不使用默認的Explorer。

/SOS:在調入驅動程式名時顯示它的名字,在因驅動問題而無法啟動時使用比較好。

/WIN95:在裝有三個系統DOS、Win9x和Windows NT的系統上,讓NTLDR直接調用Win9x。啟動檔案BOOTSECT.W40。

/WIN95DOS:在裝有三個系統DOS、Win9x和Windows NT的系統上,讓NTLDR直接調用DOS啟動檔案BOOTSECT.DOS

/YEAR=:使用指定的年份,如果設定為/YEAR=2005,那現在的時間就是2005年,此選項僅對NT4+SP4和Win2000生效。

Vista SP1以後引導檔案發生改變

此處轉自Win Vista系統的幫助和支持

boot.ini檔案發生了什麼變化?

在 Windows 的較早版本中,boot.ini是系統檔案,它包含有關計算機上安裝的 Windows作業系統的信息。當您打開計算機時,在啟動的過程中顯示該信息。它在多重引導配置中或者對於需要自定義 Windows 啟動方式的高級用戶或管理員最有用。

在此版本的 Windows 中,boot.ini檔案已經替換為啟動配置數據 (BCD)。該檔案比boot.ini功能多,它可套用於使用其他方式而非基本輸入/輸出系統 (BIOS) 的計算機平台來啟動計算機。

如果您需要對 BCD 進行更改(如從顯示的作業系統列表中刪除條目),請使用命令行工具Bcdedit,它是專門用於管理員和 IT 專業人員的高級工具。有關Bcdedit的技術信息,請轉到Microsoft IT 專業人員網站。

如果您的計算機是多重引導配置,您仍然可以通過使用“控制臺”中的“系統”來更改默認情況下打開哪個 Windows作業系統以及顯示作業系統列表的時間。

單擊打開“系統”。

在左窗格中,單擊“高級系統設定”。 如果系統提示您輸入管理員密碼或進行確認,請鍵入密碼或提供確認。

單擊“高級”選項卡,然後在“啟動和故障恢復”下單擊“設定”。

在“系統啟動”下,選擇默認的作業系統以及顯示作業系統列表所需的時間,然後單擊“確定”。

Uinx和Linux系統下引導檔案由於開源的方式引導可以用不同的程式常見的有Grub和Lilo

引導過程

下面轉Linux 引導過程內幕(排版式修改)

從主引導記錄到第一個用戶空間應用程式的指導

級別: 初級

M. Tim Jones ,顧問工程師, Emulex

2006 年 7 月 26 日

引導

Linux® 系統的過程包括很多階段。不管您是引導一個標準的 x86桌面系統,還是引導一台嵌入式的 PowerPC® 機器,很多流程都驚人地相似。本文將探索 Linux 的引導過程,從最初的引導到啟動第一個用戶空間應用程式。在本文介紹的過程中,您將學習到各種與引導有關的主題,例如引導載入程式、核心解壓、初始 RAM 磁碟以及 Linux 引導的其他一些元素。

早期時,啟動一台計算機意味著要給計算機餵一條包含引導程式的紙帶,或者手工使用前端面板地址/數據/控制開關來載入引導程式。儘管目前的計算機已經裝備了很多工具來簡化引導過程,但是這一切並沒有對整個過程進行必要的簡化。

讓我們先從高級的視角來查看 Linux 引導過程,這樣就可以看到整個過程的全貌了。然後將回顧一下在各個步驟到底發生了什麼。在整個過程中,參考一下核心原始碼可以幫助我們更好地了解核心原始碼樹,並在以後對其進行深入分析。

概述

圖 1 是我們在 20,000 英尺的高度看到的視圖。

圖 1. Linux 引導過程在 20,000 英尺處的視圖

當系統首次引導時,或系統被重置時,處理器會執行一個位於已知位置處的代碼。在個人計算機(PC)中,這個位置在基本輸入/輸出系統(BIOS)中,它保存在主機板上的快閃記憶體中。嵌入式系統中的中央處理單元(CPU)會調用這個重置向量來啟動一個位於快閃記憶體/ROM 中的已知地址處的程式。在這兩種情況下,結果都是相同的。因為 PC 提供了很多靈活性,BIOS 必須確定要使用哪個設備來引導系統。稍後我們將詳細介紹這個過程。

當找到一個引導設備之後,第一階段的引導載入程式就被裝入 RAM 並執行。這個引導載入程式在大小上小於 512位元組(一個扇區),其作用是載入第二階段的引導載入程式。

當第二階段的引導載入程式被裝入 RAM 並執行時,通常會顯示一個動畫螢幕,並將 Linux 和一個可選的初始 RAM磁碟(臨時根檔案系統)載入到記憶體中。在載入映像時,第二階段的引導載入程式就會將控制權交給核心映像,然後核心就可以進行解壓和初始化了。在這個階段中,第二階段的引導載入程式會檢測系統硬體、枚舉系統連結的硬體設備、掛載根設備,然後載入必要的核心模組。完成這些操作之後啟動第一個用戶空間程式(init),並執行高級系統初始化工作。

這就是 Linux 引導的整個過程。現在讓我們深入挖掘一下這個過程,並深入研究一下 Linux 引導過程的一些詳細信息。

系統啟動

系統啟動階段依賴於引導 Linux 系統上的硬體。在嵌入式平台中,當系統加電或重置時,會使用一個啟動環境。這方面的例子包括U-Boot、RedBoot 和 Lucent 的 MicroMonitor。嵌入式平台通常都是與引導監視器搭配銷售的。這些程式位於目標硬體上的快閃記憶體中的某一段特殊區域,它們提供了將 Linux核心映像下載到快閃記憶體並繼續執行的方法。除了可以存儲並引導 Linux 映像之外,這些引導監視器還執行一定級別的系統測試和硬體初始化過程。在嵌入式平台中,這些引導監視器通常會涉及第一階段和第二階段的引導載入程式。

提取 MBR 的信息

要查看 MBR 的內容,請使用下面的命令:

# dd if=/dev/hda of=mbr.bin bs=512 count=1 # od -xa mbr.bin

這個 dd 命令需要以 root 用戶的身份運行,它從 /dev/hda(第一個 IDE 盤) 上讀取前 512 個位元組的內容,並將其寫入 mbr.bin 檔案中。od 命令會以十六進制和 ASCII 碼格式列印這個二進制檔案的內容。

在 PC 中,引導 Linux 是從 BIOS 中的地址 0xFFFF0 處開始的。BIOS 的第一個步驟是加電自檢(POST)。POST 的工作是對硬體進行檢測。BIOS 的第二個步驟是進行本地設備的枚舉和初始化。

給定 BIOS 功能的不同用法之後,BIOS 由兩部分組成:POST 代碼和運行時服務。當 POST 完成之後,它被從記憶體中清理了出來,但是 BIOS 運行時服務依然保留在記憶體中,目標作業系統可以使用這些服務。

要引導一個作業系統,BIOS 運行時會按照 CMOS 的設定定義的順序來搜尋處於活動狀態並且可以引導的設備。引導設備可以是軟碟、CD-ROM、硬碟上的某個分區、網路上的某個設備,甚至是 USB 快閃記憶體。

通常,Linux 都是從硬碟上引導的,其中主引導記錄(MBR)中包含主引導載入程式。MBR 是一個 512 位元組大小的扇區,位於磁碟上的第一個扇區中(0 道 0 柱面 1 扇區)。當 MBR 被載入到 RAM 中之後,BIOS 就會將控制權交給 MBR。

第一階段引導載入程式

MBR 中的主引導載入程式是一個 512 位元組大小的映像,其中包含程式代碼和一個小分區表(參見圖 2)。前 446 個位元組是主引導載入程式,其中包含可執行代碼和錯誤訊息文本。接下來的 64 個位元組是分區表,其中包含 4 個分區的記錄(每個記錄的大小是 16 個位元組)。MBR 以兩個特殊數字的位元組(0xAA55)結束。這個數字會用來進行 MBR 的有效性檢查。

圖 2. MBR 剖析

主引導載入程式的工作是查找並載入次引導載入程式(第二階段)。它是通過在分區表中查找一個活動分區來實現這種功能的。當找到一個活動分區時,它會掃描分區表中的其他分區,以確保它們都不是活動的。當這個過程驗證完成之後,就將活動分區的引導記錄從這個設備中讀入 RAM 中並執行它。

第二階段引導載入程式

次引導載入程式(第二階段引導載入程式)可以更形象地稱為核心載入程式。這個階段的任務是載入 Linux核心和可選的初始 RAM 磁碟。

GRUB 階段引導載入程式

/boot/grub 目錄中包含了 stage1、stage1.5 和 stage2 引導載入程式,以及很多其他載入程式(例如,CR-ROM 使用的是 iso9660_stage_1_5)。

在 x86 PC 環境中,第一階段和第二階段的引導載入程式一起稱為 Linux Loader(LILO)或 GRand Unified Bootloader(GRUB)。由於 LILO 有一些缺點,而 GRUB 克服了這些缺點,因此下面讓我們就來看一下 GRUB。(有關 GRUB、LILO 和相關主題的更多內容,請參閱本文後面的 參考資料 部分的內容。)

關於 GRUB,很好的一件事情是它包含了有關 Linux 檔案系統的知識。GRUB 不像 LILO 一樣使用裸扇區,而是可以從 ext2 或 ext3 檔案系統中載入 Linux 核心。它是通過將兩階段的引導載入程式轉換成三階段的引導載入程式來實現這項功能的。階段 1 (MBR)引導了一個階段 1.5 的引導載入程式,它可以理解包含 Linux 核心映像的特殊檔案系統。這方面的例子包括 reiserfs_stage1_5(要從 Reiser 日誌檔案系統上進行載入)或 e2fs_stage1_5(要從 ext2 或 ext3 檔案系統上進行載入)。當階段 1.5 的引導載入程式被載入並運行時,階段 2 的引導載入程式就可以進行載入了。

當階段 2 載入之後,GRUB 就可以在請求時顯示可用核心列表(在 /etc/grub.conf 中進行定義,同時還有幾個軟符號連結/etc/grub/menu.lst 和 /etc/grub.conf)。我們可以選擇核心甚至修改附加核心參數。另外,我們也可以使用一個命令行的 shell 對引導過程進行高級手工控制。

將第二階段的引導載入程式載入到記憶體中之後,就可以對檔案系統進行查詢了,並將默認的核心映像和 initrd 映像載入到記憶體中。當這些映像檔案準備好之後,階段 2 的引導載入程式就可以調用核心映像了。

核心

GRUB 中的手工引導

在 GRUB 命令行中,我們可以使用 initrd 映像引導一個特定的核心,方法如下:

grub> kernel /bzImage-2.6.14.2

[Linux-bzImage, setup=0x1400, size=0x29672e]

grub> initrd /initrd-2.6.14.2.img

[Linux-initrd @ 0x5f13000, 0xcc199 bytes]

grub> boot

Uncompressing Linux... Ok, booting the kernel.

如果您不知道要引導的核心的名稱,只需使用斜線(/)然後按下 Tab 鍵即可。GRUB 會顯示核心和 initrd 映像列表。

當核心映像被載入到記憶體中,並且階段 2 的引導載入程式釋放控制權之後,核心階段就開始了。核心映像並不是一個可執行的核心,而是一個壓縮過的核心映像。通常它是一個 zImage(壓縮映像,小於 512KB)或一個 bzImage(較大的壓縮映像,大於 512KB),它是提前使用 zlib 進行壓縮過的。在這個核心映像前面是一個例程,它實現少量硬體設定,並對核心映像中包含的核心進行解壓,然後將其放入高端記憶體中,如果有初始 RAM 磁碟映像,就會將它移動到記憶體中,並標明以後使用。然後該例程會調用核心,並開始啟動核心引導的過程。

當 bzImage(用於 i386 映像)被調用時,我們從 ./arch/i386/boot/head.S 的 start 彙編例程開始執行(主要流程圖請參看圖 3)。這個例程會執行一些基本的硬體設定,並調用 ./arch/i386/boot/compressed/head.S 中的 startup_32 例程。此例程會設定一個基本的環境(堆疊等),並清除 Block Started by Symbol(BSS)。然後調用一個叫做 decompress_kernel 的 C 函式(在 ./arch/i386/boot/compressed/misc.c 中)來解壓核心。當核心被解壓到記憶體中之後,就可以調用它了。這是另外一個 startup_32 函式,但是這個函式在 ./arch/i386/kernel/head.S 中。

在這個新的 startup_32 函式(也稱為清除程式或進程 0)中,會對頁表進行初始化,並啟用記憶體分頁功能。然後會為任何可選的浮點單元(FPU)檢測 CPU 的類型,並將其存儲起來供以後使用。然後調用 start_kernel 函式(在 init/main.c 中),它會將您帶入與體系結構無關的 Linux核心部分。實際上,這就是 Linux核心的 main 函式。

圖 3. Linux核心i386 引導的主要函式流程

通過調用 start_kernel,會調用一系列初始化函式來設定中斷,執行進一步的記憶體配置,並載入初始 RAM 磁碟。最後,要調用 kernel_thread(在 arch/i386/kernel/process.c 中)來啟動 init 函式,這是第一個用戶空間進程(user-space process)。最後,啟動空任務,現在調度器就可以接管控制權了(在調用 cpu_idle 之後)。通過啟用中斷,搶占式的調度器就可以周期性地接管控制權,從而提供多任務處理能力。

在核心引導過程中,初始 RAM 磁碟(initrd)是由階段 2 引導載入程式載入到記憶體中的,它會被複製到 RAM 中並掛載到系統上。這個 initrd 會作為 RAM 中的臨時根檔案系統使用,並允許核心在沒有掛載任何物理磁碟的情況下完整地實現引導。由於與外圍設備進行互動所需要的模組可能是 initrd 的一部分,因此核心可以非常小,但是仍然需要支持大量可能的硬體配置。在核心引導之後,就可以正式裝備根檔案系統了(通過 pivot_root):此時會將 initrd 根檔案系統卸載掉,並掛載真正的根檔案系統。

decompress_kernel 輸出

函式 decompress_kernel 就是顯示我們通常看到的解壓訊息的地方:

Uncompressing Linux... Ok, booting the kernel.

initrd 函式讓我們可以創建一個小型的 Linux核心,其中包括作為可載入模組編譯的驅動程式。這些可載入的模組為核心提供了訪問磁碟和磁碟上的檔案系統的方法,並為其他硬體提供了驅動程式。由於根檔案系統是磁碟上的一個檔案系統,因此 initrd 函式會提供一種啟動方法來獲得對磁碟的訪問,並掛載真正的根檔案系統。在一個沒有硬碟的嵌入式環境中,initrd 可以是最終的根檔案系統,或者也可以通過網路檔案系統(NFS)來掛載最終的根檔案系統。

Init

當核心被引導並進行初始化之後,核心就可以啟動自己的第一個用戶空間應用程式了。這是第一個調用的使用標準 C 庫編譯的程式。在此之前,還沒有執行任何標準的 C應用程式。

在桌面Linux 系統上,第一個啟動的程式通常是 /sbin/init。但是這不是一定的。很少有嵌入式系統會需要使用 init 所提供的豐富初始化功能(這是通過 /etc/inittab 進行配置的)。在很多情況下,我們可以調用一個簡單的 shell腳本來啟動必需的嵌入式應用程式。

結束語

與 Linux 本身非常類似,Linux 的引導過程也非常靈活,可以支持眾多的處理器和硬體平台。最初,載入引導載入程式提供了一種簡單的方法,不用任何花架子就可以引導 Linux。LILO 引導載入程式對引導能力進行了擴充,但是它卻缺少檔案系統的感知能力。最新一代的引導載入程式,例如 GRUB,允許 Linux 從一些檔案系統(從 Minix 到 Reise)上進行引導。

Linux引導grub和lilo的基本知識作者vivelo

目前,PC的性能越來越強大,尤其是超大容量的硬碟使我們有足夠的地方去安裝多個作業系統。Linux下最常用的多重啟動軟體就是LILO和Grub。

LILO是現在許多Linux預設的引導程式,它的全稱是Linux Loader,擁有很強大的功能。Grub 也是一個多重啟動管理器,它的全稱是Grand Unified Bootloader。Grub的功能與LILO一樣,也是在多個作業系統共存時選擇引導哪個系統。它可以引導很多PC上常用的作業系統,其中就有Linux、FreeBSD、Solaris、Windows 9x、Windows NT;可以載入作業系統的核心和初始化作業系統;可以把引導權直接交給作業系統來完成引導;可以直接從FAT、minix、FFS、ext2或ext3分區讀取Linux核心。Grub 有一個特殊的互動式控制台方式,可以手工裝入核心並選擇引導分區。

初識

Grub和LILO

Grub與LILO的優缺點

由於Grub出現要比LILO晚,所以它可以實現LILO的絕大部分功能,可以代替LILO來完成對Linux的引導,特別適用於Linux與其它作業系統共存情況。

◆ 8.4GB問題

以前大多數Linux所帶較舊版本的LILO都有這樣的一個問題:啟動/boot分區不能分在超過1023柱面的地方,一般是在8.4GB左右的地方,否則LILO不能安裝,或者安裝後不能正確引導系統。Grub就不會出現這種情況,只要安裝時大硬碟是在LBA模式下,它就可以引導根分區在8GB以外的作業系統。如今,在LILO較新的版本中這個問題已經做了很好處理。

◆ 漂亮的Logo

Grub引導開機顯示一個漂亮的開機畫面,它可以是640×480、800×600、1024×768等各種模式畫面, 而且可以支持自動選擇最佳圖像模式。Linux愛好者可以通過改變這幅圖片來製作個性化開機畫面。

LILO源於文字界面,因此它在最新的版本中對開機畫面的支持也是很有限的。

◆ 執行模式

Grub不但可以通過配置檔案進行引導,還可以在選擇引導前動態改變引導參數,動態載入各種設備。例如,在Linux下編譯了一個新的核心,但不能確定它能不能工作,就可以在引導時動態改變Grub的參數,此時即使Grub選單配置不正確,但仍可以引導系統。Grub的命令行有非常強大的功能,而且支持如bash一樣的歷史功能,可以用上下鍵來尋找以前的命令。LILO就不支持這種模式。

在LILO下,既可以手工輸入作業系統的名字來引導不同的作業系統,也可使用一個選單來選擇不同的系統進行引導。Grub也兼容以上的操作。

◆ 分區對Grub與LILO的影響

LILO是通過讀取硬碟上的絕對扇區來裝入作業系統,因此每次分區改變都必須重新配置LILO,如果調整了分區的大小及分區的分配,那么LILO在重新配置之前就不能引導這個分區的作業系統了。而Grub是通過檔案系統直接把核心讀取到記憶體,因此只要作業系統核心的路徑沒有改變,Grub就可以引導系統。

Grub和LILO支持多種外部設備,支持多種檔案系統,動態裝載作業系統核心,甚至可以通過網路裝載作業系統核心。Grub還支持多種執行檔格式,支持自動解壓,可以引導不支持多重引導的作業系統等。

Grub和LILO的參數比較

1.安裝

敲入“makebootable”命令,就可以安裝Grub。而“lilo -v”則是重新安裝LILO。LILO引導扇區包括一個分區表的空間,所以LILO既可以安裝在MBR中,也可以安裝在某個分區的引導扇區。Grub和LILO同時都可以安裝在軟碟之中。製作Grub的啟動盤和製作LILO的啟動盤相差不大。

要製作引導盤,需執行一些簡單的步驟。首先確定Grub或LILO已經安裝,並且在新的軟碟上創建 ext2檔案系統。然後進行安裝,將一張空盤插入軟碟機,輸入:

#mke2fs /dev/fd0

創建了ext2檔案系統後,需要安裝該檔案系統。

(1)安裝Grub

進入Grub的目錄:

#cd /boot/grub

放入一張軟碟,執行以下命令:

#dd if=stage1 of=/dev/fd0 bs=512 count=1

#dd if=stage2 of=/dev/fd0 bs512 seek=1

Grub啟動盤就完成了。

(2)安裝LILO

#dd if=/dev/hda of=/dev/fd0 bs=512 count=1(因為LILO已經安裝在MBR中)

執行上述命令後LILO啟動盤就完成了。

Grub啟動時,會在/boot/grub/中尋找一個名字為menu.lst的配置檔案,如果找不到此檔案則不進入選單模式直接進入命令行模式。menu.lst 是一個文本檔案,可以用任何一個文本編輯器打開它。每一行代表一個配置命令,如果一行的第一個字元為“#”,則表明這一行為注釋,可以簡單地用增加或減少注釋行來改變配置。LILO使用一個文本檔案/etc/lilo.conf作為其配置檔案。LILO讀取lilo.conf,按照其中的參數將特定的LILO寫入系統引導區。如果修改了/etc/lilo.conf,就必須重新運行LILO命令,以保證LILO正常運行。

Grub和LILO有很多的相似的參數,見表1所示。

表1 Grub和LILO參數比較

相似功能 Grub的具體參數 LILO的具體參數

在second秒之後引導默認的作業系統timeout second timeout=tsecs

默認啟動選項 default num default=name

指定作業系統的名字和描述 title OS mode label

指出linux核心的路徑 Kernel image

指出開機畫面的檔案所存放的路徑和檔案名稱 Splash pathname/filename message=message-file

配置

(1)Grub和LILO共同的配置(括弧內為LILO的參數)

指定引導默認的作業系統的等待時間:

timeout second(timeout=tsecs)

上面代碼表明設定second秒之後引導默認的作業系統。如果是timeout 5,就是5秒沒有其它指令就引導系統;如果設成-1,則Grub會一直等待直到用戶選擇一個選項為止。

LILO中,timeout=50同樣設定等待鍵盤輸入的時長,單位是0.1秒。超過這段時間沒有輸入則為逾時,系統將自動引導預設的作業系統。如果不設定本參數,預設的逾時時間長度為無窮大。

指定引導的默認作業系統:

default num(default=name)

Grub中默認啟動第num+1行的作業系統,default=1則啟動第2個系統。LILO中是通過default=name指定預設引導的作業系統,如default=LINUX表示將label為Linux的系統作為預設引導的作業系統。如不指定該參數,排在lilo.conf中的第一個作業系統將作為預設作業系統。

指定引導的作業系統的核心:

Kernel(image)

給Grub指定核心在哪兒,還要指出哪個檔案是核心檔案。例如kernel /boot/vmlinuz-2.2.16 root=/dev/hda7 ro說明/boot/vmlinuz-2.2.16 就是要載入的核心,後面的都是傳遞給核心的參數。root=/dev/hda7就是Linux根分區的所在分區,ro以唯讀的方式打開。 LILO中是以image=filename來指定含有一個Linux核心的啟動選項的檔案或設備。

指定引導作業系統時的信息檔案:

Splash pathname/filename(message=message-file)

上面代碼指出Grub開機畫面檔案所存放的路徑和檔案名稱。LILO中,message=message-file命令用於指定一個包含注釋信息的檔案,該檔案將在系統“LILO”之前顯示。如果在LILO啟動時想獲取較多的信息,可以編輯這個檔案,再使用該命令就可以了。檔案中如果包含有ASCⅡ碼為0xFF的字元(Ctrl+L)則表示清屏。注意,檔案的大小不能超過65535個位元組。每次檔案改變之後,都必須重新運行LILO命令重建map檔案,以保證其正常顯示。

指定引導作業系統的名稱:

title OS mode(label)

上面代碼指出的字元就是Grub選單項上所看見的選項,你可以寫上作業系統的名字和描述,如用 title Linux、 Single Mode代表這一選項是引導此Linux的單用戶模式。在LILO中,label=name通過此參數來標識當前作業系統,即作業系統名。用戶可通過在LILO提示後輸入name來引導特定的作業系統。

(2)LILO的配置信息

在LILO.conf中,最多有16個作業系統選項,它比Grub有更大的靈活性。LILO.conf配置檔案主要分為兩部分:一部分是全局配置;另一部分是引導配置,“#”表示注釋。

◆ LILO的全局配置

全局參數是全程有效的,它可以出現在檔案LILO.conf中的任何地方。

指定引導作業系統檔案的備份:

backup=backup-file

force-backup=backup-file

install= file

在裝入LILO之前,將原先的引導區備份到backup-file。它可以備份到一個設備上,用戶可以通過dd if=/boot/boot.bak of=/dev/hda bs=446 count=1恢復原先的MBR。force-backup=backup-file類似“backup”,但是會覆蓋原有的同名檔案。install=file將指定的檔案作為新的引導扇區來安裝,若未設定install選項,則將boot/boot.b作為默認預設值使用。

指定一個用於安裝LILO的設備:

boot=boot-device

上面代碼指定一個用於安裝LILO的設備。通常LILO可安裝在如下幾個地方:

MBR:第一個硬碟的主引導區, 對應於/dev/hda、/dev/sda或者是/dev/hda0等。

Root: Linux根分區“/”上。

Floppy: LILO安裝在軟碟上,對應於/dev/fd0。LILO預設安裝在根分區超級塊上。

指定用於最佳化壓縮LILO:

compact

該參數用於最佳化壓縮LILO,讓LILO把相鄰扇區的多次讀取請求合併成一次讀取請求,從而使MAP檔案更小。因此,從軟碟機讀取時推薦使用 compact 選項。

指定強制LILO等待用戶的鍵盤輸入:

prompt

delay=tsecs

prompt forces

prompt給出“boot:”提示,強制LILO等待用戶的鍵盤輸入,按下回車鍵則立即引導默認的作業系統;按下Tab顯示可供選擇的作業系統。大多數情況下,如果有多個作業系統應該使用參數,這樣留給用戶一個選擇的餘地。在沒有指定“prompt”參數時,LILO將立即引導預設的作業系統。“delay”參數在這之間插入一段延時,單位是1/10秒。如果未設定delay選項或設為0,則引導裝入程式就不會等待。prompt forces不等待任何的按鍵事件發生,就直接進入啟動提示符模式。如果設定了prompt選項而沒設定timeout選項,則不能自行啟動。

指定非標準硬碟的具體參數:

disk=device-name

上面代碼指定了非標準硬碟的具體參數。它有以下的幾個參數:bios,設備號;sectors,硬碟扇區數;heads,硬碟磁頭數;cylinders,硬碟柱面數;partition,用於物理定位特殊硬碟上的分區;start,每一分區的起始扇區。

指定磁碟的物理性能指標:

linear

table=device

fix-table

ignore-table

linear產生線性扇區地址,而非“扇區/磁頭/柱面”地址的linear扇區地址。因此,linear地址在運行時不依賴於硬碟參數。注意,在將LILO安裝到軟碟上時不能使用“linear”參數。table指定含有分區表的設備;若未指定該參數,引導裝入程式就不會把分區信息傳送到已啟動的操做系統。若一個已定位且引用了table選項的分區表被修改則必須重新運行LILO。fix-table選項使得LILO可對分區表上的扇區/磁頭/柱面,以及線性地址進行調整,從而建立每個分區表入口、包含有該分區的最前和最後一個扇區的扇區/磁頭/柱面及線性地址。ignore-table通知LILO忽略無效的硬碟分區表。

指定map檔案:

Lock

map=map-file

指定map檔案,沒有本項時預設使用/boot/map,每次改動LILO都應產生一個新的與之相關map檔案。Lock是告訴LILO,提示後立即按上一次的引導映像啟動計算機。允許自動記錄引導命令行,作為以後啟動的默認預設值。

當用於啟動的引導映像不存在時,使用optional參數使LILO忽略它。這對用於測試一個不長期存在的Linux核心是有用的。

指定LILO設定口令保護:

password=password

restricted

上面代碼為LILO設定口令保護,每次重新啟動計算機提示用戶輸入口令。因為這個密碼是明文的,設定了口令後建議將LILO.conf的檔案屬性改為000,以免讓非root用戶看到口令。restricted 與password聯用,使“password”僅作用於在LILO提示後有參數輸入的時候。

指定串列口控制器的參數:

serial=parameters (port, bps,parity,bits)

這將初始化指定的串口,並將使引導管理器能接收來自串口的輸入。

參數如下:

〈port〉 表示的串口號。

〈bps〉 串口速率。

〈parity〉設定串口校驗。一般情況下,LILO忽略奇偶校驗。n表示無校驗,e表示偶校驗,o表示奇校驗。

〈bits〉字元位數,只能取7或8,預設值是8。當有奇偶校驗時只能取7。

用下面命令可以打開進程報告:

verbose=level

append=string

數目越大給出的冗長輸出越多。如果在LILO命令行中附加參數-v,則冗長標準也相應增加,最大的冗長標準是5。

append傳遞一個特殊硬體的參數串string給Linux系統的核心。它常用來配置一些Linux不能正確測試到的硬體設備。例如:append = “hda=128,64,200”指明該硬碟為128柱面、64磁頭、200扇區。

指定RAM盤的大小:

ramdisk=size

size為零時不建立RAM盤。忽略此參數時,RAM盤大小由Linux核心引導程式決定。

指定以何種讀寫方式載入根檔案系統:

read-only

read-write

從字面上可以知道它們分別是通知LILO以唯讀方式載入根檔案系統,以讀寫方式載入根檔案系統。

指定LILO引導Linux系統時的VGA模式:

vga=mode

指定LILO引導Linux系統時的VGA模式,有以下的參數值:

normal 常規80×25文本模式。

extended 80×50文本模式。

ask

引導時詢問用戶使用哪一種VGA模式,這時敲回車鍵將顯示一個可分配的VGA模式表。如果不指定VGA模式,系統將預設地使用包含在系統核心里的VGA模式值。

◆ 引導配置

引導映像參數作用於每一個引導區。

設定包含Linux核心引導映像的檔案或設備:

image=pathname

設定包含非Linux作業系統:

other=pathname

如DOS、Windows 95等系統引導的檔案或設備,以提示啟動其它獨立的系統。

range=start-end

alias=name

loader=chain-loader

如果“image”參數被設定為一個設備,則Linux核心引導程式的存放範圍必須被range=start-end設定。alias給當前作業系統起一別名。loader=chain-loader指定LILO所需要的特定的引導程式,預設值是/boot/chain.b。

LILO運行時會給出一些提示信息,這些信息對於深刻地了解Bootloader是很有益的。表2羅列了一些錯誤信息供參考。

表2 LILO出錯信息

LILO出錯信息 代表的意義

LILO提示信息 NULL LILO沒有安裝或者安裝lILO的分區沒有被激活

L LILO的第一部分已經被裝入並運行了,但它不能裝入第二部分的引導程式。這種情況通常發生在介質訪問失敗或硬碟參數錯誤。

LI LILO第一部分正確,但是第二部分執行時出錯。一般是硬碟參數有誤或/boot/boot.b與map程式不相匹配。

LIL LILO第二部分開始執行,但是不能從“map”檔案中讀取描述符表(Descriptor Table)。磁碟介質錯誤或磁碟參數有誤。

LIL? LILO在錯誤的地方載入。

LIL- 描述符表錯誤。硬碟參數的不匹配或/boot/boot.b與map程式不相匹配。

磁碟錯誤碼0x00 由LILO扇區讀取子程式產生。map檔案被破壞,或者當使用“linear”參數時訪問超出1024的柱面。

0x01 LILO訪問了BIOS不支持的硬碟。

0x02 磁碟介質出現問題。

0x03 磁碟介質防寫錯。

0x04 磁碟扇區未找到,硬碟參數錯誤。

0x05 磁碟激活順序改變。

0x06 磁碟錯誤的介質。

0x07 無效的初始化,BIOS沒有適當地初始化硬碟。

0x08 DMA超出限度。

0x09 DMA試圖越過64KB邊界。由於“compact”參數造成。

0x0C 無效的磁碟介質。

0x010 “CRC錯誤”,檢測到介質錯誤。建議多啟動幾次,運行map安裝程式,把map檔案從壞塊寫到正常的介質上。

0x11 ECC糾正成功。讀錯誤發生然後被糾正,但是LILO並不知道這個情況,終止了啟動過程。

0x20 磁碟控制器錯誤。

0x40 磁碟定位失敗,磁碟介質問題。

0x80 磁碟逾時。磁碟或驅動器沒有準備好,介質壞了或沒有磁碟。

0xBB BIOS錯誤。磁碟與BIOS配置不符。

(3)Grub配置信息

與LILO相比,Grub有更強的互動性。下面就以它的命令來理解這個bootloader 。

進入選單,按“e”是編輯啟動命令,按“c”是使用命令行。按“e”鍵可以編輯所選項的啟動命令,用這個功能可以臨時改變系統的啟動參數。

要啟動一個作業系統,首先指定引導哪個分區上的系統,例如要引導第一個硬碟上的第一個分區的作業系統,先鍵入:

grub>root (hd0,0)

如果要啟動的是Windows系統,鍵入:

grub>chainloader (hd0,0)+1

注意,(hd0,0)要隨著硬碟和分區的不同而改變。

如果要引導Linux或其它系統,應鍵入:

grub>kernel (hd0,6)/boot/vmlinuz root=/dev/hda7

注意,磁碟參數也要隨著硬碟和分區的不同而改變,如從第二個硬碟的第一個分區引導則用hdb1,最後敲入boot就可以啟動系統了。

在不能確定命令或者命令的參數時,都可以按“Tab”獲得相關的幫助;用上下鍵可以獲得命令的歷史記錄,這些就像在Linux中使用bash一樣簡單。也可以鍵入啟動命令,然後boot就可以引導系統了。

Grub下生成引導盤:

grub> root (fd0)

grub> setup (fd0)

grub> quit

如果要把Grub裝到硬碟上,也很容易。如果安裝到MBR,則可以指定整個磁碟而不必指定分區,如下(對於hda):

grub> setup (hd0)

如果要將Grub安裝到/dev/hda7的引導記錄中,應輸入:

grub> setup (hd0,6)

綜上所述,LILO要求用戶十分明白每個參數才能很好地掌握;而Grub則更加看中用戶的互動性,兩者在bootloader中不分伯仲。

實例

下面就以我的lilo.conf為例,把它翻譯成Grub的menu.lst檔案。

lilo.conf:

#The lilo.conf of the writer

boot=/dev/hda

map=/boot/map

install=/boot/boot.b

message=/boot/cosixmsg //指出開機畫面的檔案所存放的路徑和檔案名稱

prompt

password = wudi //密碼是wudi

timeout=50 //在5秒之後引導默認的作業系統

default=dos //默認啟動選項dos

image=/boot/vmlinuz-2.2.16-3 //指出Linux核心的路徑

label=linux //指定作業系統的名字Linux

vga=0x301

read-only

root=/dev/hda7

other=/dev/hda1 //指定作業系統的名字DOS

label=dos

翻譯後的menu.lst檔案:

timeout 5 //在5秒之後引導默認的作業系統

default 1 //默認啟動選項dos

# → linux ← //指定作業系統的名字LINUX

title linux root (hd0,6) kernel /boot/vmlinuz-2.2.16 root=/dev/hda7 ro

initrd /boot/initrd-2.2.16.gz

# → linux END ←

# → dos ← //指定作業系統的名字DOS

title dos root (hd0,0) chainloader +1

# → dos END ←

通過以上對Grub和LILO的講解,讀者可能已經對這兩種bootloader有了較深地理解,但是還需要經過大量反覆地練習,才能很好地掌握。

相關詞條

熱門詞條

聯絡我們