2016年3月15日 星期二

淺談Grub2

本文截自土芭樂技術工坊

檔案結構

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,grub.cfg 檔不該手動編輯。
  • 每個段落明確地由「(### BEGIN)」界定並參考在 /etc/grub.d 目錄中的檔案,由該目錄中的檔案來產生資訊。
  • grub.cfg 由 root 身份執行 update-grub 來更新。update-grub 指令是 sudo grub-mkconfig -o /boot/grub/grub.cfg 的簡化。為了標準化,使用 update-grub 指令,加上 sudo 以 root 權限執行。
  • 此檔案將會在核心安裝/更新時或是其他會影響到它的輸出時自動更新。
  • 預設情況下,還有無論何時當 update-grub 指令執行時,此檔案會被設定為「唯讀」。這是刻意保持的狀況,讓此檔案無法被手動編輯。
使用者也會在 /boot/grub 目錄下看到許多 *.mod 檔案。這些檔案代表 GRUB 2 的模組化本質並依照 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 裝置核心位置。此資訊將會取用來建立這些核心顯示在選單中的名稱。
    • 20_memtest86+ 搜尋 /boot/memtest86+.bin 並將之包含在 GRUB 2 開機選單選項中。目前沒有選項能將此條目從開機選單中移除。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 中以關閉這個命令稿。(參考下方)
    • 40_costom 用來加入自訂選單選項的樣板,將會在執行 update-grub 指令時嵌入至 grub.cfg 中。此檔案中的內容,在「exec tail -n +3 $0」這一行和預設的註解後,會毫無改變地直接匯入至 /etc/default/grub.cfg 中。
  • 在這些目錄中的檔案必須要設為可執行才能被 update-grub 使用。沒有設為可執行的檔案將會被忽略。欲將檔案設為可執行,執行
sudo chmod +x /etc/grub.d/folder/filename

設定 GRUB 2

設定變更通常會修改 /etc/default/grub 和 /etc/grub.d 目錄中的自訂檔案。/boot/grub/grub.cfg 檔不應由使用者直接編輯;此檔案由設定稿來變更。
某些最常見的變更,例如預設的作業系統/核心和選單逾時,可以經由一個圖形化使用者介面應用程式「StartUp-Manager」來修改。如何安裝及使用此應用程式的相關訊息請參考社群文件 StartUpManager

/etc/default/grub

  • 變更預設設定的主要設定檔。在安裝時,以下內容可由使用者變更:
  • GRUB_DEFAULT
    • 設定預設選單選項。選項可以是數字或是「saved」。
    • GRUB_DEFAULT=0 以選單位置來設定預設選單選項。如同 GRUB,在 grub.cfg 中的第一筆「選單選項」為 0,第二筆為 1,餘類推。
    • GRUB_DEFAULT=saved 設定預設選項為上一次選擇的項目。若開機過程中顯示選單,則上一次選擇的選項將會以高亮度表示。若沒有進行任何動作,此選項將會在逾時時間到達或是選單設為隱藏時用來開機。
      • grub-set-default 當參數設定為 saved 時將開啟。使用者可以使用此指令快速地改變預設作業系統/核心。
        • 格式為 sudo grub-set-default X,此處的 X 代表選單選項的位置(第一筆由 0 開始)或是確切的選項字串。例如:sudo grub-set-default 3 將使用選單選項位置,或是 sudo grub-set-default "Ubuntu, Linux 2.6.31-14-generic" 表示選單選項字串。
        • 欲取得現存的選單選項選擇數字(由 0 開始)或是選單選項「字串」,執行 grep menuentry /boot/grub/grub.cfg
      • GRUB_DEFAULT="xxxx" 一個確切的選單選項,包含引號,也可使用。在此例中,選單中的位置並不重要。例如:GRUB_DEFAULT="Ubuntu, Linux 2.6.31-14-generic"
      • 如何啟用「saved」選項及自訂選單的範例,請參考「自訂使用者選項」小節。
  • GRUB_HIDDEN_TIMEOUT=0
    • 此設定將影響選單顯示。若啟用開機影像,將會在任何逾時設定中顯示。
    • 選單將會被隱藏,除非在此行開頭加上一個 # 符號。(# GRUB_HIDDEN_TIMEOUT=0)。
    • GRUB 2 第一次執行時將會尋找其他作業系統。若沒有其他作業系統被偵測到,選單將會設定為隱藏。若辨認出其他作業系統,選單將會顯示。
    • 若是大於 0 的整數,系統將會依此設定的秒數暫停,但不會顯示選單。
    • 0 則選單不會顯示。將不會有延遲。
      • 使用者可以在開機時按住 SHIFT 鍵不放以強制顯示選單。
      • 開機過程中,系統將會檢查 SHIFT 鍵狀態。若無法辨識按鍵狀態,會有一個短時間的延遲讓使用者可透過按下 ESC 鍵來顯示選單。
  • GRUB_HIDDEN_TIMEOUT_QUIET=true
    • true 不顯示倒數。螢幕將會是空白的。
    • false 在 GRUB_HIDDEN_TIMEOUT 中設定的時間,空白螢幕上會有一個倒數計時器。
  • GRUB_TIMEOUT=10
    • 此指令將推遲 GRUB_HIDDEN_TIMEOUT 設定,除非 GRUB_HIDDEN_TIMEOUT 被註解掉(#)。若 GRUB_HIDDEN_TIMEOUT 啟用,則當選單顯示時,GRUB_TIMEOUT 將會只作業一次。
    • 設定此值為 -1 將會導致選單持續顯示,直到使用者下選擇。
    • GRUB 2 選單預設為隱藏,除非其他作業系統被系統偵測到。若沒有其他作業系統,此行將會被註解掉,除非使用者改變之。為了在每次開機時顯示選單,去掉此行的註解並使用 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」,若有需要的話,也可以輸入在此行。
    1. GRUB_TERMINAL=console
    • 移除註解來停用圖形化終端機(只限 grub-pc)
    1. GRUB_DISABLE_LINUX_UUID=true
    • 移除註解若您不想讓 GRUB 傳遞「root=UUID=xxx」參數給 Linux。
    1. GRUB_GFXMODE=640x480
    • 您可移除 # 符號來啟用此行。此選項會設定圖形化選單的解析度(選單文字大小)。它將提供使用者的顯示卡所支援的解析度(例如 640x480, 800x600, 1280x1024 等等)。此設定只套用於開機選單顯示,而不是完成開機後的作業系統解析度。
      • 小技巧:在 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_DISABLE_LINUX_RECOVERY=true
    • 加上或移除此行註解來防止「救援」模式核心選項顯示在選單中。若您只想要在其中一個核心有「救援」選項,在 /etc/grub/40_custom 中製作一個特殊選項。
  • 額外可包含的指令:
    • GRUB_DISABLE_OS_PROBER=true
      • 啟用/停用 os-prober 對其他分割區作業系統的檢查,包括 Windows, Linux, OSX 和 Hurd。