Linux中國

Linux GRUB2 配置簡介

自從上個月為我的文章《Linux 引導和啟動過程簡介》做研究開始,我對更深入了解 GRUB2 產生了興趣。這篇文章提供了配置 GRUB2 的簡要介紹。為了簡便起見,我大多數情況下會使用 GRUB 指代 GRUB2

GRUB

GRUB 來自 GRand Unified Bootloader 的縮寫。它的功能是在啟動時從 BIOS 接管掌控、載入自身、載入 Linux 內核到內存,然後再把執行權交給內核。一旦內核開始掌控,GRUB 就完成了它的任務,也就不再需要了。

GRUB 支持多種 Linux 內核,並允許用戶在啟動時通過菜單在其中選擇。我發現這是一種非常有用的工具,因為我有很多次遇到一個應用程序或者系統服務在特定內核版本下失敗的問題。有好幾次,引導到一個較舊的內核時就可以避免類似的問題。默認情況下,使用 yumdnf 進行更新時會保存三個內核 - 最新的以及兩個比較舊的。在被包管理器刪除之前所保留的內核數目可以在 /etc/dnf/dnf.conf/etc/yum.conf 文件中配置。我通常把 installonly_limit 的值修改為 9 以便保留 9 個內核。當我不得不恢復到低幾個版本的內核時這非常有用。

GRUB 菜單

GRUB 菜單的功能是當默認的內核不是想要的時,允許用戶從已經安裝的內核中選擇一個進行引導。通過上下箭頭鍵允許你選中想要的內核,敲擊回車鍵會使用選中的內核繼續引導進程。

GRUB 菜單也提供了超時機制,因此如果用戶沒有做任何選擇,GRUB 就會在沒有用戶干預的情況下使用默認內核繼續引導。敲擊鍵盤上除了回車鍵之外的任何鍵會停止終端上顯示的倒數計時器。立即敲擊回車鍵會使用默認內核或者選中的內核繼續引導進程。

GRUB 菜單提供了一個 「 救援 rescue 」 內核,用於故障排除或者由於某些原因導致的常規內核不能完成啟動過程。不幸的是,這個救援內核不會引導到救援模式。文章後面會更詳細介紹這方面的東西。

grub.cfg 文件

grub.cfg 文件是 GRUB 配置文件。它由 grub2-mkconfig 程序根據用戶的配置使用一組主配置文件以及 grub 默認文件而生成。/boot/grub2/grub.cfg 文件在 Linux 安裝時會初次生成,安裝新內核時又會重新生成。

grub.cfg 文件包括了類似 Bash 腳本的代碼以及一個按照安裝順序排序的已安裝內核列表。例如,如果你有 4 個已安裝內核,最新的內核索引是 0,前一個內核索引是 1,最舊的內核索引是 3。如果你能訪問 grub.cfg 文件,你應該去看看感受一下它看起來是什麼樣。grub.cfg 太大也就沒有包含在這篇文章中。

GRUB 配置文件

grub.cfg 的主要配置文件都在 /etc/grub.d 目錄。該目錄中的每個文件都包含了最終會整合到 grub.cfg 文件中的 GRUB 代碼。這些配置文件的命名模式以排序方式設計,這使得最終的 grub.cfg 文件可以按正確的順序整合而成。每個文件都有注釋表明該部分的開始和結束,這些注釋也是最終的 grub.cfg 文件的一部分,從而可以看出每個部分是由哪個文件生成。分隔注釋看起來像這樣:

### BEGIN /etc/grub.d/10_linux ###

### END /etc/grub.d/10_linux ###

不要修改這些文件,除非你是一個 GRUB 專家並明白更改會發生什麼。無論如何,修改 grub.cfg 文件時你也總應該保留一個原始文件的備份。 40_custom41_custom 這兩個特別的文件用於生成用戶對 GRUB 配置的修改。你仍然要注意對這些文件的更改的後果,並保存一份原始 grub.cfg 文件的備份。

你也可以把你自己的文件添加到 /etc/grub.d 目錄。這樣做的一個可能的原因是為非 Linux 操作系統添加菜單行。要注意遵循命名規則,確保配置文件中額外的菜單選項剛好在 10_linux 條目之前或之後。

GRUB 默認文件

