歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> Linux引導管理器學習

Linux引導管理器學習

日期:2017/3/3 16:16:57   编辑:關於Linux

概述

在本文中,學習為一個 Linux 系統選擇、安裝和配置引導管理器。您將學習:

配置多個引導位置和備份引導選項

安裝和配置一個啟動加載程序,比如 GRUB、GRUB 2 或 LILO

在啟動時添加引導參數或運行啟動加載程序命令

恢復常見引導問題

使用 GRUB Legacy 引導 GRUB 2 系統

本文將討論 PC 啟動過程和 Linux 中使用的 3 個主要啟動加載程序:GRUB、GRUB 2 和 LILO,它 們可以幫助您准備 Linux Professional Institute's Junior Level Administration (LPIC-1) 考 試 101 中主題 102 下的目標 102.2。 該目標的權值為 2。請注意,LPIC-1 不 再要求掌握 LILO。本文包含 LILO 內容以便於您對其有所了解。

先決條件

為了最有效地利用 本系列中的文章,您應該具有基本的 Linux 知識,並准備一個 Linux 系統,用於練習本文介紹的命令 。您還應該熟悉文章 “學習 Linux 101:硬盤布局” 中討論的硬盤驅動器布局。有時候不同版本的程 序輸出格式不同,因此您所得到的結果未必總是與這裡所示的清單和圖相同。

注意:本文中的圖 像是從啟動過程初期采集的屏幕截圖。如果您正在使用一個屏幕讀取器閱讀本文,您可能會發現擁有對 應的配置文件以便參考的好處;從本文後面的 下載 部分下載它們。

啟動過程概述

在深 入了解具體啟動加載程序之前,先回顧一下如何啟動或引導 PC。名為 BIOS(表示 Basic Input Output Service)的代碼存儲在 一個非臨時內存中,比如 ROM、EEPROM 或閃存。當打開或重新啟動 PC 時,會執行這個代碼。通常,它 執行一個啟動自測 (POST) 來檢查機器。最後,它從引導驅動器上的主引導記錄(MBR)加載第一個扇區 。

正如文章 “學習 Linux 101:硬盤布局” 所述,MBR 還包含分區表,因此 MBR 中的可執行 代碼小於 512 字節,這個代碼量不算多。注意,每個磁盤(甚至是軟盤))都在它的 MBR 中包含可執 行代碼,即使這個代碼只夠輸出一條消息,比如 “Non-bootable disk in drive A:(驅動器 A 中沒有 可引導磁盤:)”。這個由 BIOS 從第一扇區加載的代碼稱為第一階段啟動加載程序 或階段 1 啟動加 載程序。

MS DOS、PC DOS 和 Windows? 操作系統使用的標准硬盤驅動器 MBR 會檢查分區表,以 查找標記為 active 的引導驅動器上的主分區,從該分區加載第一個扇區,然後將控制權交給已加載的 代碼。這個新的代碼片段也稱為分區引導記錄。分區引導記錄實際上是階段 1 的另一個啟動加載程序, 但它只能從分區加載一組塊。該新組塊中的代碼稱為階段 2 啟動加載程序。MS-DOS 和 PC-DOS 使用的 階段 2 加載程序直接繼續加載操作系統其余部分。以上就是操作系統啟動並運行的引導進程。

這個引導進程對於單操作系統很適用。但是,如果您想要使用多個操作系統,比如 OS/2、Windows XP 和 3 個不同的 Linux 發行版,那麼會出現什麼樣的情況呢?您可以 使用某個程序(比如 DOS FDISK 程序)來更改活動分區並重新啟動,但這種方法比較笨拙。此外,一個磁盤只能擁有 4 個主分區,而標 准 MBR 只能擁有一個主分區;系統不能從邏輯分區引導。但我們假設的示例提到了 5 種操作系統,每 個系統都需要一個分區。

該問題的解決方案是使用一些特殊代碼,允許用戶選擇引導哪個操作系 統。此類程序包括:

Loadlin

一個 DOS 可執行程序,可以在一個正在運行的 DOS 系統中調用它來引導一個 Linux 分區。如果多 引導系統的設置過程很復雜且存在風險,那麼這個代碼就能夠派上用場。

OS/2 Boot Manager

這個程序安裝在一個專用小分區上,分區被標記為 active,標准 MBR 引導進程啟動 OS/2 Boot Manager,該程序顯示一個菜單,允許選擇要啟動的操作系統。

智能啟動加載程序

該程序可以駐留在操作系統的分區上,通過一個活動分區的分區引導記錄或主引導記錄進行調用。這 類程序包括:

BootMagic,Norton PartitionMagic 的一部分

LILO,即 LInux LOader

GRUB,即 GRand Unified Boot 加載程序 (現在稱為 GRUB Legacy)

GRUB 2,最近才在常用發行版中出現的一個新的啟動加載程序

顯然,如果能夠將系統控制權交給某個包含超過 512 字節代碼的程序來完成其任務,那麼允許從邏 輯分區引導或從位於引導驅動器之外的分區引導應該不太難。上述解決方案都支持這些可能性,這是因 為它們都能從任意分區加載引導記錄,或者是因為它們都對啟動引導過程需要加載哪個或哪些文件有所 理解。

鏈式加載

當一個引導管理器獲得控制權時,它可能做的一件事就是加載另一個引 導管理器。這種現象稱為鏈式加載 (chain loading),通常發生在位於主引導記錄 (MBR) 中的引導管理 器加載一個分區引導記錄中的啟動加載程序的時候。當一個 Linux 啟動加載程序被請求引導一個 Windows 或 DOS 分區時總是需要進行鏈式加載,或者當一個 Linux 系統(比如 Fedora)的 Linux 啟 動加載程序被配置來加載另一個 Linux 系統(比如 Ubuntu)的啟動加載程序時,可能也需要鏈式加載 。例如,您可能需要使用一個分區中的 GRUB 啟動另一個分區引導記錄中的 GRUB 啟動加載程序 ,以便在該分區中啟動 Linux 系統。 這是並不常見,我們只是列舉了這種可能性。

Linux 啟動 加載程序

從現在開始,我們將主要關注 GRUB、GRUB 2 和 LILO,因為它們是大多數 Linux 發行 版包含的啟動加載程序。LILO 已經存在一段時間了,而 GRUB 比較新。最初的 GRUB 現在已成為了 GRUB Legacy,GRUB2 正在 Free Software Foundation 的贊助下進行開發。我們先討論 GRUB、然後討 論 GRUB2,讓您對 GRUB 和 GRUB2 之間的主要區別以及二者如何能夠共存有一些了解。在本文其余部分 中,我們假設 GRUB 是指 GRUB Legacy,除非上下文特別暗指 GRUB 2。LILO 也有一個新版本,稱為 ELILO(設計用於引導使用 Intel 而非 BIOS 的 Extensible Firmware Interface 或 EFI)。

您的發行版的安裝過程可能支持選擇設置哪個啟動加載程序。無論 GRUB、GRUB 2 還是 LILO, 都能適應大多數現代磁盤,但是有些版本(最著名的 Fedora)不再包含 LILO。別忘了,磁盤技術已經 飛速發展,因此您應該總是確保所選的啟動加載程序、Linux 版本(或其他操作系統)以及您的系統 BIOS 適用於您的新磁盤。否則,就有可能導致數據丟失。同樣,向現有系統添加新版本時,可能需要確 保您的 MBR 中擁有最新的 LILO、GRUB 或 GRUB 2。如果打算從 LVM 或 RAID 磁盤引導,還需要一個較 新的啟動加載程序版本。

LILO 和 GRUB 中使用的階段 2 加載程序允許從幾個操作系統或版本中選擇 一個。但是,LILO 和 GRUB 差別很大:只要升級內核或對系統進行其他更改,就需要使用一條命令重新 創建 LILO 引導設置;而 GRUB 支持通過一個可編輯配置文本文件來完成這項任務。GRUB2 還需要從一 個通常存儲在 /etc 中的配置文件執行重構。

GRUB

GRUB(即 GRand Unifood Boot loader)是最常用的 Linux 啟動加載程序之一。GRUB 可以安裝到您的可引導硬盤驅動器的 MBR 中,或 者安裝到一個分區的分區引導記錄中。它還可以安裝到可移動設備中,比如軟盤、CD 和 USB 磁盤。如 果您還不熟悉 GRUB,那麼在一張軟盤或 USB 磁盤上進行練習是一個不錯的主意,我們將通過示例向您 展示具體的操作。

GRUB 或 GNU GRUB,目前是在 Free Software Foundation 的贊助下開發的。 作為一個新版本,GRUB 2 還處於開發之中,並開始包含於 Linux 發行版之中,因此原始的 GRUB 0.9x 版本現在稱為 Grub Legacy。

