修复 UEFI 引导的 GRUB

问题与解决方法

环境

Manjaro Linux x86_64

Kernel: 6.2.10-1-MANJARO

使用 UEFI 引导

问题

在 GRUB 尝试引导 Linux 内核时,出现如下错误:

1
2
3
4
5
error: sparse file not allowed.

452: out of range pointer: xxxxxxxxxx

Aborted. Press any key to exit.

用户将无法进入系统。

解决方法

进入恢复系统

插入 Manjaro LiveCD, 启动 Live 系统。

确定磁盘分区

在 Live 系统中,使用 fdisk -l 查看磁盘分区情况,找到安装 Manjaro 的磁盘,假设为 /dev/sda

我的磁盘分区如下:

1
2
3
4
5
设备            起点       末尾      扇区   大小    类型
/dev/sda1 2048 821247 819200 400M EFI 系统
/dev/sda2 821248 723390463 722569216 344.5G Linux 文件系统
/dev/sda3 723390464 983437311 260046848 124G Linux 文件系统
/dev/sda4 983437312 1000214527 16777216 8G Linux 文件系统

可以确定,/dev/sda1 是 EFI 系统分区,/dev/sda2 是系统所在分区。

挂载分区

挂载系统分区:

1
mount /dev/sda2 /mnt

将当前系统的工具分区挂载到 /mnt 下:

1
2
3
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys

将 EFI 分区挂载到 /mnt/boot/efi 下:

1
mount /dev/sda1 /mnt/boot/efi

进入系统

1
chroot /mnt

重新安装 GRUB

1
grub-install --target=x86_64-efi --efi-directory=/boot/efi --removable

具体参数需要根据实际情况进行修改。

在这之后

重启,进入通过 GRUB 引导系统。

在系统中使用 sudo grub-install --recheck /dev/sda 命令再次安装 GRUB,确保系统能够正常启动。

一些思考

接下来的内容是我的整个修复流程,包含了如何在搜索引擎查找问题、根据文章内容调整目标等杂碎的内容,和我在修复过程中的一些感想。

为什么会出现这个问题

不是很清楚。

在启动 Manjaro 前我不小心打开了电脑里的 Windows 系统,但没有连接移动硬盘。

按照以往的经验,这最多只会导致找不到 GRUB 的位置,手动指定 GRUB 所在分区就可以启动系统。

但这次不大一样。

在打开 GRUB 之后,尝试引导内核,就发现了这个问题。

初步解决思路

立刻格式化磁盘,重新安装 Manjaro。

我已经不是曾经那个只会重装的我了,这次我希望可以解决问题,而不是简单地重装。

首先,我 Google 了这个错误,发现了几篇内容相关的文章。

报错与我一致的文章,但没有给出解决方案。

要我删除 GRUB 和 UEFI 所在分区所有内容的文章,有点可怕,不敢这么干。

提到应该重新安装 GRUB 的文章,这还有点道理。

于是,我的目标转变为重新安装 GRUB。

重新安装 GRUB

在之前遇到找不到 GRUB 分区的问题时,在手动引导然后进入系统后,我会执行 sudo grub-install --recheck /dev/sda 重新安装 GRUB,解决这个问题。

那这次的觉得方案应该是差不多的……吧?

不对啊,这次是在 LiveCD 的系统里操作,怎么能直接安装 GRUB 呢?

这个问题比较难描述。

我先是 Google grub-install 修复 GRUB,中文网站的内容都是关于在可以启动的系统下修复 GRUB 的,没有我需要的内容。

然后我开始求助于 ChatGPT,输入的 Prompts 是:

1
2
I am using Manjaro with GRUB.
When I booted into the system, it says "sparse file not allowed 452 out of range pointer". How to fix it?

不难发现,我并没有说明我使用的是 UEFI 引导,这直接影响到了 ChatGPT 回复的准确性。

ChatGPT 给出的修复步骤与上述的相差不大,只是在挂载系统分区和工具分区后,直接尝试执行 grub-install 命令,尝试修复。

grub-install 返回错误 this gpt partition label contains no bios boot partition 把我弄得更懵了。

再次 Google 这个问题,发现了 这篇在长篇大论讲 GRUB 的文章,虽然没有给出解决方案,但它让我意识到 UEFI 和 Legacy BIOS 两种启动方式的区别。

UEFI 和 Legacy BIOS

UEFI 和 Legacy BIOS 是两种启动方式,它们的区别在于,Legacy BIOS 是在 BIOS 中直接加载内核,而 UEFI 是在 BIOS 中加载 EFI 系统,然后由 EFI 系统加载内核。

使用 UEFI 引导的系统一般都有一个 200MB 到 400MB 的 EFI 系统分区,用于存放 EFI 系统。在上述的,我的硬盘分区中可以看到。

使用 findmnt 命令可以查看当前系统的挂载情况,其中 TARGET 列就是挂载点,SOURCE 列就是挂载的分区。

EFI 分区的挂载情况为:

1
2
TARGET      SOURCE      FSTYPE  OPTIONS
/boot/efi /dev/sda1 vfat rw,relatime,fm

可以看到,/boot/efi 里的内容正是 EFI 系统分区的内容。(我也是刚学到这个知识的)

解决 UEFI 相关问题

在修复过程中,我是通过 Google 发现上述的问题。

这篇文章 给了我莫大的帮助。

其中提到了 EFI 分区,也提到了如何正确安装 UEFI 引导的 GRUB:

1
2
sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi
sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --removable

在补充挂载 EFI 分区、切换 Root 目录后,执行第一条命令,发现有错误。尝试执行第二条命令,发现没有错误,代表 GRUB 已经重新安装成功。

此时我想起来,在之前安装 GRUB 时,会提示 正在为 x86_64-efi 平台进行安装,我才意识到前面的修复过程并没有去指定平台。

总结一下

总之,这就是我此次修复的心路历程。我没有研究过 UEFI 和 Legacy BIOS 的区别,也没有研究过 GRUB 的安装过程,所以在修复过程中,我是通过 Google 和 ChatGPT 的帮助才解决了这个问题。

希望这个探索过程能给你一些启发吧。


此文章以 我无所谓 By 不 By 什么 AI,对我有帮助的文章就是好文章 标识发布。


修复 UEFI 引导的 GRUB
https://blog.udon.eu.org/archives/8b68ddd6.html
作者
Kare Udon
发布于
2023年4月16日
许可协议