老版本 GRUB 的配置非常簡單而明了,我只需要修改 /boot/grub/grub.conf 就可以了。對於新版本的 GRUB2,我雖然還可以通過更改 /boot/grub2/grub.cfg 來修改,但和老版本的 GRUB 相比,新版本相對更加複雜。另外,安裝一個新內核時 grub.cfg 可能會被重寫,因此任何修改都可能消失。當然,GNU.org 的 GRUB 手冊確實有過直接創建和修改 /boot/grub2/grub.cfg 的討論。

一旦你明白了如何做,更改 GRUB2 配置就會變得非常簡單。我為之前的文章研究 GRUB2 的時候才明白這個。秘方就在 /etc/default 目錄裡面,一個自然而然稱為 grub 的文件,它可以通過簡單的終端命令操作。/etc/default 目錄包括了一些類似 Google Chrome、 useradd、 和 grub 程序的配置文件。

/etc/default/grub 文件非常簡單。這個 grub 默認文件已經列出了一些有效的鍵值對。你可以簡單地更改現有鍵值或者添加其它文件中還沒有的鍵。下面的列表 1 顯示了一個沒有更改過的 /etc/default/grub 文件。

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' 
   /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rd.lvm.lv=fedora_fedora25vm/root 
   rd.lvm.lv=fedora_fedora25vm/swap 
   rd.lvm.lv=fedora_fedora25vm/usr rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

列表 1:Fedora 25 一個原始 grub 默認文件。

GRUB 手冊 5.1 章節包括了所有可以添加到該 grub 文件的鍵的信息。我只需要修改 grub 默認文件已經有的一些鍵值就夠了。讓我們看看這些鍵值以及一些在 grub 默認文件中沒有出現的每個鍵的意義。

  • GRUB_TIMEOUT 這個鍵的值決定了顯示 GRUB 選擇菜單的時間長度。GRUB 提供了同時保存多個安裝內核並在啟動時使用 GRUB 菜單在其中選擇的功能。這個鍵的默認值是 5 秒,但我通常修改為 10 秒使得有更多時間查看選項並作出選擇。
  • GRUB_DISTRIBUTOR 這個鍵定義了一個從 /etc/system-release 文件中提取發行版本的 sed 表達式。這個信息用於生成出現在 GRUB 菜單中的每個內核發布版的文本名稱,例如 「Fedora」 等。由於不同發行版之間 system-release 文件結構的差異,在你的系統中這個 sed 表達式可能有些不同。
  • GRUB_DEFAULT 決定默認引導哪個內核。如果是 saved,這代表最新內核。這裡的其它選項如果是數字則代表了 grub.cfg 中列表的索引。使用索引號 3,就會總是載入列表中的第四個內核,即使安裝了一個新內核之後也是。因此使用索引數字的話,在安裝一個新內核後會載入不同的內核。要確保引導特定內核版本的唯一方法是設置 GRUB_DEFAULT 的值為想要內核的名稱,例如 4.8.13-300.fc25.x86_64
  • GRUB_SAVEDEFAULT 通常,grub 默認文件中不會指定這個選項。當選擇不同內核進行引導時,正常操作下該內核只會啟動一次。默認內核不會改變。當其設置為 true 並和 GRUB_DEFAULT=saved 一起使用時,這個選項會保存一個不同內核作為默認值。當選擇不同內核進行引導時會發生這種情況。
  • GRUB_DISABLE_SUBMENU 一些人可能會希望為 GRUB 菜單創建一個內核的層級菜單結構。這個鍵和 grub.cfg 中一些額外內核配置允許創建這樣的層級結構。例如,主菜單中可能有 productiontest 子菜單,每個子菜單中包括了一些合適的內核。設置它為 false 可以啟用子菜單。
  • GRUB_TERMINAL_OUTPUT 一些環境下可能需要或者必要將輸出重定向到一個不同的顯示控制台或者終端。默認情況下是把輸出發送到默認終端,通常 console 等價於 Intel 系列個人電腦的標準輸出。另一個有用的選擇是在使用串列終端或者 Integrated Lights Out (ILO) 終端連接的數據中心或者實驗室環境中指定 serial
  • GRUB_TERMINAL_INPUTGRUB_TERMINAL_OUTPUT 類似,可能需要或者必要重定向輸入為串列終端或者 ILO 設備、而不是標準鍵盤輸入。
  • GRUB_CMDLINE_LINUX 這個鍵包括了在啟動時會傳遞給內核的命令行參數。注意這些參數會被添加到 grub.cfg 所有已安裝內核的內核行。這意味著所有已安裝的內核在啟動時都會有相同的參數。我通常刪除 rhgbquiet 參數以便我可以看到引導和啟動時內核和 systemd 輸出的所有內核信息消息。
  • GRUB_DISABLE_RECOVERY 當這個鍵的值被設置為 false,GRUB 菜單中就會為每個已安裝的內核創建一個恢復條目。當設置為 true 時就不會創建任何恢復條目。但不管這個設置怎樣,最後的內核條目總是一個 rescue 選項。不過在 rescue 選項中我遇到了一個問題,下面我會詳細介紹。