在安裝 Linux 期間,通常需要指定引導程序。如果您選擇 LILO,那麼 您可能還沒有安裝 GRUB。如果是這樣,那麼您必須安裝它的安裝包。從此刻起,我們假定您已經安裝了 GRUB 包。

GRUB(Legacy)有一個配置文件,通常存儲在 /boot/grub/grub.conf 中。如果您的 文件系統支持符號鏈接,就像大多數 Linux 文件系統一樣,那麼您可能擁有一個鏈接到 /boot/grub/grub.conf 的符號鏈接 /boot/grub/menu.lst。

grub 命令(/sbin/grub,某些系統 上是 /usr/sbin/grub)是一個小型的、但功能強大的 shell,支持幾個命令來安裝 GRUB、引導系統、 定位或顯示配置文件等類似的任務。這個 shell 與階段 2 GRUB 啟動加載程序共享了很多代碼,因此了 解 GRUB 非常有用,不需要啟動到階段 2 GRUB 環境。GRUB 階段 2 可以在菜單模式 下運行,支持從菜 單選擇一個操作系統,或者也可以在命令模式 下運行,在其中可以指定單個命令加載系統。還可以使用 其他命令,比如 grub-install,該命令使用 grub shell 並幫助自動化安裝 GRUB 等任務。

清單 1 顯示了部分 GRUB 配置文件。在閱讀時,要記住一件重要的事:GRUB(至少是 GRUB Legacy )是從 0 而不是從 1 開始對驅動器、分區和其他需要計數的東西進行計數的。還要注意的是,第一個 內核行非常長。對於發行版,我們使用一個反斜槓(\)來指出何處需要中斷。

清單 1. /boot/grub/menu.lst GRUB 配置示例

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You do not have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /, eg.
#          root (hd0,5)
#          kernel /boot/vmlinuz-version ro root=/dev/sda6
#          initrd /boot/initrd-version.img
#boot=/dev/sda6
default=1
timeout=10
splashimage=(hd0,5)/boot/grub/splash.xpm.gz
#hiddenmenu
password --md5 $1$RW1VW/$4XGAklxB7/GJk0uO47Srx1
title Upgrade to Fedora 11 (Leonidas)
    kernel /boot/upgrade/vmlinuz preupgrade \ 
      repo=hd::/var/cache/yum/preupgrade stage2= \
      hd:UUID=8b4c62e7-2022-4288-8995-5eda92cd149b:/boot/upgrade/install.img \
      ks=hd:UUID=8b4c62e7-2022-4288-8995-5eda92cd149b:/boot/upgrade/ks.cfg
    initrd /boot/upgrade/initrd.img
title Fedora (2.6.26.8-57.fc8)
    root (hd0,5)
    kernel /boot/vmlinuz-2.6.26.8-57.fc8 ro root=LABEL=FEDORA8 rhgb quiet
    initrd /boot/initrd-2.6.26.8-57.fc8.img
title Fedora (2.6.26.6-49.fc8)
    root (hd0,5)
    kernel /boot/vmlinuz-2.6.26.6-49.fc8 ro root=LABEL=FEDORA8 rhgb quiet
    initrd /boot/initrd-2.6.26.6-49.fc8.img
title GRUB Menu
    rootnoverify (hd0,1)
    chainloader +1
title Windows
    rootnoverify (hd0,0)
    chainloader +1

上述第一組選項控制 GRUB 的操作方式。對於 GRUB 來說,這些命令稱之為菜單命令,它們必須出現 在其他命令前面。本小節其余部分將為我們允許 GRUB 引導的操作系統提供每映像 (per-image) 選項。 請注意,“title” 被認為是一個菜單命令。每個標題實例後面有一個或多個一般或菜單項命令。我們 的 GRUB 示例是一個典型的包含 Windows 和兩個 Linux 系統的雙引導系統的基礎示例。該示例來自於 我們前面使用的同一個系統。事實上,它是從 LILO 菜單中的 “Fedora 8” 鏈式加載而來的啟動菜單 。您會發現,許多類型相同的元素同時出現在 LILO 和 GRUB 配置文件中。您可能會思考這樣一個問題 :如果將該額外操作系統添加到前面的 LILO 示例中,需要進行哪些更改?

示例中的所有其他部 分應用的菜單命令包括:

#

以 # 開頭的所有行都是注釋,GRUB 將對它們置之 不理。這個特殊的配置文件最初由 Red Hat 安裝程序 anaconda 生成。如果安裝 Linux 時安裝 GRUB, 可能會發現您的 GRUB 配置文件添加了一些注釋。這些注釋通常用於幫助系統升級程序,以便您的 GRUB 配置能夠與升級後的內核保持同步。當您自己編輯這個配置文件時,一定要注意為此目的而保留下來的 任何標記。

default

如果用戶在規定時限內沒有做出任何選擇,該命令將指定要加 載的系統。在我們的示例中,default=2 表示加載第三項。不要忘了,GRUB 從 0 而不是 1 開始計數。 如果沒有指定,那麼默認值是引導第一項,編號為 0。

timeout

指定啟動默認項 超時,以秒為單位。注意,LILO 以 0.1 秒作為超時單位,而 GRUB 使用 1 秒作為超時單位。

splashimage

指定將與啟動菜單一起顯示的背景(或 splash)映像。GRUB 將第一 個硬盤驅動器稱之為 (hd0),將該驅動器上的第一個分區稱之為 (hd0,0)。因此,splashimage= (hd0,6)/boot/grub/splash.xpm.gz 表示使用位於第一個硬盤驅動器的第 7 個分區上的文件 /boot/grub/splash.xpm.gz。注意,這個映像是一個使用 gzip 壓縮的 XMP 文件。支持 splashimage 的是一個補丁,您的版本中可能沒有包含。

password

指定用戶在能夠解鎖菜單、 編輯一個配置行或輸入 GRUB 命令前必須輸入的密碼。這個密碼可能是明文格式。GRUB 還允許將密碼存 儲為一個 MD5 摘要,我們的示例就是這樣做的。這樣更安全一些,大多數管理員都會設置一個密碼。如 果不設置密碼,用戶就能夠完全訪問 GRUB 命令行。

我們的示例展示了兩個 Fedora 8 內核和 一個升級到 Fedora 11 的選項,以及 Windows XP 和一個鏈式加載的 “GRUB Menu” 選項。這些小節 中使用的命令有:

title

一個描述性標題,當 Grub 啟動時顯示為菜單項。使 用方向鍵上下移動標題列表並按 Enter 鍵選擇一個特定項。

root

指定將要啟動的 分區。與 splashimage 一樣,從 0 開始計數,因此指定為 root (hd0,6) 的第一個 Red Hat 系統實際 上是在第一個硬盤驅動器的第 7 個分區上(本例中為 /dev/hda7),而指定為 root (hd1,10) 的第一 個 Ubuntu 系統位於第二個硬盤驅動器上。GRUB 將嘗試加載這個分區以檢查它,並在某些情況下向已啟 動操作系統提供一些值。

kernel

指定將被加載的內核映像以及所需內核參數。這 類似於 LILO 映像 和 append 命令的組合,您將在 LILO 小節看到該命令。在本例中,有兩個不同的 Fedora 8 內核,以及升級內核。

initrd

初始 RAM 磁盤 的名稱,包含文件系統 掛載之前內核需要的模塊。

savedefault

本示例中不使用。如果指定了菜單命令 default=saved,並為一個操作系統指定了 savedefault 命令,那麼引導該操作系統將導致它變為默認 值,直至啟動帶有指定 savedefault 的另一個操作系統。在這個示例中,default=2 將覆蓋保存的所有 默認值。

boot

一個可選參數,指示 GRUB 啟動選擇的操作系統。當一個選項所有 命令全部執行完時,這將是一個默認操作。

lock

本示例中不使用。沒有輸入密碼 之前不會啟動指定項。如果使用這個命令,那麼還應該在初始選項中指定一個密碼;否則,用戶可以編 輯您的鎖定選項並啟動系統,或者添加 “single” 到其中的一項。如果您願意的話,還可以為個別條 目指定一個不同的密碼。

rootnoverify

類似於 root,除非 GRUB 不嘗試掛載文件 系統或驗證其參數。這通常用於 GRUB 不支持的文件系統,比如 NIFS。如果您想要 GRUB 加載硬盤驅動 器上的主引導記錄,也可以使用這個命令,例如,訪問不同的配置文件或者重新加載您之前的啟動加載 程序。

chainloader

指定將作為階段 1 文件加載的另一個文件。值 “+1” 等同 於 0+1,表示加載從扇區 0 開始的一個扇區,即,從 root 或 rootnoverify 指定的設備加載第一個扇 區。

