详解使用grub2基于GPT分区格式创建符合Legacy BIOS的系统启动盘

从技术发展的角度而言,之前MBR+Legacy BIOS的启动方式将逐步被GPT+UEFI的启动方式所取代。但是我们在实际上安装系统的时候其实存在三种情况:

  • MBR + Legacy BIOS

  • GPT + Legacy BIOS

  • GPT + UEFI BIOS

MBR(主引导记录)和GPT(GUID分区表)是计算机存储设备上用于管理磁盘分区和引导操作系统的两种不同标准。我们入行的时候,其实普遍接触的都是MBR,但是MBR最大2.2TB的容量支持,是个硬伤。但是我们真正在服务器、虚拟机系统安装的时候,目前普遍采取的是系统盘与数据盘分离的策略,因此从实际的角度而言,系统盘是MBR还是GPT倒也没那么较真。很多人用MBR和legacy bios搭配也用的挺好,实际上面,他们也没想那么多,能装起来就可以了。

本文反而介绍一种奇怪的组合,GPT + legacy bios的搭配,至于为什么?主要就是验证一下,怎么玩的。

在使用GPT分区方案时,如果我们计划在Legacy BIOS系统上引导操作系统,需要创建一个名为"BIOS Boot Partition"(BIOS引导分区)或"BIOS Boot"分区,接下去将介绍具体的过程。

本文将在VMware上的centos7的虚拟机下,单独创建一块独立的sdb硬盘,然后使用grub2进行bootloader的制作,并在根目录创建linux基本结构,拷贝bash的程序及其依赖,最终验证是否能够正常完成系统的启动:

首先是分区操作,使用parted

parted /dev/sdb
mklabel gpt
# 建立"BIOS Boot Partition"引导分区,作用类似于之前的MBR前446字节。
mkpart primary 1MiB 3MiB
set 1 bios grub on
# 建立/boot分区
mkpart xfs   3MiB 300MiB
# 建立swap分区
mkpart swap    300MiB  2.3G
# 建立/分区
mkpart   xfs   2.3G 100%
# 查看分区的情况
print
q

进行剩余的操作

# 进行分区的格式化
mkfs.xfs  /dev/sdb2
mkfs.xfs  /dev/sdb4
mkswap  /dev/sdb3
# 对于目录进行临时挂载
mkdir /mnt/boot
mount /dev/sdb2 /mnt/boot
# 使用grub2进行bootloader的安装
grub2-install --root-directory=/mnt /dev/sdb  #告诉grub根的位置,他会把现有boot分区作为/boot分区,在里面生成对应的grub2文件夹。

# 往boot分区拷贝内核、initramfs文件。拷贝现有的grub.cfg文件,等待修改。
cp /boot/vmlinuz-3.10.0-1160.el7.x86_64  /mnt/boot/
cp /boot/initramfs-3.10.0-1160.el7.x86_64.img   /mnt/boot/
cp /boot/grub2/grub.cfg  /mnt/boot/grub2/

# 挂载根目录
mkdir /mnt/sysroot
mount /dev/sdb4  /mnt/sysroot/
cd /mnt/sysroot/
# 进行linux基础目录的创建
mkdir -pv etc bin sbin lib lib64 dev proc sys tmp var usr home root mnt media
# 拷贝bash程序机器依赖的库文件
cp /bin/bash  /mnt/sysroot/bin/
ldd /bin/bash
cp /lib64/libtinfo.so.5 /mnt/sysroot/lib64/
cp /lib64/libdl.so.2  /mnt/sysroot/lib64/
cp /lib64/libc.so.6   /mnt/sysroot/lib64/
cp /lib64/ld-linux-x86-64.so.2  /mnt/sysroot/lib64/
切换根进行一下验证
chroot /mnt/sysroot/

grub.cfg文件是bootloader的配置文件,原始拷贝过来的配置一般而言会比较复杂,因为系统实际的根目录可能会采用LVM等更高级的磁盘分区格式。我们此次验证时使用的是xfs基本分区格式,因此,改完之后配置文件中重点的部分反而比较简单。核心部分仅此而已

menuentry 'CentOS Linux 7' {
        linux /vmlinuz-3.10.0-1160.el7.x86_64 root=/dev/sda4 ro selinux=0  init=/bin/bash
        initrd /initramfs-3.10.0-1160.el7.x86_64.img
}

