- 如何从 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 如何移交启动执行。
- Bios 读取引导介质的第一个扇区(512 字节)。
- 如果扇区的最后两个字节是 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 拒绝采用这种分区间隙方式。相反,它希望创建一个可以安全地安装其代码的小分区。
因此,这就是我们使用的设置方法分区:
- 创建一个 1MB 的格式化分区
- 将该分区标记为“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 并运行
-
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 normal
将normal
带您进入“正常” 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