現在,您已經對一個典型的 /boot/grub/grub.conf(或 /boot/grub/menu.lst)文件中可 能包含的內容有所了解。還有其他許多 GRUB 命令可以提供對啟動過程的廣泛控制,幫助安裝 GRUB 和 完成其他任務。您可以在 GRUB 手冊中了解關於這些命令的更多信息,可以通過在您的系統上運行 info grub 命令來獲取這個手冊。

現在我們已經有了一個 GRUB 配置文件,需要創建一個啟動軟盤來 測試它。最簡單的方法是使用 清單 2 中展示的 grub-install 命令。如果您正在將 GRUB 安裝到一個 軟盤或一個分區上,那麼您應該首先卸載該設備。這不適用於將 GRUB 安裝到一個硬盤驅動器的 MBR 上 ,因為您只是掛載分區(/dev/sda1、/dev/sda2 等)而不是掛載整個硬盤驅動器 (/dev/sda)。

清單 2. 將 GRUB 安裝到軟盤上

[root@pinguino ~]# grub-install /dev/fd0
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'.
    
(fd0)   /dev/fd0
(hd0)   /dev/sda

注意:您可能使用 GRUB 設備名 (fd0) 而不是 /dev/fd0,如果您的確那樣 做,則必須用引號括起來,以免 shell 將其解釋為圓括號。例如:grub-install '(fd0)'。

設備映射告訴您 GRUB 如何將磁盤 (fd0, hd0, hd1) 的內部視圖與 Linux 視圖 (/dev/fd0, /dev/sda, /dev/sdb) 相匹配。在帶有一個或兩個 IDE 硬盤驅動器以及可能還有一個軟盤 驅動器的系統上,這可能是正確的。但如果一個設備映射已經存在,那麼 GRUB 將重新使用它,無需探 測。如果您只是添加一個新驅動器並想強制生成一個新設備映射,那麼添加 --recheck 選項到 grub- install 命令。有時,您可能會看到一條如 清單 3 所示的消息。該示例中也同樣,您還需要添加 -- recheck 選項到 grub 命令,以強制 GRUB 探測可用設備並重新構建一個設備映射。

清單 3. 將 GRUB 安裝到軟盤

[root@pinguino ~]# grub-install /dev/fd0
/dev/fd0 does not have any corresponding BIOS drive.

如果您使用一張空白軟盤開始並且 現在開始掛載,那麼您將發現該軟盤現在仍然是空的。現在的情況是 GRUB 將一個自定義的階段 1 加載 程序寫入該軟盤的第一個扇區。這並不在文件系統中顯示。這個階段 1 加載程序將從您的硬盤驅動器上 加載階段 2 和配置文件。嘗試啟動軟盤,在菜單顯示之前很少能看到 IO 活動。使用上移和下移箭頭來 選擇不同的引導目標。

圖 1. 使用 GRUB 引導

測試完您的啟動軟盤後,就可 以在硬盤驅動器的 MBR 中安裝 GRUB 了。對於第一個 IDE 硬盤驅動器,您應該使用:

grub-install /dev/sda

grub-install '(hd0)'。

要將它安裝到分區 11 的分區引導記錄中,使用:

grub-install /dev/sda11

grub-install ' (hd0,10)'。

別忘了 GRUB 從 0 開始計數。

您可以向該命令添加引導參數。事實上 ,您可以編輯 GRUB 配置中的任何命令,或者甚至在引導時加載另一個配置文件。如果您使用一個密碼 ,您將需要輸入 p 命令,然後輸入您的密碼。然後,選擇一個條目並輸入 e 命令對其進行編輯。選擇 想要編輯的行並再次輸入 e。通過輸入新的字符或刪除現有字符編輯該行,然後按 Enter 鍵返回菜單。 輸入 b 命令來使用修改值啟動您的系統。圖 2 展示了該過程的命令編輯階段,其中您將 “single” 參數添加到內核語句以引導到單用戶模式。

圖 2. 使用 GRUB 引導到單用戶模式

GRUB 2

GRUB 2 是完全重新編寫的,以便使其更模塊化且可移植。它面向多個不同 的基礎架構和引導方法,擁有許多新特性。如果您過去使用的是 GRUB,現在才開始使用 GRUB 2,您會 發現它們完全不同,可能會獲得很多驚喜。

關於 GRUB 2,您可能注意到的第一點就是它不能作 為一個分區啟動加載程序安裝。盡管我告訴 Ubuntu 安裝者將 GRUB 安裝在已安裝 Ubuntu 9.10 的分區 (/dev/sda7)上,但是該分區不能通過鏈式加載啟動。本小節其余部分將簡要介紹 GRUB 2,這些信息 足以幫助您開始使用它,無論是單獨使用還是與 GRUB Legacy 結合使用。

適用於 PC 機的 GRUB 2 版本分布在 grub-pc 軟件包中。您會發現幾個程序,它們通常位於 /usr/bin 或 /usr/sbin 中,這 些程序是 grub-pc 軟件包的一部分,如 清單 4 所示。在本文撰寫之時,這些程序的手冊頁很少。嘗試 使用 --help 選項來運行這些程序以獲得更多信息,或者在網上搜索其他幫助。

清單 4. /usr/bin 和 /usr/sbin 中的 GRUB 2 可執行文件

ian@pinguino:~$ dpkg -L grub-pc|grep 

"bin/"
/usr/bin/grub-mkimage
/usr/bin/grub-mkrescue
/usr/sbin/grub-setup
/usr/sbin/update-grub2
/usr/sbin/update-grub
/usr/sbin/grub-install
/usr/sbin/upgrade-from-grub-legacy
/usr/sbin/grub-set-default
/usr/sbin/grub-reboot

GRUB 2 的核心是一個多重引導內核(/boot/grub/core.img)和一個 配置文件(/boot/grub/grub.cfg)。如果您運行 grub-install 並設置目標為您的 MBR(例如:grub- install /dev/sda),這些文件會自動生成。運行 grub-install --help(如 清單 5 所示),了解被 調用來完成所有這些工作的程序。有些程序與 Grub Legacy 類似,但也有一些新程序,比如 --modules 、--grub-setup、--grub-mkimage 等。

清單 5. grub-install 的 GRUB 2 幫助

ian@pinguino:~$ grub-install --help
Usage: grub-install [OPTION] install_device
Install GRUB on your drive.
    
  -h, --help              print this message and exit
  -v, --version           print the version information and exit
  --modules=MODULES       pre-load specified modules MODULES
  --root-directory=DIR    install GRUB images under the directory DIR
                          instead of the root directory
  --grub-setup=FILE       use FILE as grub-setup
  --grub-mkimage=FILE     use FILE as grub-mkimage
  --grub-mkdevicemap=FILE use FILE as grub-mkdevicemap
  --grub-probe=FILE       use FILE as grub-probe
  --no-floppy             do not probe any floppy drive
  --recheck               probe a device map even if it already exists
  --force                 install even if problems are detected
  --disk-module=MODULE    disk module to use
    
INSTALL_DEVICE can be a GRUB device name or a system device filename.
    
grub-install copies GRUB images into the DIR/boot directory specified by
--root-directory, and uses grub-setup to install grub into the boot
sector.
    
Report bugs to <[email protected]>.

因此,如果您運行的是 grub-install /dev/sda ,那麼這個過程將為您構建一個核心映像文件,還會構建一個配置文件,並將 GRUB 安裝到您的 MBR 中 。如果您還沒有准備好將您的整個設置提交到 GRUB 2,您可以親自構建這些部分,然後從 GRUB Legacy 或 LILO 引導 GRUB 2。

構建 GRUB 2 核心映像

構建一個新核心映像文件的最簡單的方法 是運行帶有 --grub-setup=/bin/true 選項的 grub-install 命令,這將導致 /bin/true 而不是真正的 GRUB 2 安裝程序運行,如 清單 6 所示。我們首先刪除現有的 core.img,以便展示真的生成了這個文 件。

清單 6. 使用 grub-install 構建 GRUB 2 核心映像

ian@pinguino:~$ sudo rm 

/boot/grub/core.img 
ian@pinguino:~$ sudo grub-install --grub-setup=/bin/true /dev/sda
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'.
    
(hd0)   /dev/sda
ian@pinguino:~$ ls -l /boot/grub/core.img
-rw-r--r-- 1 root root 25105 2010-04-08 12:10 /boot/grub/core.img

構建 GRUB 2 配置 文件