总结而言:

当使用GPT分区方案、Legacy BIOS系统以及Grub2引导加载程序时,启动系统的流程如下:

  1. 创建 GPT 分区:在硬盘上使用 GPT 分区方案来分配磁盘空间并创建所需的分区。确保在 GPT 分区中创建一个名为 "BIOS Boot Partition"(BIOS 引导分区),这是一个小分区,通常大小为 1 MB,用于存储引导加载程序。

  2. 安装 Grub2:将 Grub2 引导加载程序安装到 BIOS 引导分区中。通常,这可以通过在操作系统安装过程中选择手动分区并将 Grub2 安装到 BIOS 引导分区来完成。 Grub2 是一个功能强大的引导加载程序,它能够加载操作系统并提供引导菜单,允许您选择要启动的操作系统或内核。

  3. BIOS 配置:进入计算机的 BIOS 设置界面,并确保配置引导顺序,将硬盘作为第一个引导设备,以便 BIOS 可以从硬盘引导。您还需要确保启用 Legacy BIOS 模式,以支持 GPT 分区和 BIOS 引导方式。

  4. Grub2 配置:在 Grub2 配置文件中,通常是 /boot/grub2/grub.cfg,配置引导菜单,包括各个操作系统或内核的引导选项。这个配置文件将告诉 Grub2 如何引导操作系统。

  5. 启动过程:当您启动计算机时,BIOS 将加载 BIOS 引导分区中的 Grub2 引导加载程序。 Grub2 然后读取其配置文件,显示引导菜单,您可以选择要启动的操作系统或内核。

  6. 操作系统引导:一旦您选择了要启动的操作系统,Grub2 将加载该操作系统的内核和初始化 ramdisk,并引导操作系统。操作系统将继续启动过程。

最终可以启动的完整的grub.cfg的配置

#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub2-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#

### BEGIN /etc/grub.d/00_header ###
set pager=1

if [ -s $prefix/grubenv ]; then
  load_env
fi
if [ "${next_entry}" ] ; then
   set default="${next_entry}"
   set next_entry=
   save_env next_entry
   set boot_once=true
else
   set default="${saved_entry}"
fi

if [ x"${feature_menuentry_id}" = xy ]; then
  menuentry_id_option="--id"
else
  menuentry_id_option=""
fi

export menuentry_id_option

if [ "${prev_saved_entry}" ]; then
  set saved_entry="${prev_saved_entry}"
  save_env saved_entry
  set prev_saved_entry=
  save_env prev_saved_entry
  set boot_once=true
fi

function savedefault {
  if [ -z "${boot_once}" ]; then
    saved_entry="${chosen}"
    save_env saved_entry
  fi
}

function load_video {
  if [ x$feature_all_video_module = xy ]; then
    insmod all_video
  else
    insmod efi_gop
    insmod efi_uga
    insmod ieee1275_fb
    insmod vbe
    insmod vga
    insmod video_bochs
    insmod video_cirrus
  fi
}

terminal_output console
if [ x$feature_timeout_style = xy ] ; then
  set timeout_style=menu
  set timeout=5
# Fallback normal timeout code in case the timeout_style feature is
# unavailable.
else
  set timeout=5
fi
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/00_tuned ###
set tuned_params=""
set tuned_initrd=""
### END /etc/grub.d/00_tuned ###

### BEGIN /etc/grub.d/01_users ###
if [ -f ${prefix}/user.cfg ]; then
  source ${prefix}/user.cfg
  if [ -n "${GRUB2_PASSWORD}" ]; then
    set superusers="root"
    export superusers
    password_pbkdf2 root ${GRUB2_PASSWORD}
  fi
fi
### END /etc/grub.d/01_users ###

### BEGIN /etc/grub.d/10_linux ###
menuentry 'CentOS Linux 7' {
	linux /vmlinuz-3.10.0-1160.el7.x86_64 root=/dev/sda4 ro selinux=0  init=/bin/bash
	initrd /initramfs-3.10.0-1160.el7.x86_64.img
}

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

### BEGIN /etc/grub.d/20_linux_xen ###
### END /etc/grub.d/20_linux_xen ###

### BEGIN /etc/grub.d/20_ppc_terminfo ###
### END /etc/grub.d/20_ppc_terminfo ###

