建立 grub.cfg

建立 grub.cfg
  • 如何從 GPT 分割區啟動?
  • 是不是像MBR方式一樣,需要一個有可啟動標誌的分區?
  • 如何在 Linux 下將 GPT 分割區標記為可啟動?

答案1

如何從 GPT 分割區啟動?

引導 Linux 安裝涉及多個階段和軟體元件,包括韌體初始化,執行引導程式,載入和啟動Linux核心圖像,以及各種執行啟動腳本守護程式。對於每個階段和組件都有不同的變化和方法;例如,GRUB,利洛,系統Linux或者負載林可以用作引導程序,而啟動腳本可以是傳統的在裡面-風格,或者係統配置可以透過現代替代方案來執行,例如系統或者暴發戶

另一個流行的啟動程序是酶標儀AUEFI 啟動管理器能夠發射EFISTUB內核。

電噴(可擴充韌體介面)系統分區或者ESP是資料儲存設備(通常是硬碟或固態硬碟)上的一個分區,由遵守以下協議的電腦使用統一的可擴展固件接口(UEFI)。當計算機處於啟動、UEFI 韌體載入儲存在 ESP 上的檔案以啟動已安裝的作業系統和各種實用程式。

ESP 包含引導程式或者核心鏡像對於所有已安裝的作業系統

是不是像MBR方式一樣,需要一個有可啟動標誌的分區?

啟動標誌來自遠古時代,您可以在其中指出膜生物反應器分割區記錄為可引導,因此您可以指示引導程式所在的位置。因此,要回答您的問題,您不必將啟動分割區標記為可啟動。

全域唯一識別符GUID) 為了電噴系統分區在GUID分區表GPT)方案是C12A7328-F81F-11D2-BA4B-00A0C93EC93B,而其 ID 在主引導記錄膜生物反應器) 分區表方案是0xEF

如何在 Linux 下將 GPT 分割區標記為可啟動?

  • g磁碟,將類型代碼設定為 EF00。 (gdisk 使用兩位元組類型代碼,擴展為磁碟上的實際類型代碼;“EF00”只是“的助記符”C12A7328-F81F-11D2-BA4B-00A0C93EC93B」。)
  • 格帕特或分手時,您設定「啟動標誌」。但請注意,這僅適用於 GPT 磁碟;您無法使用這些程式在 MBR 磁碟上設定 ESP 類型代碼。 (這通常不是什麼大問題,因為基於 EFI 的電腦通常從 GPT 磁碟啟動。)
  • 在最新版本的 Linux 中磁碟機,您可以透過分割區編號(GPT 磁碟上的「EFI 系統」為 1,MBR 磁碟上的 0xEF)或輸入 GPT 磁碟上的完整類型代碼來設定分割區類型。

答案2

是不是像MBR方式一樣,需要一個有可啟動標誌的分區?

嗯,在我們繼續簡要回顧 BIOS 如何移交引導執行之前。

  1. Bios 讀取啟動媒體的第一個磁區(512 位元組)。
  2. 如果該磁區的最後兩個位元組是 55 AA,則執行該磁區。那麼bios的職責到此結束。

截取的 440 位元組代碼被命名為 MBR(主開機記錄),其目的是在 4 個分割區表條目中尋找可開機標誌。如果它對於標記為可引導的某個分割區,它將載入其第一個磁區並將引導執行流程切換到該磁區中的程式碼。

請注意,出於相容性原因,使用 GPT 時甚至存在所謂的保護性 MBR。 (GPT 從第二扇區開始)

因此,MBR 程式碼關心「可啟動標誌」。然而,截取的 440 位元組 MBR 程式碼可以更改或不同。當確實安裝 GRUB 時就是這種情況。例如,像這樣安裝 GRUB2:

sudo grub-install --boot-directory=/mnt/boot --force --target=i386-pc /dev/sdb   -v 

將用它自己的代碼完全替換標準 MBR 代碼。 (請注意,可以在 /boot/grub/i386-pc/boot.img 找到該程式碼的副本)