GRUB 2 配置文件通常是 /boot/grub/grub.cfg。與 GRUB Legacy 不同,您通常不應該編輯 這個文件,而應該使用 grub-mkconfig 或 update-grub 命令(該命令是 grub-mkconfig 的前端)來構 建它。這些命令在 /etc/default/grub 中尋找背景、超時等等,然後運行 /etc/grub.d/ 中的可執行文 件來構建配置文件的各個部分,比如頭文件、一個針對當前 Linux 發行版的區域、幾個針對其他操作系 統的區域、以及您自己的自定義增加項。如果您需要定制 GURB 2 菜單,那麼應該將您的更改添加到 /etc/grub.d/ 下的一個文件(比如 40_custom)中,或者添加您自己的文件中。記住,該文件必須是可 執行文件。然後,運行 update-grub 生成一個新的 /boot/grub/grub.cfg 文件,如 清單 7 所示。

清單 7. 使用 update-grub 構建一個 GRUB 2 配置文件

ian@pinguino:~$ sudo 

update-grub
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-2.6.31-20-generic
Found initrd image: /boot/initrd.img-2.6.31-20-generic
Found linux image: /boot/vmlinuz-2.6.31-14-generic
Found initrd image: /boot/initrd.img-2.6.31-14-generic
Found memtest86+ image: /boot/memtest86+.bin
Found GRUB boot loader on /dev/sda1
Found Fedora release 8 (Werewolf) on /dev/sda6
done

清單 8 展示了結果配置文件中的幾個條目。我們已經說過,為了版面美觀,我們使用一個後置反斜 槓(\)來分割較長的行。注意,menuentry 小節看起來更像 shell 腳本,而不像不帶有 GRUB Legacy 邏輯的純命令。與 GRUB Legacy 不同的另一個變化是現在分區編號從 1 開始,盡管磁盤編號仍然從 0 開始。因此 /dev/sda7 在 GRUB 2 中是 (hd0,7),而在 GRUB Legacy 中則為 (hd0,6)。

清單 8. GRUB 2 配置文件片段

### BEGIN /etc/grub.d/05_debian_theme ###                               
set menu_color_normal=white/black
set menu_color_highlight=black/white
### END /etc/grub.d/05_debian_theme ###                                 
    
### BEGIN /etc/grub.d/10_linux ###                                      
menuentry "Ubuntu, Linux 2.6.31-20-generic" {
        recordfail=1
        if [ -n ${have_grubenv} ]; then save_env recordfail; fi
        set quiet=1
        insmod ext2
        set root=(hd0,7)
        search --no-floppy --fs-uuid --set 8954fa66-e11f-42dc-91f0-b4aa480fa103
        linux   /boot/vmlinuz-2.6.31-20-generic \
          root=UUID=8954fa66-e11f-42dc-91f0-b4aa480fa103 ro   quiet splash
        initrd  /boot/initrd.img-2.6.31-20-generic
}
menuentry "Ubuntu, Linux 2.6.31-20-generic (recovery mode)" {
        recordfail=1
        if [ -n ${have_grubenv} ]; then save_env recordfail; fi
        insmod ext2
        set root=(hd0,7)
        search --no-floppy --fs-uuid --set 8954fa66-e11f-42dc-91f0-b4aa480fa103
        linux   /boot/vmlinuz-2.6.31-20-generic 
         root=UUID=8954fa66-e11f-42dc-91f0-b4aa480fa103 ro single
        initrd  /boot/initrd.img-2.6.31-20-generic
}

從 Grub Legacy 啟動 GRUB 2

如前所述,您不能從一個分區引導記錄鏈式加載 GRUB 2。但 是,當構建核心映像和配置文件之後,就可以將一個條目添加到 GRUB Legacy grub.conf 或 menu.lst 文件,以便啟動 GRUB 2 核心映像,該映像隨後會顯示您構建的 GRUB 2 菜單。清單 9 展示了在 清單 15 中已經使用過的條目。由於這個配置文件適用於 GRUB Legacy,所以 root 條目將 /dev/sda7 指定 為 (hd0,6)。

清單 9. 啟動 GRUB 2 核心映像的 Grub Legacy 配置條目

# Ubuntu 

9.10 uses GRUB 2, so use kernel to drive GRUB 2 menu.          
title           Ubuntu 9.10 (sda7)
root            (hd0,6)
kernel          /boot/grub/core.img

當您從 GRUB Legacy 菜單中選擇這個條目時,您會看 到一個類似於 圖 3 的菜單,其中第一個條目被突出顯示,下一個條目在 清單 8 中顯示。

圖 3. GRUB 2 菜單示例

您可能會想要嘗試在一個分區 引導記錄中安裝 GRUB 2。如果這樣,您可能會看到類似 清單 10 的輸出。

清單 10. 嘗試將 GRUB 2 安裝到一個分區引導記錄

ian@pinguino:~$ sudo grub-install /dev/sda7
grub-setup: warn: Attempting to install GRUB to a partition instead of the MBR.  
This is a BAD idea.
grub-setup: warn: Embedding is not possible.  GRUB can only be installed in
this setup by using blocklists.  However, blocklists are UNRELIABLE and its 
use is discouraged.
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'.
    
(hd0)   /dev/sda

這解釋了當我安裝 Ubuntu 9.10 時試圖在 /dev/sda7 中安裝 GRUB 2 為什 麼會失敗。有一點值得注意,Ubuntu 的這個版本將 GRUB 2 作為一個新安裝程序,但如果您正在升級現 有的 Ubuntu 安裝,它將保留現有的引導程序。

 

LILO

LILO(即 LInux LOader)是三個最 常用的 Linux 啟動加載程序之一。您可以將 LILO 安裝到您的可引導硬盤驅動器的 MBR 中,或者將它 安裝到一個分區的分區引導記錄中。還可以將它安裝到可移動設備上,比如軟盤、CD 和 USB 磁盤。如 果您還不熟悉 LILO,那麼在軟盤或 USB 磁盤上練習是一個不錯的注意,我們的示例就是這樣做的。

在 Linux 安裝期間,通常需要指定一個引導管理器。如果您選擇 GRUB,您可能沒有安裝 LILO 。如果是這樣,那麼您必須安裝 LILO 安裝包。您可能想安裝 lilo-doc 安裝包,以便獲得其他文檔和 示例。從此刻起,我們假定您已經安裝了 LILO 安裝包。

使用一個配置文件來配置 LILO,這個 配置文件通常是 /etc/lilo.conf。可以使用 liloconfig 命令(通常位於 /usr/sbin 中)來生成一個 啟動配置文件,然後根據需要編輯它。清單 11 中的配置文件就是以這種方式生成的。這個文件的注釋 比較合理,lilo 和 lilo.conf 的手冊頁將為您提供更多的幫助。這是一個典型的 LILO 配置文件,可 用在包含 Windows 以及一個或多個 Linux 系統的雙啟動系統上。

清單 11. /etc/lilo.conf 示 例

# Originally generated by liloconfig - modified by Ian Shields
    
# This allows booting from any partition on disks with more than 1024
# cylinders.
lba32
    
# Specifies the boot device (floppy)
boot=/dev/fd0
    
# Specifies the device that should be mounted as root.
# If the special name CURRENT is used, the root device is set to the
# device on which the root file system is currently mounted. If the root
# has been changed with  -r , the respective device is used. If the
# variable ROOT is omitted, the root device setting contained in the
# kernel image is used. It can be changed with the rdev program.
root=/dev/sda7
    
# Bitmap configuration for /boot/coffee.bmp
bitmap=/boot/coffee.bmp
bmp-colors=12,,11,15,,8
bmp-table=385p,100p,1,10
bmp-timer=38,2,13,1
    
# Enables map compaction:
# Tries to merge read requests for adjacent sectors into a single
# read request. This drastically reduces load time and keeps the map
# smaller. Using COMPACT is especially recommended when booting from a
# floppy disk.
compact
    
# Install the specified file as the new boot sector.
# LILO supports built in boot sectors, you only need
# to specify the type, choose one from 'text', 'menu' or 'bitmap'.
# new: install=bmp      old: install=/boot/boot-bmp.b
# new: install=text     old: install=/boot/boot-text.b
# new: install=menu     old: install=/boot/boot-menu.b or boot.b
# default: 'menu' is default, unless you have a bitmap= line
# Note: install=bmp must be used to see the bitmap menu.
# install=menu
install=bmp
    
# Specifies the number of _tenths_ of a second LILO should
# wait before booting the first image.  LILO
# doesn't wait if DELAY is omitted or if DELAY is set to zero.
# delay=20
    
# Prompt to use certain image. If prompt is specified without timeout,
# boot will not take place unless you hit RETURN. Timeout is in tenths of
# a second.
prompt
timeout=200
    
# Enable large memory mode.
large-memory
    
# Specifies the location of the map file. If MAP is
# omitted, a file /boot/map is used.
map=/boot/map
    
# Specifies the VGA text mode that should be selected when
# booting. The following values are recognized (case is ignored):
#   NORMAL  select normal 80x25 text mode.
#   EXTENDED  select 80x50 text mode. The word EXTENDED can be
#     abbreviated to EXT.
#   ASK  stop and ask for user input (at boot time).
#   <number>  use the corresponding text mode. A list of available modes
#     can be obtained by booting with  vga=ask  and pressing [Enter].
vga=normal
    
