首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复grub引导错误:“找不到符号'grub_calloc‘

如何修复grub引导错误:“找不到符号'grub_calloc‘
EN

Ask Ubuntu用户
提问于 2020-07-29 23:15:51
回答 10查看 119.4K关注 0票数 54

刚刚在20.04 (Xubuntu)上运行了最新一批更新,现在我收到了一个GRUB错误:

代码语言:javascript
复制
symbol 'grub_calloc' not found

我被扔进了“grub救援”外壳,但不知道在那里做什么可能有用。对我来说,“符号找不到”意味着grub包存在某种构建错误,但我不知道grub是如何工作的。我注意到这个更新还包括‘固件’,不确定这是否相关。我最好的选择是从一张活生生的CD启动,看看我是否可以以某种方式将更新回grub?

编辑后添加:

好吧,多亏了很多人!我想我现在明白了。

  1. 在“非UEFI”系统上,grub安装在两个独立的部分。第一个,最基本的部分是启动时启动的部分。但是对于它的大部分功能,它需要第二部分。这些部分必须对齐--任何一个部分都不需要来自另一个部分的任何功能,而实际上并不存在。当这些部分没有对齐,且函数grub_calloc未提供时,就会出现可见的运行时问题。对于我来说,grub_calloc是否属于第二个、更大的部分还是第一个还不是100%清楚的。我原以为会有第二个,但grub构建系统是一项相当艺术的工作,所以我不知道:)。
  2. 造成此问题的根本原因是grub更新没有确保两个部分都已被更新。理想情况下,不这样做会导致grub安装失败,系统应该恢复到安全状态。这是不可能的。这对我来说仍然是个谜。在默认情况下,更新所需要做的就是将每个部分放在当前部分所在的位置,因为这显然是有效的。如果安装位置/驱动器是配置驱动的,而其中一个位置无法到达,那么该配置数据与现实之间就会产生某种不匹配。只要在各部分之间没有引入新的依赖项,这可能不会显示为一个问题。

所有的解决方案包括重新安装grub,以确保这两个部分是对齐的。实际上,不需要回到以前的版本(尽管这会有效),因为破坏的并不是grub运行时本身。根据您的环境,有许多方法可以实现这一点,但是运行引导修复活动磁盘对我来说是有效的。

为了避免将来出现这种错误,确保系统上的grub安装程序配置为安装到正确的设备上,这可能是有用的。

此更新解决了一些重要的bug (见Ubuntu安全通知4432)。如果您已恢复grub以解决此问题,请注意您已暴露在这些问题中。

EN

回答 10

Ask Ubuntu用户

发布于 2020-07-30 13:48:35

在一个简单的2分区安装中使用LinuxMint19.3 bios设置。

GRUB2更新后,机器在重新启动时崩溃,并进入救援模式。

代码语言:javascript
复制
error: symbol 'grub_calloc' not found    

为了恢复GRUB,我引导到LinuxMint19.3,在终端中发出以下命令:

代码语言:javascript
复制
sudo mount /dev/sda1  /mnt    
sudo grub-install --root-directory=/mnt/  /dev/sda    

在重新启动时,桌面显示得很好。

票数 19
EN

Ask Ubuntu用户

发布于 2020-07-30 01:38:43

我和RickN.2磁盘在同一艘船上,但它们不在RAID中。我用了这个工具https://sourceforge.net/p/boot-repair-cd/home/Home/

我从Ubuntu https://help.ubuntu.com/community/Boot-Repair中找到了这个工具

它似乎已经安装了一些以前没有的GUI特性(这个系统一直是CLI--仅在我记得的时间内),但我正在重新运行,这是最重要的部分。

感谢其他人,在这里,感谢你们的指导。

票数 7
EN

Ask Ubuntu用户

发布于 2020-07-30 08:27:33

今天早些时候我安装了Lubuntu20.04(在一台旧笔记本电脑上,Bios安装,而不是EFI),然后让它进行升级,我也有同样的错误和不可引导的系统。它产生了一个非常混乱的对话框,想要更新我的第一个分区以及我的Lubuntu分区上的GRUB。它似乎建议更新两个分区,而我就是这样做的。然后,在重新启动时,它在加载DE之前崩溃。

不管怎样,我找到了更多的解决办法,而不是解决这个问题的方法。由于GRUB似乎是问题所在(无论出于什么原因),我重新安装了Lubuntu,当它第一次启动时,我打开了一个终端窗口并手动进行了升级,并排除了对grub的更新:

代码语言:javascript
复制
sudo apt update

sudo apt list --upgradable |grep grub

它显示:

代码语言:javascript
复制
grub-common/focal-updates 2.04-1ubuntu26.1 amd64 [upgradable from: 2.04-1ubuntu26]
grub-pc-bin/focal-updates 2.04-1ubuntu26.1 amd64 [upgradable from: 2.04-1ubuntu26]
grub-pc/focal-updates 2.04-1ubuntu26.1 amd64 [upgradable from: 2.04-1ubuntu26]
grub2-common/focal-updates 2.04-1ubuntu26.1 amd64 [upgradable from: 2.04-1ubuntu26]

然后,我将这些grub更新“搁置”如下:

代码语言:javascript
复制
sudo apt-mark hold grub*

然后,..and继续进行升级:

代码语言:javascript
复制
sudo apt full-upgrade

我重新启动了这台机器,它又回到了桌面上,没有出错。

我不知道不更新GRUB可能会产生什么不良影响,但到目前为止,它在桌面会话中的作用是正常的。

票数 3
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/1263125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档