在Linux下创建EFI BIOS Grub加载分区

GRUB是什么

GRUB是一种多重引导加载器,它让用户可以选择引导安装在计算机上的多个操作系统之一,或者选择特定操作系统分区上可用的特定内核配置。

EFI是什么

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

准备工作

  • 确保你已经在BIOS里面使能了EFI
  • 确保你已经安装了需要的包,比如parted和gparted

为EFI调整分区的大小

现在的场景是,我们没有EFI分区,我们需要一个EFI分区才能让uEFI正常工作。下面是一个没有EFI分区的分区情况,因此我们需要创建它。

Number Start End Size File system Name Flags
1 1049kB 100GB 100GB ext2
3 101GB 5987GB 5887GB ext4
2 5998GB 6001GB 2999MB linux-swap(v1)

分区1是ext2格式,用来挂载/boot分区,分区3是/根分区,分区2是我们的交换分区,但是我们需要另一个分区来保存我们的uEFI。为了做到这一点,我们需要运行一个在CD/DVD或U盘上的实时ISO。分区如果被挂载了,就无法更改了。

没有EFI的分区
没有EFI的分区

为EFI创建一个分区

由于我们没有分区集了,所以需要调整主分区的大小来创建空间。我将从主分区中未使用的空间调整一个10GB分区大小给uEFI,因为我将大量使用uEFI分区。加载parted或Gparted并进行更改,更改可能需要一段时间,如果你使用的是加密文件系统,那么除非你从一些额外的未分配空间来创建,否则就不能成功。

注意:确保在所有已配置系统或高级用户的高级分区上始终预备一些未分配的可用空间。

调整结束后,分区就会像下图一样了。

有EFI的分区
有EFI的分区

分区更改完成后,重新启动系统。由于我们在最后创建了分区,因此驱动器没有变化,否则我们将需要更改分区的UUID等。

重新启动后,在终端中运行parted,将分区格式化成ext4格式,我们的分区是#4


mkfs.ext4 /dev/sde4

在终端上继续运行parted, 我们可以为EFI分区创建一个启动的标识。


parted /dev/sde4
Number Start End Size File system Name Flags
1 1049kB 100GB 100GB ext2
3 101GB 5987GB 5886GB ext4
4 5987GB 5998GB 10.7GB
2 5998GB 6001GB 2999MB linux-swap(v1)

在parted命令提示符下,我们希望将GPT分区表设置成bios_grub的flags,方法是在parted命令提示符下键入一下命令。


(parted) set 4 bios_grub on

现在,让我们看一下分区4的变化:

(parted) print
Model: ATA WDC WD6002FZWX-0 (scsi)
Disk /dev/sde: 6001GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
1 1049kB 100GB 100GB ext2
3 101GB 5987GB 5886GB ext4
4 5987GB 5998GB 10.7GB bios_grub
2 5998GB 6001GB 2999MB linux-swap(v1)

高亮成红色的文本就是变化。

从parted退出


(parted) quit

现在,我们可以在新创建的分区上安装Grub了。


grub-install /dev/sde

将会看到如下的输出:

Installing for i386-pc platform.
Installation finished. No error reported.

重新安装GRUB-EFI


apt install --reinstall grub-efi

如果你需要重新安装grub-efi,可以用上述的命令。

更新GRUB


update-grub

如果是grub2,那么运行下面的命令:


update-grub2