# Defines non-standard parameters for the specified disk.
#disk=/dev/sda
#   bios=0x80
    
# If you are using removable USB drivers (with mass-storage)
# you will need to tell LILO to not use these devices even
# if defined in /etc/fstab and referenced in /proc/partitions.
# Adjust these lines to your devices:
#
# disk=/dev/sda inaccessible
# disk=/dev/sdb inaccessible
    
# These images were automagically added. You may need to edit something.
    
image=/boot/vmlinuz-2.6.31-14-generic
    label="Lin 2.6.31-14"
    initrd=/boot/initrd.img-2.6.31-14-generic
    read-only
    
image=/boot/vmlinuz-2.6.31-20-generic
    label="Lin 2.6.31-20"
    initrd=/boot/initrd.img-2.6.31-20-generic
    read-only
    
image=/boot/memtest86+.bin
    label="Memory Test+"
    read-only
    
# If you have another OS on this machine (say DOS),
# you can boot if by uncommenting the following lines
# (Of course, change /dev/sda1 to wherever your DOS partition is.)
other=/dev/sda6
        label="Fedora 8"
    
 other=/dev/sda1
   label="Windows XP"

我們將通過創建一個啟動軟盤來測試我們的配置,因此指定了靠近文 件頂部的 boot=/dev/fd0。我們還將提示超時增加到 20 秒(200 個 0.1 秒增量),並添加了第二個 “other” 條目來鏈式加載到 Fedora 8 分區上的啟動加載程序(/dev/sda6)。在一個配置文件中, LILO 只支持一個 root 命令,因此它可以啟動 root 分區中的多個映像,但需要鏈式加載到另一個啟動 加載程序來啟動另一個不同安裝中的映像,比如我們的示例中的 Fedora 8 (/dev/sda6) 或 Windows XP (/dev/sda1)。

您可以使用 /sbin/lilo 中的 lilo 命令來編寫一個階段 1 引導記錄, 並使用通常位於 /etc/lilo.conf 中的配置信息(比如上面的示例)來創建一個映像文件(/boot/map) 。我們稍後會提到一些輔助用法。

現在,如果我們使用一個 Linux 文件系統(比如 ext2)來格 式化一個軟盤,可以運行 lilo 命令(/sbin/lilo)來創建一個可引導軟盤。 清單 12 顯示了我們的輸 出。請注意, lilo 命令有 5 個級別,為每個級別指定一個額外的 -v 參數。該示例是使用 lilo -v -v 創建的。

清單 12. 使用 lilo 創建一個可引導軟盤

LILO version 22.8, 

Copyright (C) 1992-1998 Werner Almesberger
Development beyond version 21 Copyright (C) 1999-2006 John Coffman
Released 19-Feb-2007, and compiled at 10:52:38 on Aug 25 2009
Running Linux kernel 2.6.31-14-generic on i686
Ubuntu
    
raid_setup returns offset = 00000000  ndisk = 0
 BIOS   VolumeID   Device
Reading boot sector from /dev/fd0
pf_hard_disk_scan: ndevs=1
  0800  54085408  /dev/sda
device codes (user assigned pf) = 0
device codes (user assigned) = 0
device codes (BIOS assigned) = 1
device codes (canonical) = 1
mode = 0x03,  columns = 80,  rows = 25,  page = 0
Using BITMAP secondary loader
Calling map_insert_data
Secondary loader: 19 sectors (0x3800 dataend).
Warning: The boot sector and map file are on different disks.
bios_boot = 0x00  bios_map = 0x80  map==boot = 0  map S/N: 54085408
Mapping bitmap file /boot/coffee.bmp
Calling map_insert_file
Compaction removed 592 BIOS calls.
Bitmap: 603 sectors.
BIOS data check was okay on the last boot
    
Boot image: /boot/vmlinuz-2.6.31-14-generic
Setup length is 26 sectors.
Compaction removed 7452 BIOS calls.
Mapped 7601 sectors.
Mapping RAM disk /boot/initrd.img-2.6.31-14-generic
Compaction removed 14696 BIOS calls.
RAM disk: 14930 sectors.
Added Lin_2.6.31-14 *
    
Boot image: /boot/vmlinuz-2.6.31-20-generic
Setup length is 26 sectors.
Compaction removed 7468 BIOS calls.
Mapped 7617 sectors.
Mapping RAM disk /boot/initrd.img-2.6.31-20-generic
Compaction removed 14704 BIOS calls.
RAM disk: 14938 sectors.
Added Lin_2.6.31-20
    
Boot image: /boot/memtest86+.bin
Setup length is 4 sectors.
Compaction removed 243 BIOS calls.
Mapped 254 sectors.
Added Memory_Test+
    
Boot other: /dev/sda6, loader CHAIN
Pseudo partition start: 43198848
Compaction removed 0 BIOS calls.
Mapped 6 (4+1+1) sectors.
Added Fedora_8
    
Boot other: /dev/sda1, on /dev/sda, loader CHAIN
Compaction removed 0 BIOS calls.
Mapped 6 (4+1+1) sectors.
Added Windows_XP
    
 BIOS   VolumeID   Device
  80    54085408    0800
Writing boot sector.
/boot/boot.0200 exists - no boot sector backup copy made.
Map file size: 336896 bytes.
RAID device mask 0x0000
One warning was issued.

我們現在擁有了屬於我們自己的可引導 LILO 軟盤。如果 LILO 遇 到一個錯誤,您可能會看到一條錯誤消息,引導扇區將不會被寫入。這條錯誤消息會使您對需要修復的 問題有所了解。

如果我們使用剛才創建的軟盤並重新啟動機器,就會看到一個類似於 圖 4 的提 示。請注意屏幕頂部的倒數計時器,它從 20 秒向下倒數(200 個 0.1 秒)。如果在 20 秒內沒有做出 選擇,則會自動啟動突出顯示的選項(第 1 個,本例中的 Lin_2.6.31-14)。

圖 4. LILO 啟動 界面

可以使用方向鍵上下移動來選 擇列表。圖 5 顯示了如何選擇較新的 Lin_2.6.31-20 內核,它是第二個選項。請注意,計時器的值不 再顯示。按 Enter 鍵啟動該內核。

圖 5. 使用 LILO 選擇另一個啟動目標

測試完啟動軟盤後,更改 lilo.conf 文件中的 boot=/dev/fd0 條目來安裝 MBR 或一個分區引導記錄上 的 LILO。例如,boot=/dev/sda 將把 LILO 安裝到您的第一個硬盤驅動器的主引導記錄中。

現 在您已經初步了解了 LILO 及其配置文件。您可以從 lilo 命令行覆蓋一些配置選項。使用 man lilo 或 man lilo.conf,在 lilo 手冊頁面中找到更多的信息。您還可以在與 lilo 或 lilo-doc 安裝包一 起安裝的 PostScript 用戶指南中發現更多的信息。這個用戶指南應該安裝在您的 documentation 目錄 中,但具體位置可能因為系統不同而不同。定位這個文件的一種方法是通過 grep 過濾安裝包列表。清 單 13 展示了如何定位基於 Debian 的 Ubuntu 9.10 系統的用戶指南,本文使用的就是這種方法。

清單 13. 使用 dpkg 定位 LILO 用戶指南

ian@pinguino:~$ dpkg -L lilo-doc | grep "ps"
/usr/share/doc/lilo-doc/user.ps.gz
/usr/share/doc/lilo-doc/tech.ps.gz

在基於 RPM 的系統(比如 Fedora)上的對應命令為: rpm -ql lilo-doc | grep "ps"

LILO 輔助命令

LILO 有以下輔助命令:

lilo -q

顯示映射文件中的信息。

lilo -R

將 lilo 設置為僅在下一次重新啟動時自動啟動指定系統。這對於自動重新啟動遠程系統來說是非常 方便的。

lilo -I

顯示關於一個內核路徑的信息。

lilo -u

卸載 lilo 並恢復此前的引導記錄。

當 LILO 啟動一個 Linux 系統時,您可能想要在啟動時提供其他參數。例如,如果您的圖形啟動沒 有工作,您可能想要啟動到模式 3 或單用戶模式中來恢復。如果您選定一個條目然後按 TAB 鍵,應該 能看到一個使用您選擇的標簽名預先填充的終端窗口,如 圖 6 所示。在標簽名後面輸入的任何文本都 將被傳遞到內核。例如,在我們的示例中,通過向下移動一行並按下 TAB 鍵來選擇最新的 Ubuntu 系統 。如果您沒有先選擇一個名稱,那麼可能必須輸入在標簽中指定的全名。您會發現使用比我們的示例更 簡單的標簽可能是一個好主意:鍵入完整的 Lin_2.6.31.20 會很麻煩。