還有一些你可能覺得有用但我沒有在這裡介紹的鍵。它們的描述可以在 GRUB 手冊 2 的 5.1 章節找到。

生成 grub.cfg

完成所需的配置之後,就需要生成 /boot/grub2/grub.cfg 文件。這通過下面的命令完成。

grub2-mkconfig > /boot/grub2/grub.cfg

這個命令按照順序使用位於 /etc/grub.d 的配置文件構建 grub.cfg 文件,然後使用 grub 默認文件的內容修改輸出以便獲得最終所需的配置。grub2-mkconfig 命令會嘗試定位所有已安裝的內核並在 grub.cfg 文件的 10_Linux 部分新建條目。它還創建一個 rescue 條目提供一個用於從 Linux 不能啟動的嚴重問題中恢復的方法。

強烈建議你不要手動編輯 grub.cfg 文件,因為任何對該文件的直接修改都會在下一次安裝新內核或者手動運行 grub2-mkconfig 時被重寫。

問題

我遇到一個如果沒有意識到就可能導致嚴重後果的 GRUB2 問題。這個救援內核沒有啟動,反而啟動了另外一個內核。我發現那是列表中索引為 1 的內核,也就是列表中的第二個內核。額外的測試發現不管使用原始的還是我生成的 grub.cfg 配置文件都會發生這個問題。我在虛擬機和真實硬體上都嘗試過而且都發生了這個問題。我只測試了 Fedora 25,因此其它 Fedora 發行版本可能沒有這個問題。

注意,從救援內核生成的 「recovery」 內核條目不能引導到維護模式。

我推薦將 grub 默認文件中 GRUB_DISABLE_RECOVERY 的值更改為 「false」,然後生成你自己的 grub.cfg。這會在 GRUB 菜單中為每個已安裝的內核生成可用的恢復條目。這些恢復配置能像期望那樣工作,從而從那些需要輸入密碼登錄的內核條目中引導到運行級別 1,也就是進入(不需要密碼的)單用戶維護模式。你也可以按 Ctrl-D 繼續正常的引導進入默認運行級別。

總結

GRUB 是引導 Linux 計算機到可用狀態過程的一系列事件中,發生在 BIOS 之後的第一步。理解如何配置 GRUB 對於恢復或者處理多種類型的問題非常重要。

這麼多年來我多次不得不引導到恢復或者救援模式以便解決多種類型的問題。其中的一些問題確實是類似 /etc/fstab 或其它配置文件中不恰當條目導致的引導問題,也有一些是由於應用程序或者系統軟體和最新的內核不兼容的問題。硬體兼容性問題也可能妨礙特定的內核啟動。

我希望這些信息能對你開啟 GRUB 配置之旅有所幫助。

( 題圖 : Internet Archive Book Images. Opensource.com 修改。 CC BY-SA 4.0)

作者簡介:

David Both - David Both 是一個居住在 Raleigh,北卡羅來納州的 Linux 和開源倡導者。他在 IT 界已經有超過 40 年,並在他工作的 IBM 執教 OS/2 20 多年。在 IBM 的時候,他在 1981 年開設了第一個最初 IBM 個人電腦的培訓課程。他在紅帽教授過 RHCE 課程並在 MCI Worldcom、 Cisco、 和北卡羅來納州工作過。他已經在 Linux 和開源軟體方面工作將近 20 年。

via: https://opensource.com/article/17/3/introduction-grub2-configuration-linux

作者:David Both 譯者:ictlyh 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國