### BEGIN /etc/grub.d/30_os-prober ###
### END /etc/grub.d/30_os-prober ###

### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###

### BEGIN /etc/grub.d/41_custom ###
if [ -f  ${config_directory}/custom.cfg ]; then
  source ${config_directory}/custom.cfg
elif [ -z "${config_directory}" -a -f  $prefix/custom.cfg ]; then
  source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###

"Legacy BIOS"和"UEFI BIOS"都是计算机引导系统的概念,用于启动计算机并加载操作系统。它们在不同的时期被广泛使用,具有不同的特点和工作原理。

Legacy BIOS(基于传统的基本输入/输出系统):

  • Legacy BIOS是早期计算机系统中使用的引导标准。

  • 它采用基于16位的实模式,限制了系统的性能和功能。

  • 通常,Legacy BIOS在启动过程中使用MBR(主引导记录)来引导操作系统。

  • 它有许多限制,包括磁盘容量限制、慢启动速度和不支持一些新硬件特性。
    但是,要在Legacy BIOS上引导使用GPT分区方案的硬盘上的操作系统,通常需要使用一种称为"Legacy boot"或"Compatibility Support Module (CSM)"的功能,这样Legacy BIOS可以模拟UEFI BIOS的行为,以支持GPT分区方案。

UEFI BIOS(统一扩展固件接口):

  • UEFI是一种现代的引导标准,取代了Legacy BIOS。

  • UEFI使用32位或64位的保护模式,提供更大的性能和功能。

  • 它支持GPT(GUID分区表)磁盘分区方案,可以处理大容量硬盘驱动器。

  • UEFI还支持图形用户界面(GUI),使用户更容易进行设置和配置。

  • UEFI引导加载器可以识别和启动UEFI兼容的操作系统,如Windows 8及以后的版本,以及许多现代Linux发行版。

总之,UEFI BIOS是一种更现代、更功能丰富的引导系统,提供更好的性能、兼容性和功能,尤其对于支持大容量硬盘驱动器和安全性的要求更高的计算机来说,它是一种更好的选择。然而,一些较老的计算机仍然使用Legacy BIOS,因此要根据计算机硬件来选择合适的引导模式。UEFI BIOS逐渐取代Legacy BIOS成为主流,但一些旧计算机仍然使用Legacy BIOS。

MBR(主引导记录)和GPT(GUID分区表)都是用于管理硬盘驱动器上的分区和引导操作系统的不同分区方案。

MBR(主引导记录):

  • MBR是一种较早的分区方案,用于管理硬盘驱动器上的分区。

  • MBR分区表位于硬盘的第一个扇区(扇区0),通常包含一个主引导记录(Master Boot Record)。

  • MBR分区方案支持最多四个主分区,或者三主分区和一个扩展分区。扩展分区可以包含多个逻辑分区。

  • MBR分区方案使用32位的分区标识符(Partition Table Entry),因此支持的最大硬盘容量通常限制在2TB以下。

GPT(GUID分区表):

  • GPT是一种现代的分区方案,用于管理硬盘驱动器上的分区。

  • GPT使用GUID(全局唯一标识符)来标识分区,因此支持非常大的硬盘容量,远超2TB。

  • GPT允许创建最多128个分区,且没有主分区和扩展分区的限制,所有分区都是相对独立的。

  • GPT分区方案提供更好的数据完整性和容错性,包括备份分区表,以防主分区表损坏。

总结:
MBR和GPT是不同的硬盘分区方案,其中GPT是更现代、更灵活的方案,适用于大容量硬盘驱动器和现代计算机系统。在选择分区方案时,需要考虑硬盘容量、操作系统兼容性和其他需求。UEFI BIOS通常更自然地支持GPT,而Legacy BIOS通常与MBR结合使用,但可以使用Legacy boot或CSM来支持GPT。

https://watermelonwater.tech/%e4%bd%bf%e7%94%a8grub%e5%88%b6%e4%bd%9cgpt%e5%88%86%e5%8c%ba%e6%a0%bc%e5%bc%8f%e7%9a%84%e5%9f%ba%e4%ba%8euefi%e5%90%af%e5%8a%a8%e5%bc%95%e5%af%bc%e7%9a%84%e7%b3%bb%e7%bb%9f%e7%9b%98/