GRUB2中文指南第二版(上)

出自Ubuntu 正體中文 Wiki

跳轉到: 導航, 搜尋


頁面品質不佳
本頁面由於以下原因,被認為品質不佳:

結構不佳,需要維基化


目錄


英文文件:Grub2,由版友elmaz翻譯
中文第一版文件:GRUB 2

GRUB 2 是 Ubuntu 9.10 (Karmic Koala) 的預設開機載入和管理程式,並在 10.04 以後於許多作業系統中使用。在電腦開機時 GRUB 2 將顯示選單等待使用者輸入或是自動將控制權轉移到作業系統核心。
GRUB 2 繼承自 GRUB (GRand Unified Bootloader)。它經過了完全的重寫以提供使用者可觀的靈活性和效能增進。

在這份指南中,GRUB 2 版本為 1.98 或更新版。傳統 GRUB (0.97 版) 將以 GRUB 稱之。

注意:當系統中同時存在多個 GNU/Linux 發行版,請小心其他的發行版(特別是 OpenSuse 和 Fedora)並不一定會轉移至 Grub 2,而使得 Grub 2 的設定變為複雜。

GRUB vs GRUB 2

功能增進

GRUB 2 與原本的 GRUB 相比之下主要增進功能包含:

  • 命令稿支援,包括條件敘述和函式
  • 動態模組載入
  • 救援模式
  • 客製化選單
  • 佈景主題
  • 支援圖形化開機選單以及改良的開機影像能力
  • 直接由硬碟中的可開機光碟映像檔來開機
  • 新的設定檔結構
  • 非 x86 平台支援(例如 PowerPC)
  • 全面支援 UUID(不只在 Ubuntu)

重大改變

GRUB 2 的預設選單對 GRUB 使用者而言看起來很熟悉,但是在相似的表面下實則有非常巨大的相異之處。

  • 在沒有安裝其他作業系統的全新 Ubuntu 9.10 或 10.04 安裝下,GRUB2 將會直接開機到登入提示符號或是桌面。不會顯示選單。
  • 在開機期間按住 SHIFT 可顯示選單(之前在傳統 GRUB 中是 ESC 鍵)
  • 沒有 /boot/grub/menu.lst。已被 /boot/grub/grub.cfg 取代。
  • 在 grub 提示符號下沒有「/find boot/grub/stage1」。Stage 1.5 被淘汰了。
  • 主要選單檔,/boot/grub/grub.cfg,不應再被手動編輯,即使是由「root」身份。
  • grub.cfg 會在任何有更新、核心被加入/移除或是使用者執行 update-grub 的時候被覆寫。
  • 可使用的 Linux 核心清單將會參考在 /boot 目錄下的檔案自動產生。並非像以前需要編輯一個 menu.lst 檔案中的清單。執行「update-grub」來更新此清單。
  • 使用者可以編輯一個客製化檔案,/etc/grub.d/40_custom,在其中使用者可放入自己的選項。此檔案將不會被覆寫。
  • 主要用來改變顯示設定的設定檔是 /etc/default/grub。
  • 有好幾個檔案用來設定選單 - 上面提到的 /etc/default/grub,還有所有在 /etc/grub.d/ 目錄下的檔案。
  • 分割區編碼方式變更。現在第一個分割區是 1 而不是 0。然而第一個裝置依然是 0(沒有改變)。
  • 無論何時執行 update-grub 指令時,都會自動搜尋其他作業系統,例如 Windows。
  • 在 update-grub 指令執行前,所有設定檔中變更的設定都不會生效。

安裝

GRUB 2 會在全新安裝的 Ubuntu 10.04 中預設安裝。若從 Ubuntu 9.04 及之前的版本升級,將保留原本的 GRUB,除非使用者選擇升級至 GRUB 2。

您可以透過 Synaptic 或是從命令列來檢查目前安裝的版本。打開終端機(應用程式 > 附屬應用程式 > 終端機)並輸入以下指令:

grub-install -v

GRUB 2 應該會顯示版本編號 1.96 或是更新(總之,版本號會大於1)。GRUB 版本為 0.97。

預設安裝

GRUB 2 是 Ubuntu 9.10 及後續版本可開機光碟預設安裝的開機載入程式。

  • GRUB 2 套件為 grub-pc。grub-common 套件也將會一併安裝。
  • grub2 是過渡期虛擬套件。它可被安全移除,且不會在 Synaptic 中顯示為已安裝。

如果你已安裝 GRUB 2 ,則可以跳過下一小節,或返回目錄

升級至 GRUB 2

在 Ubuntu 9.10 或更早期的版本將 GRUB 升級至 GRUB 2 是相當容易的。
在使用者確認進行完全的轉換前,會執行一個程式確認 GRUB 2 能在您的電腦上工作。請注意,升級至 GRUB 2 只是一個可選選項,升級發行版並不會將 GRUB 升級到 GRUB 2 ,你必需手動更新。

在安裝 GRUB 2 之前,更新套件庫索引以確保系統有最新的軟體套件列表。
一般在終端機中透過 sudo aptitude update 指令或是 套件管理員,來更新列表。較舊的 GRUB 套件可能未包含早期版本的一些錯誤修正。
欲升級至 GRUB 2 請安裝「grub-pc」套件。此套件可由 Synaptic 中安裝,或是執行以下指令。一旦開始安裝,一份簡單的程序會引導使用者進行其餘的安裝過程:

sudo aptitude install grub-pc

1. 在第一個提示中,閱讀這些訊息,按下 tab 移至「OK」並按下 ENTER。
Grub2.upgrade.ok.sm.png

2. 在選擇「OK」後,下一個選項允許使用者在正常的 GRUB 選單中透過新增一個選項來測試 GRUB 2。
選擇「Yes」將在 GRUB 選單中增加一個 Chainload 選項。當下次使用 GRUB 開機時,使用者可以選擇正常的 GRUB 選項或是將控制權透過 Chainload 選項轉移至 GRUB 2。
也就是說,開機後的控制權是由 GRUB 轉移至 GRUB 2 最後才會進入 Ubuntu。

3. 下一步將會把來自 GRUB 的 menu.lst 的內容匯入「Linux command line」(如下圖),或許還會匯入至「Linux default command line」。
這些項目允許使用者輸入特殊指令,例如 quiet, splash, noapic 等。
GRUB 2 會自動匯入這些設定。你通常只需接受現有的選項並選擇「OK」。若有需要,選項可於稍後加入。更多細節請參考設定 GRUB 2 小節。
Grub2.command.line.ok.sm.png

當安裝在一個全新磁碟上,您可能需要標記所選的分割區為可開機的(bootable)。

4. 當系統已安裝完成 GRUB 2,使用者可重新啟動並看到已更新的 GRUB 選單歡迎畫面。
如圖所示,使用者將會看到一個「Chainload」選項,它將會測試 GRUB 2 安裝。
選擇 Chainload 選項將會把控制權轉移至 GRUB 2 並顯示 GRUB 2 選單。
Grub2.chainload.grub.sm.png

4a. 在選定選項的時候 Jaunty 使用者可能會碰到一個「無法辨識的裝置字串 (Unrecognized device string)」Error 11。
如果發生此情形,按下「e」直到您看到一行開頭為「grub edit>root」的文字。把「root」改為「uuid」,按下 ENTER,然後按「b」來啟動。更多關於 Error 11 的細節可以在命令列和救援模式小節中找到。

5. 測試新選項並注意到 Grub 1.9x 版本編號(新增高亮度部份)。
2.Grub2.chainload.grub2.sm.png

6. 若 GRUB 2 選單功能正常,使用者可執行以下指令以升級至 GRUB 2:

sudo upgrade-from-grub-legacy

2.Grub2.select.boot.png

在安裝期間,使用者可能會需要提供選擇,決定要將 GRUB 2 安裝在哪個裝置(硬碟)上。使用上/下鍵來選擇一個裝置(sda, sdb 等等),然後按下空白鍵來選定該裝置。
一旦至少一個以上的裝置被選擇後,使用 TAB 鍵將 OK 反白,然後按下 ENTER。未成功選擇一個裝置將會導致 GRUB Error 15 錯誤產生並導致安裝失敗。
在成功升級至 GRUB 2 之後,程式會告知使用者有些 GRUB 設定檔依然在系統中,並可被移除。以下為執行此動作的指令

rm -f /boot/grub/menu.lst*

執行 rm 指令時請特別慎重。不正確輸入此指令可能導致系統檔案被永久的刪除。

檔案結構

GRUB 2 包含一個完全修改過的目錄及檔案階層。GRUB 的 menu.lst 不再繼續使用。

欲找出 GRUB 2 安裝位置,使用者可以執行以下指令:

  • sudo grub-probe -t device /boot/grub 可找到安裝的裝置
  • sudo grub-probe -t fs_uuid /boot/grub 可找到 UUID。

以下列出 GRUB 2 的主要檔案和目錄

/boot/grub/grub.cfg