結論: -> Grub 代碼不會關心任何可引導標誌。

在非 EFI GPT 設備上安裝 grub

我所說的「非 EFI」是指我們有一台舊設備,其 Bios 沒有 UEFI,或者 UEFI 在 CSM(相容性支援模組)模式下運行並以我上面描述的傳統方式啟動。

當 Grub 透過「封鎖清單」安裝時,它會將自身安裝在 MBR 和第一個引導磁區之間的分割區間隙中。然而,當我們使用 GPT 時,Grub 拒絕採用這種分區間隙方式。相反,它希望創建一個小分區,以便可以安全地將其程式碼安裝到其中。

這就是我們如何設置它格帕特:

  1. 建立一個1MB的格式化分割區
  2. 將該分割區標記為「bios-grub」 當您在 gparted 中啟用「bios-grub」複選框時,它會將 GPT 類型變更為「BIOS 引導分割區」。

或者,您可以使用: gdisk -l /dev/sdb檢查並...

sgdisk -t 3:ef02 /dev/sdb ^- 將第三個分割區標記為 ef02 => 'BIOS 開機分割區'

……在沒有 gparted 的情況下完成同樣的任務。注意:「ef02」是「BIOS 開機分割區」或 GUID 的縮寫21686148-6449-6E6F-744E-656564454649

好吧,就是這樣。現在我們可以運行 Grub 安裝程式了。

將 ya Linux (或 /boot/grub 分割區)掛載到 /mnt/boot 並執行

  1. sudo grub-install --boot-directory=/mnt/boot --force --target=i386-pc /dev/sdb   -v 
    

如果你幸運並且一切順利,你會看到:

grub-install: Info: setting the root device to `hostdisk//dev/sda,gpt6'.
grub-install: Info: saving <556324864,0,512>.
...

因此,需要將內容/boot/grub/i386-pc/core.img直接複製到 1 MB 的「BIOS 開機分割區」中, 否則 grub 會拒絕透過封鎖清單進行安裝。--force如果失敗,這裡有一個嘗試再次從安裝的封鎖清單部分啟動的捷徑:

grub-bios-setup --verbose --force --directory= /mnt/boot/grub/i386-pc  /dev/sdb

簡而言之grub-BIOS 設定會複製

/mnt/boot/grub/i386-pc/boot.img -> Sector 0 (MBR)
/mnt/boot/grub/i386-pc/core.img -> Sector 556324864 (BIOS boot partition)

然而,最重要的部分 core.img 的「編譯」並不是由它執行的。

我用虛擬盒測試啟動流程:

sudo chmod 666 /dev/sd*
VBoxManage  internalcommands createrawvmdk -filename ~/sdb.vmdk -rawdisk /dev/sdb

該命令對於將整個實體設備放入虛擬機器特別有用。

<右 ctrl> + R 重新啟動虛擬機

grub 救援的「樂趣」>

只是短暫的匆忙,因為您可能會在途中遇到它。好的目標是讓這兩個指令正確執行:

> insmod normal
> normal

set對於查看設定的內容很有用。 ls顯示有​​哪些分割區 ls (hd0,2)顯示分割區 #1 上有哪些檔案 如果找到 (hd0,2) 上的 grub 資料夾, set prefix=(hd0,2)/boot/grub則指令可以讓您退出。現在insmod normalnormal您將進入「正常」grub 選單。一旦你運行了normal.mod,就只有一件很酷的事情值得一提:

ls (hd0,<tab>

將為您提供有關分區的更多詳細信息,它們的名稱是什麼以及使用的文件系統。

不過回到主題。

如何用 grub.cfg 標記分割區?

這是在安裝 grub 時間接發生的。之後它就被修復並且幾乎不可能改變。感謝一些愚蠢的設計決策。好吧,讓我們更仔細地研究一下 grub 中設計不良的部分。

這個core.img的關鍵。在 grub 設定過程中,直接寫入我們為此目的創建的 1 MB 分區,它包含一個可能看起來或多或少像這樣的腳本

set prefix=(hd0,2)/boot/grub
insmod normal
normal

這個腳本和存取帶有 grub 檔案的分區所需的所有檔案系統驅動程式將被黏合在一起並壓縮(!!!)到 core.img 中。由於壓縮,您無法使用磁碟編輯器來查看它或更改一些小事情,例如將(hd0,2) 更改為(hd0,4) 或類似的事情,您可能需要使用gdisk 對GPT 分割區進行排序或執行一些操作其他變化。也沒有辦法停用壓縮(或有開關,但它不起作用)而且該腳本是自動生成的,您無法更改它以使其更聰明。對於前。使用 search.label 來尋找所需的 Grub 分區,而不是固定分區號碼。您所能做的部分就是重新運行 grub 設定並希望它能夠正常啟動。

注意:奇怪的是,使用 EFI 時,事情變得更加開放和友好,可以快速定制。

不幸的是,我仍在研究「grub-install」的工作原理。目前我正在搞亂一些奇怪的事情,例如它搞亂了sda雖然我明確指定它應該使用深圳發展銀行

如果我了解更多,我可能會稍後編輯這篇文章。編輯:好的,我們開始吧。以下是如何做到「不可能」的事:

nano /mnt/boot/grub/i386-pc/load.cfg

自從

search.fs_uuid 39ff90d3-00b1-4cb9-8b94-03a7a9053352 root hd0,gpt6 
set prefix=($root)'/mnt/boot/grub'

是垃圾,不是我需要的。我將其更改為:

search.fs_label boot root hd0,gpt5 
set prefix=($root)/grub

哇,看起來好多了。 :) ...現在生成'core.img'...:

grub-mkimage -O i386-pc -o /mnt/boot/grub/i386-pc/core.img  -C none \
    --prefix /grub -c /mnt/boot/grub/i386-pc/load.cfg  \
    ext2 ntfs part_gpt biosdisk search_label normal

注意:除了 ntfs 之外,我還添加了“正常”模組,以便在救援控制台上更加舒適。現在,可以使用選項卡來完成命令,也可以將遊標向上向下捲動命令歷史記錄。 而且正如之前提到的,目前還--Compression none沒有效果。 Core.img 一律使用 xz 壓縮。

...並將其寫入磁碟:

grub-bios-setup -v -f -d /mnt/boot/grub/i386-pc  /dev/sdb

那麼從哪個分區啟動取決於 grub.cfg 中寫入的內容,當然還有使用者選擇啟動的內容。

建立 grub.cfg

將 Linux 系統掛載到 /mnt/MINT 然後執行:

grub-mkconfig -o /mnt/MINT/boot/grub/grub.cfg

新增 UEFI 支援

準備工作:使用Gparted 新增1 MB FAT32 分割區。並將類型設為 'ef00 EFI 系統分割區' 我使用 sgdisk -t 11:ef00 /dev/sdb ^- 將第 11 個分割區標記為 ef00 => 'EFI 系統分割區'

gdisk -l /dev/sdb檢查結果。然而大多數時候已經存在一些「EFI 系統分割區」。因此,在這種情況下,只需使用,而不是創建一個額外的。

「EFI 系統分割區」將儲存稍後由 EFI BIOS 載入並執行的 grubx64.efi。請注意,EFI-Bios 預設情況下知道如何讀取 GPT 以及 FAT32。 現在安裝

/mnt/boot -> Linux System containing grub.cfg
/mnt/UEFI -> The 'EFI system partition'

現在運行 grub-install:

sudo grub-install --boot-directory=/mnt/boot \
        --efi-directory=/mnt/UEFI  --target=x86_64-efi   /dev/sdb   -v 

沒有太大改變。好吧 --force 不再需要了,還有另一個 --target 並且需要一個額外的參數 --efi-directory

相關內容