圖 6. 使用 LILO 添加 內核參數

在 圖 6 中,我們將 “single” 添加到啟動參數,這表明我們想啟動到單一用戶模式來進行某種系統恢復。參閱 恢復 小節 ,了解關於使用啟動參數的更多信息。

還記得嗎?在使用 LILO 時,無論何時更新配置文件 (/etc/lilo.conf),都必須運行 lilo 命令。如果您添加、移動或刪除分區,或者進行其他可能會使 生成的啟動加載程序失效的更改,也需要運行 lilo 命令。

系統更新

大多數版本會提供 一些工具來更新系統。這些工具通常能意識到正在使用的啟動加載程序,並將自動更新您的配置文件。 如果您構建了自己的自定義內核,或者願意使用一個帶有非標准名稱或位置的配置文件,那麼可能需要 自己更新配置文件。

如果您使用的是 GRUB,那麼可以編輯 /boot/grub/grub.conf 文件來進行更改,GRUB 階段 2 加載 程序將在您重新啟動時讀取這個文件。您通常不需要因為只添加一個新內核而重新安裝 GRUB。但是,如 果您移動一個分區,或者添加一些驅動器,則有可能需要重新安裝 GRUB。別忘了階段 1 加載程序非常 小,它只擁有階段 2 加載程序的一列塊地址。移動分區和已處理更改,階段 1 將不能再找到階段 2。 我們稍後將會介紹一些恢復策略,並討論 GRUB 的階段 1.5 加載程序。

如果您使用的是 GRUB 2,則需要使用 update-grub 命令來重新構建 GRUB 2 配置,如 構建 GRUB 2 配置文件 所述。

如果您使用的是 LILO,那麼無論何時更新配置文件、添加一個硬盤驅動器或刪除一個分區,都必須 運行 lilo 命令。

如果您在不同的分區內運行多個 Linux 系統,請參閱下面的 使用引導分區 小節。

恢復

現在我們來看看您仔細准備的啟動設置可能會出錯的地方,特別是當您安裝並啟動多個 操作系統時。需要記住的第一點是控制您的初始恐慌沖動。恢復通常很簡單。這裡介紹的一些策略可以 幫助您渡過各種危機。

能夠對一台機器進行物理訪問的任何人都擁有許多權力。同樣,對一個 GRUB 命令行擁有訪問權的任何人都能訪問您系統上的文件,這對一個運行系統提供的任何所有權或其他 安全條款來說並不是一件好事。選擇啟動加載程序時,一定要牢記這些問題。對於 LILO 和 GRUB 的選 擇,主要是個人喜好問題。選擇最適合您的特殊需求和工作方式的加載程序。

另一個安裝會損壞 您的 MBR

有時您會安裝另一個操作系統,並在無意中覆蓋了 MBR。有些系統,比如 DOS 和 Windows,總是安裝它們自己的 MBR。從這種情況恢復通常很容易。如果您養成在每次運行 lilo 或重新 安裝 GRUB 時都創建一張啟動軟盤的習慣,就可以避免許多煩惱。只需從該軟盤啟動到您的 Linux 系統 並重新運行 lilo 或 grub-install 即可。

如果您沒有啟動軟盤,但是仍然擁有幾乎所有 Linux 版本,那麼您通常可以在一個恢復模式中啟動 Linux 安裝媒體。在您這樣做時,您的硬盤驅動器上的 root 文件系統要麼會在某個奇怪的恢復點掛載,要麼完全不被掛載。您可以使用 chroot 命令使這個奇 怪的掛載點變為您的根目錄(/)。然後運行 lilo 或 grub-install 來創建一張新的啟動軟盤或重新安 裝 MBR。 我喜歡創建一張軟盤並使用它來啟動,這樣能夠確保我在繼續操作並重寫 MBR 之前一切正常 ,但您可能比我更具勇氣。在還原模式下啟動一張 CD 或 DVD 可能會向您提供一個選項菜單,或者可能 只是將您帶入擁有 root 權限的單用戶模式。如果您試圖將我們在 LILO 示例中使用的 Ubuntu 9.10 系 統啟動到單用戶模式,您會看到一個如 圖 7 所示的菜單。 突出顯示的選項將使您進入一個有網絡連接 的 root shell。

圖 7. Ubuntu 9.10 恢復菜單

這樣的一個菜單是恢復介質的 一個常用選擇。對於我們的還原示例,我們不打算使用 CD,而是將 Ubuntu 9.19 系統啟動到之前關於 LILO 的小節中描述的單用戶模式。然後,我們逐步執行為另一個系統(這裡是 /dev/sda6 上的 Fedora 8 系統)創建一張啟動軟盤的典型步驟。無論您從一張還原 CD 或相同的系統上的另一個 OS 啟動,這 些步驟都是類似的,但也有可能已經為您完成了某些步驟(比如,掛載要還原的映像)。

當您最 終提供一個 root 提示時,可能想要執行 清單 14 中的全部或部分代碼。 對於我們的示例,我們創建 一個掛載點(/mnt/sysimage),在這個新的(將來) root 中掛載一些特殊的文件系統,然後 chroot 到已掛載的系統。cat /etc/issue 命令展示 chroot 命令的效果,這使得目標目錄成為文件系統的新根 目錄,至少在我們使用 Ctrl-d 或 exit 命令退出執行了 chroot 的環境之前是這樣的。

清單 14 展示了我們此前配置示例中使用的同一環境中的一個示例。將這個示例視為您作為 root 用戶 登錄的一個終端窗口。換句話說,要小心對待即將寫入硬盤驅動器的內容。

清單 14. 使用一個 還原系統以及 chroot

root@pinguino:~# mkdir /mnt/sysimage
root@pinguino:~# mount /dev/sda6 /mnt/sysimage
root@pinguino:~# cd /mnt/sysimage
root@pinguino:~# mount -t proc none proc/
root@pinguino:~# mount -t sysfs none sys/
root@pinguino:~# mount -o bind /dev dev/
root@pinguino:~# cat /etc/issue
Ubuntu 9.10 \n \l
    
root@pinguino:~# chroot /mnt/sysimage
root@pinguino:~# 
sh-3.00# chroot /mnt/sysimage
[root@oinguine /]# cat /etc/issue
Fedora release 8 (Werewolf)
Kernel \r on an \m
    
[root@oinguine /]# grub-install /dev/fd0
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'.
    
(fd0)   /dev/fd0
(hd0)   /dev/sda
[root@oinguine /]#

當您配置好您的可引導軟盤之後,按下 Ctrl-d 鍵退出 chroot 環境並重新啟動您的系統,別忘了刪 除可能使用過的任何安裝 CD 或恢復媒體。如果您手邊碰巧沒有安裝 CD 或 DVD,那麼可以使用諸多在 線提供的實時恢復 LINUX CD,或者一些軟盤或 USB 磁盤。

盡管超出了本文的范圍,您可能想了 解這一點:您還可以使您的 MBR 啟動一個 Windows 2000 或 Windows XP 系統,並在一個分區引導記錄 上安裝 LILO 或 GRUB。ntldr 啟動程序也可以鏈式加載其他引導扇區,但是設置可能比較麻煩。您需要 將這個引導扇區復制到一個 Windows 分區(通常使用 dd 命令)並修改隱藏的 boot.ini 文件來實現上 述操作。

移動一個分區

如果您移動了一個分區並且忘記了啟動設置,那麼可能會遇到一 個意外問題。通常,LILO 和 GRUB 會拒絕加載。LILO 可能會打印一個 “L”,表明階段 1 被加載,然 後停止運行。GRUB 將給出一個錯誤消息。這裡發生的事情是:階段 1 加載程序(它需要加載一列扇區 以達到階段 2 加載程序)可能從它擁有的地址加載一些扇區,但這些扇區不再擁有階段 2 簽名。如果 您使用此前介紹的方法來構建一張啟動軟盤,別忘了 lilo 或 grub-install 放置到該軟盤上的全部內 容是一個單一的引導扇區,因此您的啟動軟盤可能沒有什麼幫助。正如在之前的示例中,您可能需要引 導某種類型的還原環境,然後在您的 MBR 中重新安裝您的啟動加載程序。

您可能已經注意到, 我們的配置示例對分區使用了一些標簽和 UUID (Universally Unique IDs)。例如:

kernel /boot/vmlinuz-2.6.26.8-57.fc8 ro root=LABEL=FEDORA8 rhgb quiet

kernel /boot/upgrade/vmlinuz preupgrade repo=hd::/var/cache/yum/preupgrade stage2= \

hd:UUID=8b4c62e7-2022-4288-8995-5eda92cd149b:/boot/upgrade/install.img \