這是最相似於 GRUB /boot/grub/menu.lst 的檔案。(僅是相似,部份功能不同)
此檔案中包含了 GRUB 2 選單資訊,但不像 GRUB 的 menu.lst,此檔案不該手動編輯

  • 每個段落明確地由「(### BEGIN)」界定,而其內容主要是從 /etc/grub.d 目錄中的檔案複製過來的。
  • grub.cfg 由 root 身份執行 update-grub 來更新。update-grub 指令是 sudo grub-mkconfig -o /boot/grub/grub.cfg 的簡化。
    • 為了標準化,使用 update-grub 指令,加上 sudo 以 root 權限執行,也就是 sudo update-grub 。
  • 此檔案將會在核心安裝/更新時或是其他會影響到它的輸出時自動更新。
  • 多數情況下,此檔案會被設定為「唯讀」。這是刻意保持的狀況,讓此檔案無法被手動編輯。
  • /boot/grub 目錄下有許多 *.mod 類型的檔案。這些檔案代表 GRUB 2 的模組化本質,它們會依需求而被載入。

/etc/default/grub

  • 此設定檔包含以前在 GRUB 的 menu.lst 前半部段落以及每行核心設定後面的物件資訊。
  • 在此檔案中的條目可以由具有管理者(root)權限的使用者編輯,並會在更新時合併至 grub.cfg 中。

具體的設定選項可以在此小節稍後的設定 GRUB 2 中找到詳細資訊。

/etc/grub.d/(目錄)

在此目錄中的檔案將會於執行 update-grub 指令的時候讀取,並將其中的指令合併至 /boot/grub/grub.cfg 中。
在 grub.cfg 選單中,選項順序是依照此目錄中檔案的順序來決定。檔案名稱中的數字越小,其內容就會越前面。。如 10_linux 將會在 20_memtest 之前執行,而 40_custom 將在最後執行。若檔名全為英文字母,將會在數字名稱的檔名後執行。
自訂選項可以放在 40_custom 檔案,或新的檔案中。如開頭為 06_ 的檔案,它的內容將會出現在選單的最上方,因為他的字母排序將會在 10_ 和 40_ 之前。

在 update-grub 執行過程中,只有可執行檔會輸出至 grub.cfg。

在此目錄中的預設檔案為:

  • 00_header - 設定初始顯示項目
    • 圖形模式、預設選項、時間限制等等
    • 這些設定資訊一般由 /etc/default/grub 中匯入。使用者一般不需要對此檔案做任何更動。
  • 05_debian_theme - 佈景主題的設定
    • 設定開機影像、文字顏色、高亮度選項及佈景主題
    • 在沒有開機影像的情況下,此檔案會設定一個單色的佈景主題來顯示初始選單畫面
    • 設定字型顯現及開機影像將會在開機影像和佈景主題小節中討論
  • 10_hurd - 指定 Hurd 核心位置。目前未使用。
  • 10_linux - 指定作業系統目前使用中的 root 裝置核心位置
    • 此資訊將會取用來建立這些核心顯示在選單中的名稱。因為有 10_linux 中的指令,我們不需要(甚至幾乎不可能)手動來建立顯示在選單中的核心名稱列表
    • 注意:若您不想要所有的舊核心版本全都顯示在選單中,將那些檔案從 /boot 中移除。
  • 20_memtest86+ - 搜尋 /boot/memtest86+.bin 並將之包含在 GRUB 2 開機選單選項中
    • memtest86+ 主要是進行記憶體測試
    • memtest86+ 選項顯示可透過移除此檔案的執行權限:sudo chmod -x /etc/grub.d/20_memtest86+ 接著執行 sudo update-grub 來隱藏
  • 30_os-prober - 此檔案使用 os-prober 來搜尋 Linux 和其他作業系統。結果將會依據此檔案中的內容而放至 grub.cfg 中
    • 此檔案被劃分成四個段落,代表由指令稿所處理的四種作業系統類型:Windows, Linux, OSX 和 Hurd
    • 其中的變數用來指定在 /boot/grub/grub.cfg 和 GRUB 2 選單中的名稱顯示格式。熟悉基本指令稿的使用者可以修改這些變數來改變選單選項的顯示格式
    • 使用者可以插入任何選項至 /etc/default/grub 中以關閉這個命令稿。(參考下方)os-prober 預設忽略任何具有 dmraid 簽名的硬碟,那些硬碟可藉由 sudo dmraid -r -c 來列出。
  • 40_costom - 用來加入自訂選單選項的樣板
    • 會在執行 update-grub 指令時嵌入至 grub.cfg 中。其內容,在「exec tail -n +3 $0」這一行和預設的註解後,會毫無改變地直接匯入至 /etc/default/grub.cfg 中
  • 該目錄中的檔案必須要設為可執行才能被 update-grub 使用,沒有設為可執行的檔案將會被忽略。欲將檔案設為可執行,執行 sudo chmod +x 檔案名稱

設定 GRUB 2

設定變更通常會修改 /etc/default/grub 和 /etc/grub.d 目錄中的自訂檔案。/boot/grub/grub.cfg 檔不應直接編輯,你應該修改前述的檔案。
某些最常見的變更,例如預設的作業系統/核心和選單逾時,可以經由一個圖形化使用者介面應用程式 StartUp-Manager 來修改。

/etc/default/grub(檔案)

主要設定檔。在安裝時,以下內容可由使用者變更:

  • GRUB_DEFAULT - 設定預設選單選項。選項可以是數字、完整的選單選項文字或是「saved」。
    • GRUB_DEFAULT=0 以選單位置來設定預設選單選項。如同 GRUB,在 grub.cfg 中的第一筆「選單選項」為 0,第二筆為 1,以此類推。
    • GRUB_DEFAULT="xxxx" 一個完全相同的選單條目,包含雙引號,也可被使用。在此例中,選單中的位置不會有影響。例如:GRUB_DEFAULT="Ubuntu, Linux 2.6.31-9-generic"
    • GRUB_DEFAULT=saved
      • 此功能僅於 GRUB 1.98 及之後版本中。
      • 啟用「grub-reboot」和「grub-set-default」指令來設定預設作業系統。
      • 預設作業系統不會由來自選單中的互動式選擇而被設定。
      • grub-set-default 設定預設開機選項直到有所變更。
        • 格式為 sudo grub-set-default X,此處的 X 代表選單選項的位置(第一筆由 0 開始)或是完全一致的選項字串。例如:sudo grub-set-default 3 將使用選單選項位置,或是 sudo grub-set-default "Ubuntu, Linux 2.6.32-15-generic" 表示選單選項字串。
        • 欲取得現存的選單選項選擇數字(由 0 開始)或是選單選項「字串」,執行 grep menuentry /boot/grub/grub.cfg
      • grub-reboot 此指令設定重新開機時的預設開機選項。指令格式與 grub-set-default 相同(參考上面)。
  • GRUB_SAVEDEFAULT= 若設定為 true 則會將以上次所選的開機選項做為預設選項。
    • 不需要執行指令來設定預設作業系統。
    • 只要手動選擇 GRUB 2 選單中的選項,它就會變為預設作業系統。
    • 若您的 /boot 目錄位於 LVM 分區或是 RAID 上,此選項會無作用。
  • GRUB_HIDDEN_TIMEOUT - 決定 GRUB 2 選單會有多長時間不被顯示。當螢幕是空白時,按任意鍵來顯示選單。
    • 預設狀態下若只有存在一個作業系統時才會隱藏選單。如果使用者想要強制顯示選單,在此選項最前方加上一個 # 符號來關閉此功能。
    • 從 GRUB 1.97~beta - Karmic 使用的版本開始,選單能否包含空白螢幕的倒數延遲取決於 GRUB 2 是否找到多個作業系統。
    • 多重作業系統使用者注意:若更新選單時,GRUB 2 的 os-prober 發現額外的作業系統,隱藏選單的 timeout 功能會依照某些條件狀況而關閉。同時也會關閉開機時按住 SHIFT 以顯示選單的功能。如果想要強迫隱藏選單,可以在各大論壇中(例如:ubuntuforums)找到如何編輯的文件,以在開機過程中加入隱藏倒數的功能。
    • GRUB_HIDDEN_TIMEOUT=0 在單一作業系統電腦中。
      • 會立刻以預設作業系統開機。
      • 在只有一個作業系統狀況下,這是預設的設定。
      • 在此狀態下若想顯示選單,就在此行最前方加上 # 符號,並確認 GRUB_TIMEOUT 設定為正整數。
      • 若 GRUB 2 認定在開機過程中 SHIFT 鍵是被按住的,則選單就會顯示出來。這樣能讓使用者有方法在沒有顯示選單的情形下中斷自動開機程序。
    • GRUB_HIDDEN_TIMEOUT=X
      • X 為一正整數(例如 1、5、10 等等)
      • 開機程序將會暫停並顯示空白畫面或是已設定的開機影像 X 秒鐘。在時間結束後,系統將會開機。不會有選單顯示。
      • 當 GRUB_HIDDEN_TIMEOUT 啟用時,按下任意鍵以顯示選單。
    • GRUB_HIDDEN_TIMEOUT=
      • 在 = 符號後沒有輸入任何數值
      • 選單將會依據 GRUB_TIMEOUT 設定的數值作為顯示的秒數。
  • GRUB_HIDDEN_TIMEOUT_QUIET - 是否顯示倒數計時器
    • true 不顯示倒數。螢幕將會是空白的。
    • false 空白螢幕上會顯示一個倒數計時器。
  • GRUB_TIMEOUT - 多久之後自動以預設作業系統開機
    • 此指令將推遲 GRUB_HIDDEN_TIMEOUT 設定,除非 GRUB_HIDDEN_TIMEOUT 被註解掉(#)
    • 設定此值為 -1 時選單會持續顯示,直到使用者進行選擇。
    • 若沒有其他作業系統,此行將會被註解掉,也就是隱藏選單。為了在每次開機時顯示選單,去掉此行的註解並使用 1 或更大的值。
  • GRUB_DISTRIBUTOR=lsb_release -i -s 2> /dev/null || echo Debian
    • 取得選單選項中的描述名稱。(Ubuntu, Xubuntu, Debian 等等。)
  • GRUB_CMDLINE_LINUX
    • 若存在,無論在一般或是救援模式,此行將匯入任何在 'linux' 註解行中的項目(GRUB 的「kernel」行)。類似於 menu.lst 中的「altoptions」行。
  • GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
    • 此行將匯入任何在 'linux' 行中的項目(GRUB 的「kernel」行)。此選項只會附加於一般模式的最後方。類似於 menu.lst 中的「defoptions」行。
    • 欲顯示黑色螢幕以及開機行程文字,移除「quiet splash」
    • 若想看到 grub 開機影像及簡短的文字輸出,使用「splash」。選項「acpi=off」,若有需要的話,也可以輸入在此行。
  • #GRUB_TERMINAL=console
    • 移除註解以停用圖形化終端機(只限 grub-pc)
  • #GRUB_DISABLE_LINUX_UUID="true"
    • 若您不想讓 GRUB 傳遞「root=UUID=xxx」參數給 Linux 時,移除此註解。
    • 這裡有一個 bug,若使用者移除最前面的註解符號,則 true 必須要有雙引號包起來以使得此選項生效。雙引號預設並沒有出現,必須手動加入。
  • #GRUB_GFXMODE=640x480
    • 您可移除 # 符號來啟用此行。此選項會設定圖形化選單的解析度(選單文字大小)。僅能使用顯示卡所支援的解析度(例如 640x480, 800x600, 1280x1024 等等)
    • 此設定不影響作業系統解析度
    • 在 GRUB 2 中設定與作業系統相同的解析度將會稍微減少開機所需時間,但進入 GRUB 2 中會消耗額外資源,故實際對開機速度幫助有限,甚至是相反。
    • 可以指定色彩深度(色彩品質),附加在解析度設定之後。像是 1280x1024x24 或 640x480x32
    • 可以加入多個解析度,當無法使用第一個選項,GRUB 2 會試著使用下一個設定。設定由逗號分開。例如:1280x1024x16,800x600x24,640x480
    • 若有使用開機影像,請確定解析度設定和開機影像大小相同
    • 若使用的選項導致在執行 update-grub 時有「無法找到 (not found)」的訊息,試著加上或變更色彩深度設定
    • 能夠在 GRUB 2 中使用的解析度可透過 GRUB 2 命令列模式下輸入 vbeinfo 得知。此命令列模式可在 GRUB 2 選單畫面顯示時按下「c」鍵進入。
    • 若此行被註解掉(#)或是解析度無法使用,GRUB 2 將使用 /etc/grub.d/00_header 中的設定。
    • 欲參考關於使用開機影像時改變解析度的說明,請參考開機影像和佈景主題小節。
  • GRUB_GFXPAYLOAD_LINUX=keep
    • 配合 GRUB_GFXMODE 使用,讓核心和 GRUB 2 使用相同的解析度。
  • GRUB_DISABLE_LINUX_RECOVERY=true
    • 加上或移除此行註解來防止「救援」模式顯示在選單中。若只想要有一個「救援」選項,在 /etc/grub/40_custom 中製作一個特殊選項。
  • GRUB_INIT_TUNE="480 440 1"
    • 當移除註解時,會在 Grub 2 選單顯示前播放一次嗶聲。
    • 格式為 節奏 [音調1 持續時間1][音調2 持續時間2]...
    • 節奏只需設定一次,應用於所有持續時間設定。
    • 持續時間以 60/節奏 秒 為單位,當持續時間為 1 而節奏為 60 時,會產生一個長度為 1 秒的嗶聲。持續時間為 1 節奏為 480 時會產生長度為 0.125 秒的嗶聲。
    • 警告:選單會在聲音播放完畢後才顯示。製作一個冗長的旋律將會讓選單顯示延遲。
    • 在終端機中可以輸入 info grub --index-search play 來讀取線上說明文件。此份文件會說明使用 play file 指令來播放 little-endian 格式製作的旋律。

額外可能包含的指令:

  • GRUB_DISABLE_OS_PROBER=true
    • 啟用/停用 os-prober 對其他分割區作業系統的檢查,包括 Windows, Linux, OSX 和 Hurd。

開機顯示行為

在進入任何作業系統前 ,GRUB 2 會先執行。它的模組化元件只有在有必要的時候才會戴入
選項的顯示基本上由 /etc/default/grub 來決定。特定選項和格式請參考設定 GRUB 2 小節。

初始化預設值

若沒有偵測到其他作業系統,GRUB 2 將會直接啟動預設的作業系統,而不顯示選單。若偵測到其他作業系統,GRUB 2 選單將會顯示。

逾時顯示

  • 選單將會在預定的秒數中顯示。預設選項會以高亮度標記,使用者可以在時間倒數結束前選擇其他選項。預設的逾時時間為 3 秒。倒數結束後,GRUB 2 會以預設選項開機
  • 當按下任何按鍵時,此設定將會失效,使用者必須手動選擇
  • 預設選項由 /etc/default/grub 中的 DEFAULT= 來設定;第一筆「選項」的值為「0」

隱藏

  • 不顯示選單選項。若有設定開機影像,將會顯示開機影像。
  • 使用者可以藉由按住 SHIFT 鍵直到選單顯示,以此來中斷開機程序並顯示選單。
  • GRUB 2 會在開機過程中搜尋 SHIFT 鍵按下的訊號。若此鍵按下或是 GRUB 2 無法確認此鍵的狀態,選單將會顯示。
  • 螢幕保持空白但允許顯示選單的時間是由 /etc/default/grub 中的設定來決定。
  • GRUB 2 可以顯示一個倒數計時器以提供剩餘時間的視覺回饋,直到預設的選項被選定。此逾時設定在 /etc/default/grub 中。
  • 在倒數結束時,在 /etc/default/grub 中所設定的預設選項將會被選定。

儲存

  • 若在 /etc/default/grub 設定為 DEFAULT=saved,則可以執行 sudo grub-set-default 指令來儲存預設的作業系統。當 /etc/default/grub 設定為 SAVEDEFAULT=true 時也可儲存。
  • 在此情況下,預設的作業系統將會保持設定,直到從 GRUB 2 選單中手動選擇新的作業系統或是執行了 grub-set-default 指令。

上次開機失敗或開機至復原模式

若上次開機失敗或開機至復原模式後,選單將會顯示出來直到使用者作出選擇。
此情況下在 /etc/default/grub 的倒數時間設定將不會生效。若想改變此特性,必須要修改 /etc/grub.d/00_header(如果開機失敗檢查的 if 敘述在此文件的最末端)。

自訂選單項目(此小節之後待校稿)

GRUB 2 允許使用者建立自訂選單選項,在執行 sudo update-grub 時此選項將會自動加入主選單中。在 /etc/grub.d/ 中有一個空的 40_custom 檔可以使用,或是以其當作建立其他自訂選單的範本。這裡有一些自訂選單需要考量的地方: 檔案的名稱將會決定選項在選單中的排序。數字檔名會在前先執行,跟著是文字檔名。 10_linux 選項會出現在 30_os-prober 選項之前,然後跟著是 40_custom 選項,最後是 my.custom.entries。 使用者欲將自訂選項排在主選單第一位,可以將檔案命名為 06_xxx 如此一來它將會是選單中的第一筆選項。 檔案必須有可執行權限:sudo chmod +x /etc/grub.d/filename。 在 update-grub 指令未執行前,grub.cfg 的內容不會加入新增變更部份。 不像 grub.cfg,自訂檔案可以在任何時間編輯,不是唯讀權限,而且若想要的話可以以使用者為檔案擁有者。 自訂檔案是靜態的。當新的核心加入或移除時其內容將不會被變更(除非內容受使用者加入的命令稿影響)。 若自訂檔案將 menuentry 放在 grub.cfg 的最上方,使用者也許想要在執行 update-grub 後確認 /etc/default/grub 的 DEFAULT= 設定狀態。確保它依然指到想要的選單選項上。在計數時,/etc/default/grub 第一筆「選單選項」為 0。

建立自訂選單

使用者可選擇由預設的 /etc/grub.d/40_custom 檔來修改或是建立一個新檔。建立一個新自訂選單最簡單的方法為從 /boot/grub/grub.cfg 複製一份使用中的選項。複製之後,在 40_custom 中的內容可剪裁為使用者想要的樣式。 根據預設的範例自訂檔(/etc/grub.d/40_custom)在 /etc/grub.d 中任何自訂檔的頭兩行應該是:

  1. !/bin/sh

exec tail -n +3 $0 使用者可從 /boot/grub/grub.cfg 或是從傳統 GRUB 檔中複製已存在的選單選項。若使用者想從傳統 GRUB 的 menu.lst 中複製: 若使用者從 GRUB 升級至 GRUB 2 則也許可找到一份備份檔在 /boot/grub 目錄下。 以下來自 GRUB 選單中的項目必須修改才能作用: title 更改為 menuentry。此行必須由 { 作為結束 root 更改為 set root= kernel 必須改為 linux 任何 partition 命名(sda4, sdb6)必須修改,因為 GRUB 和 GRUB 2 的分割區計數方式不同。GRUB 2 中的第一個分割區為 1,不是 0。裝置依然由 0 開始計數。 仔細檢視任何作用中的 GRUB 2 menulist 條目格式以確保使用正確的格式。 一般 menuentry 建構規則: 第一行一定由 menuentry 開頭,並以 { 結束 大括號之間的區域就是會出現在 GRUB 2 的內容。依照需求編輯。 menuentry 最後一行一定是 } 每行最後面不要留下空白 set root= 行應該指到 GRUB 2 的 /boot 位址(sdXY) 在 linux 行中的 root 應指向系統分割區。 若 GRUB 2 無法找到指定的核心,試試看以裝置名稱來取代 UUID(例如:/dev/sda6)。 一份從 grub.cfg 複製來由使用者修改過的選項範例可能會看起來像這樣:

menuentry "My Default Karmic" { set root=(hd0,1) search --no-floppy --fs-uuid --set cb201140-52f8-4449-9a95-749b27b58ce8 linux /boot/vmlinuz-2.6.31-11-generic root=UUID=cb201140-52f8-4449-9a95-749b27b58ce8 ro quiet splash initrd /boot/initrd.img-2.6.31-11-generic } 一份由網站上的指令將系統還原光碟(SystemRescueCD)安裝為硬碟版(在 sda8 上)的選項範例:

menuentry "System Rescue CD" { set root=(hd0,8) linux /sysrcd/rescuecd subdir=sysrcd setkmap=us initrd /sysrcd/initram.igz } 一份連鎖載入另一個 GRUB 開機載入程式的選項範例:

menuentry "Grub 1 Bootloader" { set root=(hd0.8) chainloader +1 }

備用模式

Grub 2 可以被設定為若預設選單項目因某些原因而開機失敗時,退回至先前成功開機的選單項目。這個網頁(德文)可以找到一個範例稿以達成此目的。

命令列&救援模式

使用者可以有數種方法來嘗試從失敗的開機中復原。如果選單依然可以使用,選單設定可以由使用者來檢視和修改。此外,若 GRUB 2 偵測到開機時因為 grub.cfg 的錯漏而無法將控制權轉移到所選擇核心的錯誤,它將會回復到救援模式。兩種方式都允許使用者藉由受限的命令列介面來復原為可用的系統。如果只有「Grub」字樣出現在螢幕頂端而沒有提示符號(存取命令列)或選單,參考從開機光碟重新安裝小節。

發現並解決問題: 如果你在閱讀此小節,你的作業系統也許遇到開機上的問題。以下段落將會詳述 GRUB 2 命令列功能的使用及編輯方法,以試圖將系統開機。GRUB 2 的其中一項進步就是從命令列中搜尋分割區內容的能力。若以下段落的指令無法使用,特別是伴隨著「無法找到(not found)」或是「核心必須先載入(the kernel must be loaded first)」的訊息,則使用以下指令來探索分割區。在 Ubuntu 中,/boot 目錄下通常都會包含至少一個「vmlinuz」核心和一個「initrd」 .img 檔案。在 /boot/grub 目錄下應該通常會包含一個「grub.cfg」以及許多「.mod」檔案。X 是磁碟,由 0 開始。Y 是分割區號碼,由 1 開始。在單一磁碟上一個乾淨的 Ubuntu 安裝中,主磁碟/分割區通常是 hd0,1。在單一磁碟包含 Windows 的多重開機環境下,一般通常位於 hd0,5。使用 ls 指令來查閱哪些是 GRUB 2 已知的磁碟/分割區。 欲探索 GRUB 2 的已知裝置,在 GRUB 2 選單中按「c」以進入命令列(如果還沒有進入的話): ls 顯示 GRUB 2 已知的磁碟/分割區。 ls (hdX,Y)/ 顯示指定磁碟/分割區下的 / 目錄內容。 ls (hdX,Y)/boot 顯示 /boot 目錄內容。例如:ls (hd0,5)/boot ls (hdX,Y)/boot/grub 顯示 /boot/grub 目錄內容。例如:ls (hd0,5)/boot/grub

開機時編輯選單

若開機過程中選單無法正常顯示,按住 SHIFT 鍵讓電腦試著顯示 GRUB 2 選單。 當選單顯示後,按下任何鍵(ENTER 除外)來停止倒數計時並以上/下鍵選擇想要的項目。 按下「e」鍵進入所選選項的設定。

Grub2.menu.edit.png

使用鍵盤來定游標位置。在此例中,游標已經被移動,因此使用者可以修改或刪除數字 9。 對任一行或每一行做單一或多處修改。不要使用 ENTER 來做行列間的移動。 可使用 Tab 鍵自動完成功能,這在輸入核心和 initrd 項目的時候特別好用。 當完成時,決定下一個步驟: CTRL-x - 以修改過後的設定開機(以高亮度強調) CTRL-c - 進入命令列來進行診斷、載入模組、修改設定等等。 ESC - 放棄所有修改並回到主選單 這些選擇也會列在螢幕底部作為提示。

命令列模式

從主要 GRUB 2 選單畫面使用者可選擇按下「c」進入命令列模式。 這裡有一些好用的小訣竅和特性來使用 GRUB 2 命令列: 關閉開機影像也許會讓終端機更容易檢視。按下「c」進入命令列然後輸入: set color_normal=white/blue 或是任何你想使用的顏色組合。第二個選項使用「black」會保留選單的透明度,若使用者想使用實色當作背景色的話應該避免此選擇。 為了預防畫面捲動到螢幕最上方以外,首先執行 set pager=1,此設定動作類似終端機的「| more」指令。如此將允許一個全畫面的資料,並在按下「ENTER」鍵時才會繼續往下捲動。 輸入 help 可檢視所有指令的清單。輸入 help x 來檢視所有以「x」字母開頭的指令。Tab 鍵自動完成以及使用向上鍵來重複上一個指令與一般終端機動作相同。 TAB 自動完成功能非常的好用。在任何時間,若元件是獨一的,按下 TAB 鍵可以自動完成一項輸入,否則會顯示所有可用的選項。輸入一些額外的字元後再按下 TAB 可自動完成剩餘的部份。 一些好用的指令包括: 指令 結果 background_image 載入一個現存的背景影像。使用 tab 自動完成來協助輸入檔名! background_image=/usr/share/images/grub/ 然後用 tab 來顯示所有影像的清單。當初始測試開機影像時 很有用的指令。 cat 用來顯示目前檔案內容。 cat /boot/grub/grub.cfg, cat /etc/fstab help 檢視所有可用指令。輸入 help x 來取得一份以字母 x 開頭的指令清單。help xxx 取得關於 xxx 指令的資訊。此指令應該接在「set pager=1」指令之後,會讓螢幕顯示類 似終端機「| more」指令的行為,以預防捲動超過螢幕頂端。 ls 單獨使用,列出 GRUB 2 所知道的所有裝置,例如 (hd0) (hd0,1) 等等。使用 ls 來檢視可用的分割區。使用 ls /boot, ls /boot/grub 來檢視 /boot 和 /grub 目錄內容。 initrd 載入 initrd。 linux 載入 linux 核心。 loopback 把檔案掛載成裝置。loopback loop (hd0,2)/iso/my.iso lsmod 顯示已載入模組 reboot 重新開機 rescue 進入救援模式 set 顯示適當的環境變數。與其他結合,設定變數如 set gfxmode=640x480, set color_normal=cyan/black 在命令列模式中使用後面的指令來測試各種選單字型顏色。 vbeinfo 顯示可用的螢幕解析度。

使用命令列介面開機

若使用者有開機上的麻煩但選單可用,最簡單的開機方法就是編輯現存的選單。參考開機時編輯選單。若 GRUB 2 尋找可用 grub.cfg 檔案失敗,它應會回復至 grub-rescue 模式。命令列提示符號會顯示 grub-rescue> 且將不會顯示選單。使用者可由此命令列才來嘗試手動輸入指令來開機至可用的系統。

若命令列提示符號沒有啟動,按下「c」來進入命令列模式。您將會看到 GRUB 2 提示符號: grub> 或 grub rescue>

若您在任何時間想要取消並重來,ESC 將會移除修改部份並讓使用者返回前一個選單。使用以下兩個指令來決定您想要開機的系統所在裝置(磁碟機)和分割區。 set 當輸入 set 且沒有附加項目時,此指令會顯示目前的 GRUB 2 設定。 ls 執行 ls 來查看 GRUB 2 認出的裝置。例如:(hd0) (hd0,1) (hd1,5)在此範例中 sda, sda1, sdb5 已被識別出來。

以最近使用的核心快速開機

指令摘要*: set root=(hdX,Y) linux /vmlinuz root=/dev/sdXY ro initrd /initrd.img boot

詳細指令*: 每行完成後按下 ENTER。某些條目可能不會有回應。這是正常的。 如果執行這些指令時有「檔案未找到(file not found)」或類似的錯誤訊息,確認您使用正確的 X,Y 值。ls 指令能協助決定正確的值。一旦確認了 X,Y 值,執行以下指令: set prefix=(hdX,Y)/boot/grub 1*. set root=(hdX,Y) 輸入來自 ls 指令正確的 X,Y 值並按 ENTER。記住 GRUB 2 將第一個裝置算為 0,第一個分割區為 1。例如:若 Ubuntu 系統安裝在 sda5,輸入: set root=(hd0,5)


2*. linux /vmlinuz root=/dev/sdXY ro 範例:linux /vmlinuz root=/dev/sda3 ro

  • Wubi 使用者請參考備註。

3. initrd /initrd.img 選擇最新的 initrd 影像。 4. boot 以選定的分割區最新的核心來開機。

  • 僅適用於 Wubi 使用者 - 用以下指令替換步驟 1 及 2:

set root=(loop0) linux /vmlinuz root=/dev/sdXY loop=/ubuntu/disks/root.disk ro 此變更並非永久性的。在成功的開機進入系統後使用者應執行 sudo update-grub 並觀察 GRUB 2 設定檔(/boot//grub/grub.cfg)。對於啟動主要 linux 核心的問題,確認檔案中在 [### BEGIN /etc/grub.d/10_linux ###] 段落的 search, linux, 和 initrd 行現在正確的指向正確位址。使用者也許需要重新安裝 GRUB 2(sudo grub-install /dev/sdX)。

手動開機到指定的核心

若 在開機過程中 GRUB 2 選單無法編輯,在命令列下還是有可能允許開機至某個特定核心下。若 GRUB 2 所使用的目錄位址正確,使用者可能可以在命令列中輸入單一行的指令提供所需的所有訊息。此小節將會提供如何輸入此訊息的逐步指引。指令完成時看起來會類似 如下所示: 指令摘要*: set linux /boot/vmlinuz- 詳細指令*:

只有在完成每一步驟(「1」、「2」、「3」和「4」)之後才按下 ENTER。 第 1 步*:設定根分割區 set root=(hdX,Y) 使用來自 ls 指令查詢到的正確 X, Y 值並 ENTER。記住 GRUB 2 將第一個磁碟算為 0,第一個分割區為 1。舉例,若 Ubuntu 系統位於 sda5,輸入:set root=(hd0,5)

  • 若是安裝在 Windows 中的 Wubi,使用以下指令:

set root=(loop0) 第 2 步*:輸入「linux」行訊息 linux /boot/vmlinuz-<您的版本> root=/dev/sdXY ro

  • 若是以 Wubi 安裝在 Windows 中,請使用以下指令代替:

root=/dev/sdXY loop=/ubuntu/disks/root.disk 在輸入 linux /boot/ 之後,使用者可按下 TAB 來顯示可用的核心。在「/」後沒有空白。若沒有可見的核心,那麼在「設定根分割區」步驟中的位址設定可能有誤。輸入正確的核心或是用 tab 自動完成。 至於在 root=/dev/ 部份,請使用正確的裝置名稱,例如「/dev/sda1」、「/dev/sdb5」等等。加上任何選項,例如 ro(唯讀),在每行的行末(一般而言非必要)。 一旦此行的所有資訊都正確,看起來應該會類似以下的範例。 linux /boot/vmlinuz-2.6.31-16-generic root=/dev/sda1 ro 當正確輸入並按下 ENTER 後,若找到 linux 核心,會有一行高亮度類似「Linux-bzImage」的確認訊息出現如下圖。

Grub2.cli.boot.png

若出現「檔案未找到(file not found)」或類似的訊息出現,表示要不是裝置/分割區/檔案不存在,不然就是 GRUB 2 並非在正確的磁碟、分割區和/或目錄中搜尋。使用 ls 指令來查明正確的位址接著執行以下指令。重複第 2 步。 set prefix=(hdX,Y)/boot/grub 第 3 步:輸入「initrd」行訊息 initrd /boot/initrd.img-<您的版本> 在輸入了 initrd /boot/ 之後,使用者可按下 TAB 來顯示可用的 initrd 映像檔。不要在「/」之後留空白。若沒有可見的映像檔,表示在「設定根分割區」步驟中的位址設定可能有誤。輸入正確的映像檔位址或是用 tab 自動完成。 一旦此行的所有資訊都正確,看起來應該會類似以下的範例。按下 ENTER。觀察確認訊息。 initrd /initrd-2.6.31-16-generic root=/dev/sda1 ro 當正確輸入並按下 ENTER 後,若找到 initrd 映像,會有一行高亮度類似「Initrd」的確認訊息出現如上圖。

第 4 步:重開機 boot 輸入指令並按下 ENTER。 救援模式

===救援模式=== 救援模式是 GRUB 2 的主要強化部份。若 GRUB 2 尋找可用的 grub.cfg 失敗並無法轉移控制權至核心,他將會進入 grub-rescue> 提示符號。在此提示符號下使用者可探查問題、進行修改,以及重新嘗試開機。

救援模式所提供的指令比起一般 GRUB 提示符號列少,但也提供額外的指令: 指令 結果 dump 清除記憶體 exit 退出 GRUB 2 normal 若可能的話回到標準的「grub>」模式 以下指令可以在 grub 救援模式中使用: boot cat chainloader dump exit kfreebsd kfreebsd_loadenv kfreebsd_module help initrd insmod linux lsmod multiboot normal rmmod set unset 雖然以下的指令並非全都是開機至 linux 核心所必須,這些指令能讓使用者在執行 boot 指令前確認問題所在,提供較佳的機會以成功開機。 若需要額外的指令,使用者可以試著用 insmod normal 來載入一般的 GRUB 2 模組。若成功, help 和其他額外的指令就可以使用。 指令摘要*:

1. ls 2. set prefix=(hdX,Y)/boot/grub 3*. set root=(hdX,Y) 4. set 5. ls /boot 6. insmod /boot/grub/linux.mod 7*. linux /vmlinuz root=/dev/sdXY ro 8. initrd /initrd.img 9. boot

  • 以 Wubi 安裝(在 Windows 內)只要用以下指令來替換步驟 3 和 7:

set root=(loop0) linux /vmlinuz root=/dev/sdXY loop=/ubuntu/disks/root.disk ro 詳細指令: 1. ls 此指令將顯示已知的裝置和分割區。由此資訊,使用者必須決定系統安裝在哪一個裝置和分割區。 2. set prefix=(hdX,Y)/boot/grub 若不正確,稍後將會發生「無此磁碟(no such disk)」或「無法找到(not found)」錯誤訊息。 3. set root=(hdX,Y) 在此指令中,X 為裝置/磁碟,由 0 開始。Y 為分割區,由 1 開始。範例:(hd0,1) 是 sda1。(hd3.5) 是 sdc5。 4. set 檢視「prefix=」列表。這裡應該會與步驟 3 的根目錄位址符合,為以下格式:prefix=(hdX,Y)/boot/grub。 5. ls /boot 檢視內容。使用者應該能看到多個核心、initrd 影像和 grub 目錄。若沒有,使用 ls 指令來檢查裝置並試著找尋檔案和目錄。若有必要,設定另一個裝置 為 root。 6. insmod /boot/grub/_linux.mod 載入(插入模組) linux 模組。此模組未載入,若沒有載入此模組,使用者將會收到一個「Unknown command linux」訊息。 7. linux /vmlinuz root=/dev/sdXY ro 載入 linux 核心,以正確的名稱替換掉「X」和「Y」(例如:sda1)。使用者將會看到核心已被載入的訊息。(參看上一小節圖片)

  • Wubi 使用者必須使用先前說明的替代指令。

8. initrd /initrd.img 載入 initrd 影像。當按下 enter 時,使用者可能會或不會看到終端機中的訊息。(參看上圖的高亮度部份) 9. boot 嘗試使用輸入的訊息進行開機。 這些變更並非永久的。在成功開機進入系統後,使用者應該執行 sudo update-grub 並觀察 GRUB 2 設定檔(/boot//grub/grub.cfg)。若開機進入主要 linux 核心有問題,請先確定在 [### BEGIN /etc/grub.d/10_linux ###] 段落中的 search, linux 和 initrd 這三行資訊目前指到正確的位址。使用者也許需要用 sudo grub-install /dev/sdX 指令來重新安裝 GRUB 2。

GRUB Errors

GRUB 2 並不會回報錯誤碼。若是錯誤訊息有帶著一個錯誤碼,這是由 GRUB 過渡至 GRUB 2 時發生的問題。

解決「Unrecognized Device String (Error 11)」

此錯誤訊息通常是肇因於選單選項中不良或異常的內容。最常見的原因為使用者試圖從使用連鎖載入(Chainload)功能的 Jaunty 升級至 GRUB 2 導致。 1. 當啟動 GRUB 2 時顯示以下訊息:

Grub2.unrecognized.device.string.error.png

2. 記住 Jaunty 的連鎖載入功能是有問題的,使用者按下任意鍵來回到主選單,然後按「e」直到看見「grub edit>」。編輯高亮度的「Chainload into GRUB 2」選項或任何使用者試圖用來開機的選項。

Grub2.error.root.png

3. 有敏銳記憶力的使用者應該還記得「root」需要修改為「uuid」。使用方向鍵來移動游標,用「uuid」來取代「root」。當結束編輯時,使用者按下 ENTER 鍵,然後再按「b」來使用修改過的選項來開機。注意這些指令與 GRUB 2 中使用的不同。

Grub2.error.uuid.png

若使用者打算保留雙重 GRUB 選項,以 root 身份開啟 /boot/grub/menu.lst 並將「Chainload into Grub 2」選單選項第二行「root」變更為「uuid」以修正錯誤。


File Not Found (Error 15)

此錯誤為 GRUB 2 安裝至 /boot 但主開機磁區(MBR)依然為傳統 Grub。此狀況發生在當您執行 sudo update-from-grub-legacy 時未選擇您的磁碟。執行此指令後使用者馬上會被要求選擇一個裝置(sda、sdb 等)。當顯示此畫面時選擇磁碟並按下空白鍵。沒有選擇磁碟將會導致 Error 15 的產生。

欲修復此錯誤,必須要重新安裝 GRUB 2。詳細指令請參考從開機光碟重新安裝小節。

Grub 顯示救援模式提示符號(且未繼續進行開機)

您 可能有一個有問題的 BIOS,且您的 /boot/* 檔案沒有位於磁碟的 1024 磁柱之內。在磁碟前端建立一個小型分割區,以 /mnt/b 來掛載,執行 cp -av /boot/* /mnt/b;umount /mnt/b;mount /dev/small_partition /boot; grub-install /dev/<device>。

開機影像和佈景主題

GRUB 2 開機影像

GRUB 2 較之前版本大大的加強了開機影像功能。設定開機影像需要進行兩個步驟:選擇欲使用的影像以及選擇顯示的文字顏色。

GRUB 2 Splash Images

安裝預設的 GRUB 2 影像套件,安裝「grub-splashimages」套件。


sudo apt-get install grub2-splashimages

不要把它與 grub-splashimages 套件搞錯,否則會與 GRUB 2 不相容。

這些下載影像的預設路徑在 /usr/share/images/grub。這個路徑或檔案所放置的其他路徑必須加進 05_debian_theme 中。(參見下方)

使用者可以建立並使用他們自己的開機影像。

設定開機影像

GRUB 2 的開機影像由 /etc/grub.d/05_debian_theme 所控制。以 root 身份開啟此檔案進行編輯。

以下關於設定背景影像的指引說明適用於 Karmic Koala,Ubuntu 9.10 的預設安裝 Grub 2 版本。在之後 Lucid Lynx 10.04 所找到的新版本 Grub 2(1.97 或更新版),此行: ">for i in {/boot/grub,/usr/share/images/desktop-base}..." 已被更簡化的版本取代: WALLPAPER="/usr/share/images/desktop-base/moreblue-orbit-grub.png" 在新的版本裡,僅需找到此行(大約在 /etc/grub.d/05_debian_image 的第 10 行)並將你目前想使用作為 GRUB 2 背景的正確路徑及檔名取代之即可。

找到以下行並編輯粗體部份,以你想要使用的 GRUB 2 開機影像路徑和名稱來取代: for i in {/boot/grub,/user/share/images/desktop-base}/moreblue-orbit-grub.{png,tga} ; do 在此項目中有些地方需要注意: GRUB 2 預設會在 /boot/grub 和 /usr/share/images/desktop-base 中尋找開機影像 grub2-splashimages 套件並非解壓縮至以上的兩個目錄中,而是在 /usr/share/images/grub 使用者必須在以下兩動作中擇一: 修改上面一行的目錄位置並指向正確的位置,或 將開機影像移動到上面所提到的兩個目錄之一。 欲加入 grub 目錄,讓項目看起來像以下這樣,然後改變檔名為在 /usr/share/images/grub 中欲使用的開機影像。 for i in {/boot/grub,/usr/share/images/desktop-base,/usr/share/images/grub}/moreblue-orbit-grub.{png,tga} ; do 檔名以句點結束(.)(/moreblue-orbit-grub.) 開機影像選擇: 若相同檔名檔案存在於超過一個目錄中,最早指定的目錄將會被使用。 若檔名相同而副檔名不同(多種副檔名),則最早指定的副檔名檔案將會被選擇。 使用者可以對上述設定行做許多變更以延伸開機影像的彈性: 加入使用者擁有的目錄,讓 GRUB 2 可以搜尋到更多可用的開機影像。 加入使用 JPEG 格式開機影像檔的能力。此時只有 8-bit JPEG 格式影像能被正確顯示。 注意影像必須儲存為 RGB 色彩格式顯示,而不是索引。 以下展示了新增加的使用者擁有的開機影像目錄以及增加 JPEG 支援: for i in {/boot/grub,/usr/share/images/grub,/home/drs/mysplash}/moreblue-orbit-grub.{png,tga,jpg,jpeg} ; do 一旦您輸入路徑和檔名至 05_debian_theme 中,您可執行 sudo upate-grub 來加新增資訊加入 grub.cfg。若開機影像加入成功,使用者將會在終端機執行指令時看到「Found Debian image...」。若沒有看到此段訊息,則影像資訊有可能未輸入。

設定選單字型&高亮度色彩

此行包含在 /etc/grub.d/05_debian_theme 中。這些指令不會在靠近檔案上方的主題設定設為「mono」的狀態下生效。 未選取的選單選項色彩如以下範例行來設定。第一個色彩是文字色彩;第二個是背景色彩。 set color_normal=black/black 以下的代碼設定被選取選項的色彩。第一個色彩是高亮度文字色彩;第二個是被選定行的背景色彩。若 /black 為第二個選項,則高亮度行將會是透明的,且只有文字色彩會改變。 set color_highlight=magenta/black

當作為第二個色彩時 /black 是 GRUB 2 的預設透明色。若使用開機影像時,只要改變第一個色彩(例如 xxxxx/black)。若第二個色彩更改為黑色以外的顏色,開機影像將會被藏在實色背景之後。 在下圖中,其 color_normal 設定為 white/black。高亮度色彩設定為 cyan/blue

在 GRUB 2 中可使用這些色彩。第二選項設為「black」則會被認定為「透明」(transparent)。 black blue brown cyan dark-gray green light-cyan light-blue light-green light-gray light-magenta light-red magenta red white yellow 若有做任何變動,存檔後更新 GRUB 2:sudo update-grub

測試字型和開機影像

與其重新開機來測試色彩組合,使用者可透過在開機過程使用 GRUB 2 命令列來檢閱改變。 依照上方說明來選擇開機影像和初始字型色彩,以 sudo update-grub 來更新 GRUB 2 的檔案後重新開機。 當 GRUB 2 開機影像/選單出現時,按下任何鍵以停止逾時倒數。 按 c 進入GRUB 2 命令列。 用各種不同的組合來實驗。輸入以下指令來進行變更: set color_normal=first-color/black 和/或 set color_highlight=first-color/second-color 在指令輸入後立即可以看到文字的色彩。您可以使用「向上」鍵來呼叫最後執行的指令然後編輯就能快速測試不同的色彩組合。 一旦您想結束,按下 ESC 鍵回到選單。 隨意重複上述步驟。 記下想使用的色彩組合,正常開機然後編輯 /etc/grub.d/05_debian_theme 並讓變更永久儲存。 存檔,更新 GRUB 2:sudo update-grub

變更解析度及開機影像

若使用者想在使用開機影像時變更 GRUB 2 螢幕解析度,依以下步驟: 1. 在 /etc/default/grub 中設定欲使用的解析度 變更 GRUB_GFXMODE= 之值(例如:GRUB_GFXMODE=800x600) 若無法確認 GRUB 2 可以使用何解析度,可以在 GRUB 2 命令列下輸入 vbeinfo 來顯示。命令列可以在當 GRUB 2 主選單顯示的時候按下「c」來存取。選擇一個同樣大小的影像並在 /etc/grub.d/05_debian_theme 中修改。 2. 選擇一個同樣大小的影像並在 /etc/grub.d/05_debian_theme 中修改。 影像名稱位置在以「for i in {/boot」為開頭的那一行裡 若沒有使用正確大小的影像,選單的位置將不會是正確的。 使用您選擇的影像編輯程式來建立/修改正確尺寸的影像。 使用者也許可以透過檔案瀏覽器的屬性來檢視影像的尺寸(在 Nautilus 中檢查屬性影像標籤)。 3. 以 root 權限執行 update-grub 將新增的設定加入 /boot/grub/grub.cfg

建立使用者開機影像

GRUB 2 的開機影像管理讓使用各式各樣的開機影像變得容易。

解析度設定

在 grub2-splashimages 套件中的開機影像主要為 640x480 的影像。

GRUB 2 會在 /etc/default/grub 中尋找解析度設定。若取消註解,則解析度由此行決定: GRUB_GFXMODE=640x480 若在 /etc/default/grub 中沒有找到解析度設定,GRUB 2 會使用設定在 /etc/grub.d/00_header 中 640x480 這個設定值。

影像建立和設定

在 Ubuntu 中,參考系統,偏好設定,顯示以取得可用的螢幕解析度,或是在 GRUB 2 命令列下執行 vbeinfo 來顯示可用的解析度。 1. 決定您想在 GRUB 2 開機影像中使用的解析度。 2. 建立或修改任何影像至合適的尺寸。 GRUB 2 目前支援 .png, .tga, 以及 8-bit .jpg/.jpeg 影像。 若使用 GIMP,將檔案以適合的副檔名命名可存檔為該格式。 3. 在 GRUB 2 設定檔中作合適的修改: /etc/default/grub:取消 GRUB_GFXMODE=640x480 行的註解,若解析度不是 640x480 則修正其值。 /etc/grub.d/05_debian_theme:在以下行中輸入正確的路徑及檔名。更多如何修改此行的資訊請參考前一小節。 for i in {/boot/grub,/usr/share/images/desktop-base}/moreblue-orbit-grub.{png,tga} ; do 4. 執行 sudo update-grub 將變更合併至 GRUB 2

佈景主題

GRUB 2 佈景主題還在開發中,與 gfxmenu 整合。佈景主題元素包含了色彩、字型、進度指示列、選單和標籤。這些都有遠大的承諾但尚未在 Ubuntu 9.10 發行時準備好。檢視此頁最底下的連結小節以找到參考資料。
Grub2.theme.dinxter.png Grub2.theme.bennett.png

重新安裝 GRUB 2

有時使用者可能需要移動或是重新安裝 GRUB 2。當使用者遇到空白螢幕上只有 GRUB 字樣,沒有提示符號,也沒有辦法輸入指令的時候,就需要重新安裝 GRUB 2。這通常發生在開機裝置的 MBR 區被修改的時候,例如在安裝 Ubuntu 之後才安裝 Windows。此外,若使用者完全無法開機進入作業系統,甚至無法使用救援模式,那麼也許必須要重新完整安裝 GRUB 2。

由 LiveCD 重新安裝

若您無法從 GRUB 2 開機,請參考開機問題及救援模式小節。若需要重新安裝,則依照這些程序進行。這裡有提出兩個方案;兩者皆需要從 LiveCD 開機(Ubuntu 9.10, Karmic Koala 或更新版本)。若第一個方案沒有作用,就進行第二方案,這會比較複雜且包含更多選項及指令。

最簡易方案 - 從 LiveCD 複製 GRUB 2 檔案

這是一個從故障的 GRUB 2 系統復原的快速及簡單方法。會使用終端機來輸入指令,而使用者必須知道被安裝之系統上的裝置名稱/分割區(sda1, sdb5 等等)。有問題的分割區將會從 LiveCD 來定位及掛載。相關檔案接下來會由 LiveCD 來複製到合適的地點及 MBR 中。跟之後的方法比起來,這樣需要最少的步驟和較少的指令輸入。 1. 開機進入 LiveCD 桌面(Ubuntu 9.10 或更新版)。 2. 從選單中選擇應用程式,附屬應用程式,終端機來啟動終端機。 3. 確認 Ubuntu 安裝之分割區。fdisk 的選項「-l」是一個小寫的「L」。

sudo fdisk -l

若使用者無法確定分割區,可以找一個擁有合適的大小或是格式的。 執行 sudo blkid 也許能提供更多的資訊來協助找到適合的分割區,特別是若分割區有名稱標記。裝置/磁碟是由 sdX 來指定,X 即為指定的裝置。sda 是第一個裝置,sdb 是第二個,依此類推。絕大多數的使用者之 MBR 會被安裝在 sda,系統中的第一個磁碟。分割區是由 Y 指定。第一個分割區是 1 ,第二個是 2。注意到裝置和分割區的計算法是不同的。 4. 掛載包含 Ubuntu 安裝的分割區。

sudo mount /dev/sdXY /mnt

範例:sudo mount /dev/sda1 注意:若使用者有單獨的 /boot 分割區,必須要掛載到 /mnt/boot 注意:若使用者有單獨的 /home 分割區,必須掛載到 /mnt/home。加密的 home 分割區應能正常作業。 5. 執行下面所列出的 grub-install 指令。這樣將會在掛載的分割區上的適當位置重新安裝 GRUB 2 檔案,以及指定裝置上的 MBR。

sudo grub-install --root-directory=/mnt/ /dev/sdX

範例:sudo grub-install --root-directory=/mnt/ /dev/sda 6. 重新啟動 7. 用 sudo update-grub 指令更新 GRUB 2 選單 8. 若使用者想知道為何系統會失敗,參考底下的回復後指令小節。

方案 2 - 從已安裝的分割區複製 GRUB 2 檔案

這是一個快速且簡單的方法來回復系統損壞的 GRUB 2 檔案。有問題的分割區將會從 LiveCD 來定位及掛載。相關檔案接下來會由受損系統的 /boot/grub 目錄複製到適當的位置以及 MBR 中。這樣需要較少的步驟及較少的指令輸入,跟之後的 CHROOT 方案比較起來。擁有分散系統分割區的使用者,例如單獨的 /boot 分割區,或其他特殊情況,使用 CHROOT 方案應該會有比較好的結果。 1. 開機進入 LiveCD 桌面(Ubuntu 9.10 或更新版)。 2. 掛載您 Ubuntu 安裝所在的分割區。

a. 從「位置」選單,點選您的 Ubuntu 安裝之分割區來掛載。Ubuntu 9.10 or later

grub2.places.devices.png

b. 若未辨識出分割區,找找看有合適的大小或名稱的。
c. 一旦掛載後,使用者應該會看到 Ubuntu 系統目錄例如 /boot。

3. 從選單中的「應用程式」,「附屬應用程式」,「終端機」來啟動終端機。 4. 執行如底下說明的 grub-setup -d 指令。這樣會重新安裝 GRUB 2 檔案到掛載分割區的適當位置以及指定裝置的 MBR 中。

a. 參考「位置」中的位置列來決定掛載點。將指令中的 XXXX 以 UUID 取代,若分割區並不是掛載在 /media 之下,則用正確的位置取代 /media/XXXX。選定的位置可能是一個 UUID,或是一個名稱標籤,若使用者有自行建立的話(參考注意事項)。
b. 若位置視窗的樣式和圖片裡的不一樣,按下左邊的鉛筆圖示來更改樣式。

the location window
(譯者注:這裡的圖片是舊版 Ubuntu 的樣式,在 10.04 以後請按 Ctrl-L 來更改。)

c. 以滑鼠選取 UUID/位置來複製內容。在終端機中按下滑鼠中鍵來貼上。若使用鍵盤的話,按 CTRL-C 來複製位置並使用 CTRL-SHIFT-V 來貼上至終端機中。
d. 裝置/磁碟是由 sdX 來指定,X 即是指定的裝置。sda 是第一個裝置,sdb 是第二個裝置,餘類推。大部分使用者的 MBR 應該都是安裝在 sda 中,即是系統中的第一個裝置。

sudo grub-setup -d /media/XXXX/boot/grub /dev/sda

範例:
sudo grub-setup -d /media/7848138a-41a0-4eba-8aed-d1b625ac8759/boot/grub /dev/sda
e. 若使用者收到一個「error: Cannot open /boot/grub/device.map」訊息,加上一個 -m 選項以及 device.map 的路徑至指令中,如下:

sudo grub-setup -d /media/XXXXX/boot/grub -m /media/XXXXX/boot/grub/device.map /dev/sda

範例: sudo grub-setup -d /media/7848138a-41a0-4eba-8aed-d1b625ac8759/boot/grub -m /media/7848138a-41a0-4eba-8aed-d1b625ac8759/boot/grub/device.map /dev/sda
f. 使用 grub-setup 尚有其他的選項可使用。在終端機中,輸入 grub-setup --help 即可列出一份所有選項的說明文件。
g. 也許您會重複收到「error: Cannot open /boot/grub/device.map」訊息。如果持續發生,試著重新開機。使用 UUID 方法實際上應該會有作用,但會不正確的丟出一個錯誤訊息。使用名稱標籤似乎不會發生這樣重複出現錯誤訊息的問題。
5. 重新開機
6. 使用 sudo update-grub 來更新 GRUB 2 選單
7. 若使用者想要查明為何系統開機失敗,參考以下的回復後指令小節。
Ubuntu 9.10 引進一個新的應用程式,能夠簡單的指定標籤給現存的分割區。從選單中的「系統」,「管理」中執行磁碟公用程式來使用。

方案 3 - CHROOT

此方案安裝會使用 chroot 指令來存取受損系統的檔案。
一旦執行了 chroot 指令,LiveCD 會將損壞系統的 / (根目錄)當作是目前自己所使用的。
在 chroot 環境中執行的指令會影響受損系統的檔案系統,而不是 LiveCD 的。
1. 開機進入 LiveCD 桌面(Ubuntu 9.10 或更新版)。注意此 LiveCD 必須要與您現在欲修復系統的版本相同 - 無論 32-bit 或是 64-bit(否則 chroot 會失敗)。
2. 開啟終端機 - 應用程式,附屬應用程式,終端機。
3. 確認您的標準系統分割區 - (選項是小寫的「L」)
sudo fdisk -l
若您不確定,執行
df -Th
找到正確的磁碟容量及 ext3 或 ext4 格式。
4. 掛載您的標準系統分割區
用正確的分割區替換:sda1, sdb5 等等。
sudo mount /dev/sdXX /mnt #範例:sudo mount /dev/sda1 /mnt
5. 若您有獨立的 /boot 分割區:
sdYY 是 /boot 分割區的位置(例如 sdb3)
sudo mount /dev/sdYY /mnt/boot
6. 掛載重要的虛擬檔案系統:
sudo mount --bind /dev /mnt/dev
sudo mount --bind /dev/pts /mnt/dev/pts
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys
7. Chroot 至您的標準系統裝置:
sudo chroot /mnt
8. 若系統中沒有 /boot/grub/grub.cfg 或其內容不正確,使用以下指令重建
update-grub
9. 重新安裝 GRUB 2:
以正確裝置替換 - sda, sdb, 等等。不要指定分割區號碼。
grub-install /dev/sdX
10. 驗證安裝(使用正確的裝置,例如 sda。不要指定分割區):
sudo grub-install --recheck /dev/sdX
11. 退出 chroot:按下鍵盤之 CTRL-D
12. 卸載虛擬檔案系統:
sudo umount /mnt/dev/pts
sudo umount /mnt/dev
sudo umount /mnt/proc
sudo umount /mnt/sys
若您有掛載獨立的 /boot 分割區:
sudo umount /mnt/boot
13. 卸載 LiveCD 的 /usr 目錄:
sudo umount /mnt/usr
14. 卸載最後的裝置:
sudo umount /mnt
15. 重新開機。 sudo reboot

復原後指令

一旦使用者可以開機至正常作業的系統,可試著查明為何系統之前開機失敗。以下指令也許對找到及/或修復問題有所幫助。 重新整理 /boot/grub/grub.cfg 中可用的裝置和設定 sudo update-grub 查詢開機載入程式位置。 grub-probe -t device /boot/grub 安裝 GRUB 2 至 sdX 分割區的 MBR 中(sda, sdb 等等。) sudo grub-install /dev/sdX 重新驗證安裝。(sda, sdb 等等。) sudo grub-install --recheck /dev/sdX

更改或移動 GRUB 2

更改 GRUB 2 安裝裝置或開機檔案的指令的方式是以 root 身份執行 grub-install。此指令允許使用者藉由設定根(ROOT)目錄、預載模組、執行特定設定檔案或其他方式來修改安裝。當執行時,grub-install 可能會執行一或多個其他指令,例如 grub-probe、grub-mkimage 和 grub-setup。這裡是當執行 grub-install 時一些需要考量的: 在一般情況下應該使用 grub-install 指令而不是 grub-setup。當需要的時候 grub-install 會呼叫 grub-setup。 此指令應指定一裝置,當執行時將會安裝 GRUB 需要的檔案至指定的裝置上。(例如:sudo grub-install /dev/sda) 若使用者試圖在執行此指令時指定一個分割區,(例如:sudo grub-install /dev/sda6)會發出一個警告訊息。指定一個分割區是不被建議採用的而被列在阻擋清單(blocklists)中,阻擋清單是開發者認為不可靠的部份。然而還是有複寫此建議的選項,若使用者依然想要如此做的話。 grub-install 可用選項清單可在終端機中執行 grub-install --help 來顯示。 grub-install 之線上說明文件(man page)目前尚不會顯示所有可用的選項。

移除 GRUB 2

回復至傳統 GRUB

若使用者選擇回復至傳統 GRUB(0.97),以下步驟將移除 GRUB 2 並安裝 GRUB。

命令列模式提供較清楚乾淨的移除和重新安裝。然而 Synaptic 也可以做到新增和移除套件,某些步驟依然要進入終端機來達成。 1. 開啟終端機:應用程式(Applications),附屬應用程式(Accessories),終端機(Terminal)。
2. 選用:備份 GRUB 2 目錄和檔案。
sudo cp /etc/default/grub /etc/default/grub.old sudo cp -R /etc/grub.d /etc/grub.d.old sudo cp -R /boot/grub /boot/grub.old 3. 移除 GRUB 2 sudo apt-get purge grub2 grub-pc
此時在其他開機載入程式安裝前,系統將無法開機。
當套件移除後,許多檔案依然會留在「/boot/grub」下 4. 安裝 GRUB 0.97 sudo apt-get install grub 5. 當 grub 安裝後,使用者依然需要執行以下兩個指令來建立 menu.lst 和 stage1/stage2 檔案。 sudo update-grub 產生 menu.lst 提示時選擇「Yes」。 sudo grub-install /dev/sdX 選擇正確的裝置(sda、sdb 等),一般而言就是 Ubuntu 安裝的那個裝置 在 /boot/grub 中建立 stage1/stage2 檔案並寫入至主開機磁區(MBR)。 6. 重開機。 若使用者在重新開機時收到一個「Unrecognized device string Error 11」錯誤訊息,參考解決 Unrecognized device string Error 11 小節,有關如何編輯選單和使系統可開機的指令。

常見問題與錯誤

外接磁碟安裝及「grub-pc」更新

Launchpad Bug 496435

安裝 Ubuntu 在外接磁碟上可能會導致問題產生,因為 grub-install 某些狀況下會使用裝置名稱(例如 sda, sdb)而不是 UUID。若在連接到其他機器的時候進行 grub-pc 更新,那麼可能會將更新寫入至錯誤的裝置並使得電腦無法開機。

有一個暫時解決方案在上面的錯誤回報連結中有提供。

外接磁碟安裝及 MBR 選擇

Launchpad Bug 414996

當安裝 Ubuntu 至 USB 磁碟中時,GRUB 2 有可能會寫入至硬碟的 MBR 中,或是分開至硬碟及 USB 磁碟中(而不是全部在 USB 磁碟中)。這樣可能會使得主要磁碟無法開機。

暫時解決方案:在安裝過程的最後一個步驟,有一個「進階(Advanced)」按鈕,可以允許使用者選擇安裝的位置。更多細節請參考錯誤回報。

開機分割區在於邏輯卷冊

開機分割區所在的邏輯卷冊(Logical Volume)位於包含一份系統快照(snapshot)的卷冊群組內(Volume Group)

Launchpad Bug 563895

當您的開機分割區(放置 /boot)是 LV,請確認不要有任何的 LVM 快照在包含的 VG 中。在重新啟動時會讓您的系統無法開機,進入「grub rescue>」環境中並顯示以下訊息:「error: no such disk.」 grub-rescue 介面在這裡無法幫助您,因為所有的模組(特別是 lvm)皆無法存取。您必須從其他安裝媒體中開機並手動移除與 boot 分割區在同一個 VG 裡所有的快照。 若您的伺服器在遠端資料中心,這個問題會超級麻煩,因為問題的原因無法簡單的查到,且修復系統可能會很困難。 雖然此問題會在即將到來的 Maverick Meerkat 10.10 版本中修復,然而目前的 Lucid Lynx LTS 10.04 卻是有受到影響的。 一個暫時解決方法是將 Ubuntu 的 /boot 安裝在一個分開的非 LVM 分割區中,如果您常常使用 LVM 的快照功能的話。 諷刺的是如果您是個細心的人,會在更新前(或是可能的重新啟動前)製作一份 LVM 快照,反而會引發這個 bug。

其他

由序列式主控台(Serial Console)開機

若您想要 GRUB 透過序列式連線作業,您需要去掉在 /etc/default/grub 檔案中 GRUB_TERMINAL 的註解,並設定為 serial(取代預設的 console)。預設的序列式主控台設定將會作業在第一個序列埠(ttyS0),以 9600 bit/s 傳輸速率及 8 data bits,1 stop bit,無同位元檢查。

若您想使用其他序列埠,或是您的主控台使用不同的設定,您必須加入一行 GRUB_SERIAL_COMMAND 來為 serial 指令指定額外的參數。GRUB 2 使用的 serial 指令與傳統 GRUB 對應的部份語法相同(文件在這裡)。例如,一個 4800 bit/s 序列連線使用 7 data bits,1 stop bit 和偶數校驗:

GRUB_SERIAL_COMMAND="serial --unit=0 --speed=4800 --word=7 --parity=even --stop=1"

連結

以下皆為英文參考文件連結。

外部連結