创建 grub.cfg

创建 grub.cfg
  • 如何从 GPT 分区启动?
  • 它是否像 MBR 方式一样需要一个具有可启动标志的分区?
  • 如何在 Linux 下将 GPT 分区标记为可启动?

答案1

如何从 GPT 分区启动?

启动 Linux 安装涉及多个阶段和软件组件,包括固件初始化,执行引导加载程序,加载和启动Linux 内核图像和执行各种启动脚本守护进程. 对于每个阶段和组成部分,都有不同的变化和方法;例如,GRUB莉萝系统Linux或者洛德林可以用作引导加载程序,而启动脚本可以是传统的在里面风格,或者可以通过现代替代方案执行系统配置,例如systemd或者暴发户

另一个流行的启动程序是重新索引AUEFI 启动管理器能够发射EFISTUB内核。

电喷(可扩展固件接口)系统分区或者ESP是数据存储设备(通常是硬盘驱动器或固态驱动器)上的一个分区,供遵守统一可扩展固件接口(UEFI)。当计算机已启动,UEFI 固件加载存储在 ESP 上的文件以启动已安装的操作系统和各种实用程序。

ESP 包含引导加载程序或者内核映像适用于所有已安装的操作系统

它是否像 MBR 方式一样需要一个具有可启动标志的分区?

引导标志来自古代,在那里你会表示膜生物反应器分区记录为可引导,因此您可以指示引导加载程序驻留的位置。因此,回答您的问题,您不必将引导分区标记为可引导。

全局唯一标识符全局唯一标识符) 为了电喷系统分区中的GUID 分区表谷氨酰胺磷酸酶)方案是C12A7328-F81F-11D2-BA4B-00A0C93EC93B,而其 ID 在主引导记录膜生物反应器)分区表方案是0xEF

如何在 Linux 下将 GPT 分区标记为可启动?

  • 磁盘分区,则将类型代码设置为 EF00。(gdisk 使用两字节类型代码,这些代码会扩展到磁盘上的实际类型代码;“EF00”只是“C12A7328-F81F-11D2-BA4B-00A0C93EC93B“。”)
  • 分区或 parted,您设置了“启动标志”。但请注意,这仅适用于 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 设置了。

将 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 启动分区”中, --force否则 grub 会拒绝通过阻止列表进行安装。如果失败,这里有一个快捷方式,可以再次尝试从阻止列表部分开始安装:

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 救援功能“获得乐趣”>

只是短暂的匆忙,因为您可能会在途中遇到它。好的目标是让这 2 个命令无错误地执行:

> 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”的工作原理。目前,我正在研究一些奇怪的事情,比如它星展银行虽然我明确指定它应该使用安全数据库

如果我了解更多信息,我可能会稍后编辑这篇文章。编辑:好的,我们开始吧。以下是如何做到“不可能”的事情:

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 之外,我还添加了模块“normal”,以便在救援控制台上更加舒适。现在可以使用 Tab 来完成命令,也可以使用光标上下滚动命令历史记录。 并且如前所述,目前--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 系统分区”将存储 grubx64.efi,该文件稍后将由 EFI bios 加载和运行。请注意,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

相关内容