ks=hd:UUID=8b4c62e7-2022-4288-8995-5eda92cd149b:/boot/upgrade/ks.cfg

移動分區時, 我經常使用這樣的 UUID 來幫助避免問題。您仍然需要更新 GRUB 或 LILO 配置文件並重新運行 lilo, 但是不必更新 /etc/fstab。當您在一個系統上創建一個分區映像,並在另一個系統上的一個不同位置上 恢復該映像時,這尤為方便。當您從一個驅動器(比如,一個 USB 驅動器)啟動時也很方便,該驅動器 並不總是附加在同一位置。

使用引導分區

用於恢復(或者可能是避免)的另一種方法是 使用一個獨立的分區來啟動。當您擁有一個測試系統,系統上有幾個版本,而且您可能需要頻繁重新構 建該系統時,這種方法尤其有用。這個引導分區不必非常大,大約 100MB 左右即可。但是這個分區應該 不太可能被移動,且不太可能由於添加或刪除另一個分區而影響它的分區編號。在一個混合 Windows 和 Linux 環境中,/dev/sda2(或者 /dev/hda2,取決於您的磁盤的標簽設置方式)通常是一個不錯的引導 分區的選擇。清單 15 展示了一個小型引導分區(/dev/sda2)中的條目,這個分區實際上由我們一直作 為示例使用的系統上的主引導記錄加載的。

清單 15. 通過 GRUB 使用一個小型引導分區

# menu.lst - See: grub(8), info grub, update-grub(8)
#            grub-install(8), grub-floppy(8),
#            grub-md5-crypt, /usr/share/doc/grub
#            and /usr/share/doc/grub-doc/.
    
## default num
# Set the default entry to the entry number NUM. Numbering starts from 0, and
# the entry number 0 is the default if the command is not used.
#
# You can specify 'saved' instead of a number. In this case, the default entry
# is the entry saved with the command 'savedefault'.           
default     0
    
## timeout sec
# Set a timeout, in SEC seconds, before automatically booting the default entry
# (normally the first entry defined).
timeout     10
    
## password ['--md5'] passwd
# If used in the first section of a menu file, disable all interactive editing
# control (menu entry editor and command-line)  and entries protected by the
# command 'lock'
# e.g. password topsecret
#      password --md5 $1$gLhU0/$aW78kHK1QfV3P2b2znUoe/
# password topsecret
    
title           Fedora 8 (sda6) Grub menu
root            (hd0,5)
chainloader     +1
boot
    
# Ubuntu 9.10 uses GRUB 2, so use kernel to drive GRUB 2 menu.
title           Ubuntu 9.10 (sda7)
root            (hd0,6)
kernel          /boot/grub/core.img
    
# This is a divider, added to separate the menu items below from the Debian
# ones.
title       Other operating systems:
root
    
# Windows XP
title       Windows NT/XP
root        (hd0,0)
savedefault
chainloader +1

當您的 root 分區使用一個您的啟動加載程序不支持的文件系統時,也需要一 個引導分區。例如,當 root 分區(/)使用 GRUB Legacy 不支持的 LVM 時,將 /boot 分區格式化為 ext2 或 ext3 是非常常見的。

如果您的系統上有多個版本,不要 在它們之間共享 /boot 分區 。記得將 LILO 或 GRUB 設置為從稍後將作為 /boot 加載的分區啟動。還要記住一點:一個發行版的更 新程序通常將會更新該系統的 GRUB 或 LILO 配置。在一個包含多個系統的環境中,您可能想要將一個 帶有其自己的 /boot 分區的系統作為主系統,並在您的一個系統需要配置文件時手動更新該文件。另一 種方法是使每個系統都安裝一個啟動加載程序到其自己的分區引導記錄中,並使您的主系統為這些單獨 的系統鏈式加載分區引導記錄,從而向您提供一個兩階段菜單過程。

構建一個自包含引導軟盤或 CD-ROM

最後,我們將更仔細地檢查 GRUB 設置,以及如何構建一個獨立的軟盤或 CD,它們將使 您獲得一個 GRUB 提示,無論您的硬盤驅動器出現了什麼情況都可以恢復。

如果您對硬盤驅動器 布局比較熟悉,正如文章 “學習 Linux 101:硬盤布局” 所討論的那樣,您應該記得所有關於硬盤驅 動器柱面的內容。即使您將柱面視作帶有現代驅動器的虛構實體,您的文件系統的許多方面仍然涉及到 它們。特別是,您會發現,分區使用了幾個必不可少的、在柱面邊界上對齊的柱面。在一個分區內部, 許多文件系統仍然以柱面作為單位來管理空間。在許多 UNIX? 和 Linux 系統上,文件系統的布局存儲 在一個超級塊(superblock)中,它是文件系統的第一個分配單元。對於 ext2 或 ext3 這樣的文件系 統和相對較大的硬盤驅動器,空間將被分割為幾個區域,每個區域的開始部分都有一個超級塊副本。如 果您不小心使用 fdisk 這類程序混淆了分區邊界,這會有助於恢復。

柱面思想的另一個好處是 MBR 後面的磁盤的開頭有一些空間。GRUB 通過以下方式來利用這個好處:在這個空間中嵌入一個階段 1.5 啟動加載程序,或者在可能的時候將其放置在一個分區上的類似未使用空間中。這個階段 1.5 加載 程序理解包含階段 2 的分區上的文件系統,因此能夠在一定程度上更好地保護系統免受移動文件的影響 。

這樣的確不錯,但它如何關聯到一張可引導軟盤呢?的確,軟盤沒有太多空間,也沒有多少柱 面概念,因此,如果您想要從一張軟盤同時啟動 GRUB 的階段 1 和階段 2,則必須安裝階段 1,並立即 將階段 2 復制到引導扇區後的扇區。清單 16 展示了這樣一個示例。使用一張空白軟盤,因為這個過程 可能損壞數據。應該復制您的 GRUB 版本中的文件,而來自 /boot/grub 目錄的文件,因為 /boot/grub/stage2 已經被修改為使用您的硬盤驅動器分區。您可以在 /usr/share/grub 目錄的一個子 目錄中找到原始的 stage1 和 stage2 文件。在我們的示例中,它們位於 /usr/share/grub/i386- redhat 中。

清單 16. 創建一個 GRUB 啟動軟盤

[root@pinguino ~]# ls 

/usr/share/grub/
i386-redhat
[root@pinguino ~]# cd /usr/share/grub/i386-redhat/
[root@pinguino i386-redhat]# ls -l st*
-rw-r--r-- 1 root root    512 2008-05-28 12:05 stage1
-rw-r--r-- 1 root root 109212 2008-05-28 12:05 stage2
-rw-r--r-- 1 root root 109212 2008-05-28 12:05 stage2_eltorito
[root@pinguino i386-redhat]# dd if=stage1 of=/dev/fd0 bs=512 count=1
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.29007 s, 1.8 kB/s
[root@pinguino i386-redhat]# dd if=stage2 of=/dev/fd0 bs=512 seek=1
213+1 records in
213+1 records out
109212 bytes (109 kB) copied, 7.4094 s, 14.7 kB/s
    
    
[root@lyrebird root]# ls /usr/share/grub
i386-redhat
[root@lyrebird root]# cd /usr/share/grub/i386-redhat
[root@lyrebird i386-redhat]# ls -l st*
-rw-r--r--    1 root     root          512 Aug  3  2004 stage1
-rw-r--r--    1 root     root       104092 Aug  3  2004 stage2
[root@lyrebird i386-redhat]# dd if=stage1 of=/dev/fd0 bs=512 count=1
1+0 records in
1+0 records out
[root@lyrebird i386-redhat]# dd if=stage2 of=/dev/fd0 bs=512 seek=1
    
203+1 records in
203+1 records out

如果您在執行這個操作之前使用 MS-DOS 格式化軟盤啟動,而且現在想要 掛載這張軟盤,那麼掛載命令將產生一個錯誤。在該軟盤引導扇區(seek=1)損壞軟盤上的文件系統後 復制 stage2。

盡管創建一個可引導的 GRUB CD 的方法基本相似,但需要在硬盤驅動器上准備這 個 CD 映像。您還需要一個臨時目錄,比如 grubcd,並包含子目錄 boot 和 boot/grub。然後,需要將 stage2_eltorito 文件從 GRUB 版本復制到您剛剛創建的 grub 子目錄中。然後使用 genisoimage 創建 一個可引導的 .iso 映像文件,您可以使用自己喜歡的刻錄工具將該文件刻錄到 CD 中。清單 17 展示 了如何將這個 CD 映像創建為 grubcd.iso。

清單 17. 創建一個 GRUB 可引導 CD 映像

