在btrfs文件系统上安装后,出现“不允许稀疏文件”的错误消息。

我在安装Ubuntu时没有创建交换分区,并且将/安装在了btrfs上。#现在每次启动时都会出现“不允许稀疏文件”的提示信息。这个提示信息会在启动画面之前显示。有没有办法消除这个警告?

在我的系统上,按下任何键都没有反应,卡住了! - Michael
22016年的解决方案是在/etc/default/grub中设置GRUB_SAVEDEFAULT=false,然后运行update-grub命令。 - Stuart Cardall
在2020年,我通过将GRUB_DEFAULT="1"解决了这个关于grub / btrfs的问题,以便在GRUB菜单中启动第二个内核。 - Stuart Cardall
1@StuartCardall 你的评论并不是解决方案。它们会禁用一些非常有用的功能。我认为真正的解决方案是创建一个非btrfs的/boot分区。 - xeruf
我已经使用btrfs根文件系统运行了大约6年,并且没有单独的/boot分区,使用的是我在2年前评论中提到的相同设置。整个目的就是为了能够对整个根文件系统进行快照,以便GRUB能够从快照中引导启动。 - Stuart Cardall
2个回答

好的,在翻找一番之后,我找到了一个临时解决这个问题的方法,它相当简单,但是由于我的系统没有设置btrfs,所以无法确认这个修复是否有效。

要么注释掉这行代码,要么将其删除:

if [ -n ${have_grubenv} ]; then save_env recordfail; fi

或者

if [ -n "\${have_grubenv}" ]; then if [ -z "\${boot_once}" ]; then save_env \
recordfail; fi; fi

在这个文件中
/etc/grub.d/00_header

然后运行
update-grub

不直接编辑/boot/grub/grub.cfg的原因是每次更新 grub 时它都会被覆盖,在这种情况下,您只需在 grub 通用软件包更新时“重新进行”修复。

如果您想要添加自己,请查看此处关于 launchpad 的错误报告bug #736743

引用来自该错误报告的 Colin Watson 的话

这实际上是一个误导性的错误信息:发生的情况是,GRUB的btrfs实现没有为返回块列表给调用代码实现文件读取钩子接口。我在grub-devel上发布了这个问题,上游维护者指出,即使是多设备问题,从GRUB写入btrfs也基本上存在风险,因为:

同一块可能被多个快照使用每个使用给定块的树都将包含其校验和,以此类推。

然而,btrfs在开头保留了引导加载程序的空间。这个空间比GRUB嵌入所需的空间要大,因此我们可以使用其中的1KB作为环境块。

无论如何,这不是由于使用子卷而产生的新问题,也不会阻止启动(你会得到一个虚假的“按任意键继续”提示,但如果你忽略它,它仍然会启动)。降级为愿望清单。

希望这有所帮助。


1你能找到一个解释,为什么它一开始就会报错吗?谢谢。 :) - jrg
在我的配置文件中,这一行看起来是这样的:if [ -n "\${have_grubenv}" ]; then if [ -z "\${boot_once}" ]; then save_env recordfail; fi; fi - FUZxxl
1我会将其注释掉。如果启动失败,你仍然可以使用一个活动光盘来取消注释这行代码。 - Allan
好的。我要試試看。 - FUZxxl
2太好了,它有效果! - FUZxxl
太好了,知道了!:) - Allan
+1,在晚上11:30找到了这个并解决了我的问题。谢谢! - AtomicPorkchop
难过,这在我的Ubuntu 12.04上出问题了。:((别担心,可能是我的奇怪设置) - jrg
2请解释一下我们要注释掉的代码的功能。 - Zaz
奇怪的是,将这段注释掉并不能解决问题,但至少可以防止机器在“按任意键”提示处卡住...现在我至少可以启动了。 - Michael

我正在运行Raring Ringtail的开发分支。 我遇到了关于禁止稀疏文件的问题。GRUB根本没有显示,直接启动Ubuntu。
我正在阅读一本Linux杂志(LXF),里面有一些关于恢复和修复分区、文件、引导加载程序和其他内容的文章。
其中一位作者提到了一个简单的工具... Boot-Repair。 这个工具对我很有帮助,我认为它应该在Ubuntu的软件仓库中占据重要位置。
将Boot-Repair添加到您的系统中:
  1. 打开终端窗口,复制/粘贴/输入以下内容:

    sudo add-apt-repository ppa:yannubuntu/boot-repair && sudo apt-get update
    
  2. 复制/粘贴/输入以下内容以安装并启动Boot-Repair:

    sudo apt-get install -y boot-repair && boot-repair
    
  3. 现在可以看到Boot-Repair的主要图形界面。

    点击一个名为“Recommended repair”的按钮。
    

    让工具发挥它的“魔力”。

  4. 当魔法咒语结束时,

    创建一个可见的URL的小笔记。
    
  5. 重新启动系统,检查是否可以访问恢复的操作系统。

  6. 如果没有成功,请使用修复结束时显示的URL寻求帮助。


我不认为这有帮助,因为这是grub本身的一个错误。 - FUZxxl
你为什么这样认为?我进行了几次关于13.04的虚拟安装,都遇到了同样的问题。编辑了grub.cfg,但没有任何结果。这并没有解决"不允许稀疏文件"的问题。GRUB 甚至都不可见。 在今天早些时候我尝试了我在帖子中提供的解决方案后,它就像魔法一样起作用,并且仍然有效。 - C Schilder
很遗憾,在14.04 Trusty amd64上无法正常工作。 - loser114491