[ian@pinguino ~]$ mkdir -p grubcd/boot/grub
[ian@pinguino ~]$ cp /usr/share/grub/i386-redhat/stage2_eltorito grubcd/boot/grub
[ian@pinguino ~]$ genisoimage -R -b boot/grub/stage2_eltorito -no-emul-boot \
> -boot-load-size 4 -boot-info-table -o grubcd.iso grubcd
I: -input-charset not specified, using utf-8 (detected in locale settings)
Size of boot image is 4 sectors -> No emulation
Total translation table size: 2048
Total rockridge attributes bytes: 760
Total directory bytes: 4576
Path table size(bytes): 34
Max brk space used 0
233 extents written (0 MB)

您可以在任意一台 PC 機上啟動 CD 或軟盤;沒必要一定在 Linux 系統上執行此操作。如果立刻啟 動該軟盤,那麼從軟盤加載階段 2 時會有一個延遲。類似地,如果啟動 CD,則會從 CD 加載 GURB shell。不管從哪裡啟動,都會得到一個 GRUB 啟動提示。可以按下 Tab 鍵查看可用命令的列表。嘗試 使用 help commandname 命令獲取關於 commandname 命令的幫助文件。清單 18 展示了 GRUB 命令行。

清單 18. GRUB 命令行

    GNU GRUB  version 0.97  (640K lower / 3072K upper 

memory)
    
 [ Minimal BASH-like line editing is supported.  For the first word, TAB
   lists possible command completions.  Anywhere else TAB lists the possible
   completions of a device/filename.]
    
grub> 
 Possible commands are: blocklist boot cat chainloader clear cmp color configfile 
 debug device displayapm displaymem dump embed find fstest geometry halt help
 hide impsprobe initrd install ioprobe kernel lock makeactive map md5crypt 
 module modulenounzip pager partnew parttype password pause quit read reboot 
 root rootnoverify savedefault serial setkey setup terminal terminfo testload testvbe
 unhide uppermem vbeprobe
    
grub> help rootnoverify
rootnoverify: rootnoverify [DEVICE [HDBIAS]]
    Similar to `root', but don't attempt to mount the partition. This
    is useful for when an OS is outside of the area of the disk that
    GRUB can read, but setting the correct root device is still
    desired. Note that the items mentioned in `root' which derived
    from attempting the mount will NOT work correctly.
    
grub> find /boot/grub/grub.conf
 (hd0,1)
 (hd0,5)
    
grub>

在該示例中,我們發現第一個硬盤驅動器的兩個不同分區上有一些 GRUB 配置文件。 可以使用 configfile 命令從其中一個配置文件加載 GRUB 菜單。例如:configfile (hd0,1)/boot/grub/grub.conf。

這將加載該配置文件的菜單,我們可以從該點啟動系統。您可 以在 GRUB 手冊中深入了解這些 grub 命令。在一個 Linux 終端窗口中嘗試輸入 info grub 命令來打 開該手冊。

下面是我們結束 GRUB 介紹之前的最後一點說明。前面已經介紹過,階段 2 GRUB 文 件會損壞軟盤上的文件系統。如果您想要創建一個加載 GRUB 文件(包括一個配置文件)的可引導 GRUB 恢復軟盤,那麼可以通過以下步驟來完成:

使用 mkdosfs 命令在軟盤上創建一個 DOS FAT 文件系統,並使用 -R 選項為階段 2 文件保留足夠的扇區。

掛載軟盤

在軟盤上創 建一個 /boot/grub 目錄。

將 GRUB stage1、stage2 和 grub.conf 文件復制到軟盤上的 boot/grub 目錄。如果願意的話,還可以復制您的 splash 映像文件。

編輯軟盤上的 grub.conf 文件,以便引用軟盤上的 splash 文件。

卸載該軟盤

使用 grub 命令 shell 中的 GRUB root 和 setup 命令在軟盤上設置 GRUB。

清單 19 展示了這個過程。

清單 19. 在包含一個 文件系統的軟盤上安裝 GRUB

[root@pinguino ~]# mkdosfs -R 220 /dev/fd0
mkdosfs 2.11 (12 Mar 2005)
[root@pinguino ~]# mkdir /mnt/floppy
[root@pinguino ~]# mount /dev/fd0 /mnt/floppy
[root@pinguino ~]# mkdir -p /mnt/floppy/boot/grub
[root@pinguino ~]# cp /boot/grub/stage1 /mnt/floppy/boot/grub
[root@pinguino ~]# cp /boot/grub/stage2 /mnt/floppy/boot/grub
[root@pinguino ~]# cp /boot/grub/splash* /mnt/floppy/boot/grub
[root@pinguino ~]# cp /boot/grub/grub.conf /mnt/floppy/boot/grub
[root@pinguino ~]# umount /dev/fd0
[root@pinguino ~]# grub
Probing devices to guess BIOS drives. This may take a long time.
    
    GNU GRUB  version 0.97  (640K lower / 3072K upper memory)
    
 [ Minimal BASH-like line editing is supported.  For the first word, TAB
   lists possible command completions.  Anywhere else TAB lists the possible
   completions of a device/filename.]
    
grub> root (fd0)
 Filesystem type is fat, using whole disk
    
grub> setup (fd0)
 Checking if "/boot/grub/stage1" exists... yes
 Checking if "/boot/grub/stage2" exists... yes
 Checking if "/boot/grub/fat_stage1_5" exists... no
 Running "install /boot/grub/stage1 (fd0) /boot/grub/stage2 p /boot/grub/grub.c
onf "... succeeded
Done.

這個示例也展示了這樣一個事實:可以在一個 Linux shell 中運行 grub 命令。這是了 解 GRUB 的一個好方法,沒有必要總是重啟計算機。您需要 root 權限才能運行 grub 命令,而且您可 以完成 GRUB 可以完成的大部分任務,除了重新啟動系統。

GRUB 2 的恢復介質

GRUB 2 帶有一個 grub-mkrescue 命令,可幫助您創建一個恢復軟盤或 CD 映像。最新版 grub-mkrescue 使用 xorriso 安裝包而不是 mkisofs 安裝包來創建 ISO 映像,如果第一次嘗試失敗,而且出現這樣一條消 息:“xorriso: command not found(xorriso: 找不到命令)”,那麼您可能需要安裝相應的安裝包。 清單 20 展示了如何在文件 rescue.iso 中創建一個 GRUB 2 恢復映像。不需要使用 root 權限創建還 原 ISO。我們在這裡使用 root 權限是為了向您展示如何創建一個可引導 USB 閃存驅動器,該驅動需要 root 權限。

清單 20. 創建一個 GRUB2 還原映像

[root@echidna ~]# 

/usr/bin/grub2-mkrescue -o rescue.iso
Enabling BIOS support ...
xorriso 1.2.4 : RockRidge filesystem manipulator, libburnia project.
    
Drive current: -outdev 'stdio:rescue.iso'
Media current: stdio file, overwriteable
Media status : is blank
Media summary: 0 sessions, 0 data blocks, 0 data, 7177m free
Added to ISO image: directory '/'='/tmp/tmp.Dw4KSbpoIx'
xorriso : UPDATE : 196 files added in 1 seconds
xorriso : UPDATE : 196 files added in 1 seconds
xorriso : NOTE : Copying to System Area: 29191 bytes from file '/tmp/tmp.LepCeiJPZM'
ISO image produced: 1094 sectors
Written to medium : 1094 sectors at LBA 0
Writing to 'stdio:rescue.iso' completed successfully.

完成 ISO 的創建之後,就可以將 它刻錄到 CD(或 DVD)。如果您喜歡的話,也可以將它復制到 U 盤,然後從 U 盤啟動,假設您的 BIOS 支持從這類設備啟動。清單 21 顯示如何使用 dd 命令將 ISO 映像復制到 U 盤 /dev/sdc。

警告:務必確保將該映像復制到正確設備。復制到錯誤設備可能損壞大量數據。

清單 21. 將 GRUB2 恢復映像寫入 USB 閃存驅動器

[root@echidna ~]# dd if=rescue.iso 

of=/dev/sdc
4376+0 records in
4376+0 records out
2240512 bytes (2.2 MB) copied, 0.625654 s, 3.6 MB/s

現在,您有了一個可引導的 USB 閃 存驅動器,它將引導到一個 GRUB 2 提示。可在 GRUB 手冊頁詳細了解 GRUB 2 命令。可以嘗試在 Linux 終端窗口輸入 info grub2 命令來打開手冊頁。

結束語

現在,您已經學習了傳統 Linux 系統的主要啟動加載程序,包括如何從錯誤和啟動問題中恢復。

下載

描述 名字 大小 下載方法 本文中使用的配置文件 l-lpic1-v3-102-2-samples.zip 8KB HTTP
Copyright © Linux教程網 All Rights Reserved