离开Grub菜单并在Ubuntu启动画面之前,会出现这个消息。
如何解决问题以清除这个消息?
而这个消息意味着什么?
系统启动并且似乎运行良好。
如何解决问题以清除这个消息?
而这个消息意味着什么?
error: Diskfilter writes are not supported
系统启动并且似乎运行良好。
这是在最新版本的Ubuntu Server LTS(Ubuntu Server 14.04 LTS)中出现的一个bug,当你在LVM或RAID分区内创建引导分区(或根分区,当引导分区不存在时)时会发生。
你可以在Ubuntu Launchpad上获取有关此bug的更多信息:Bug #1274320 "Error: diskfilter writes are not supported"。
更新:此bug已经在Ubuntu Server 14.04和一些更新的Ubuntu版本中修复。可能只需要运行apt-get upgrade
即可。
当系统启动时,GRUB会读取(load_env
)/boot/grub/grubenv
中的数据。这个文件被称为GRUB环境块。
来自GRUB手册:
往往能够在每次启动时记住一小部分信息是非常有用的。if [ -s $prefix/grubenv ]; then
set have_grubenv=true
load_env
fi
save_env
语句只适用于简单的安装(无法在RAID或LVM磁盘内运行save_env
)。根据GRUB手册的说明:save_env
语句来更新recordfail状态(参见Ubuntu帮助-Grub 2,“上次启动失败或进入恢复模式”部分)。然而,在Ubuntu 14.04(以及最近的Debian版本)中,即使GRUB安装在LVM或RAID中,也会使用save_env
语句(在recordfail功能内部)。/etc/grub.d/00_header
中104到124行的内容:if [ "$quick_boot" = 1 ]; then
[...]
case "$FS" in
btrfs | cpiofs | newc | odc | romfs | squash4 | tarfs | zfs)
cat <<EOF
# GRUB lacks write support for $FS, so recordfail support is disabled.
[...]
if [ -n "\${have_grubenv}" ]; then if [ -z "\${boot_once}" ]; then save_env recordfail; fi; fi
GRUB正确跳过不支持的文件系统(btrfs、zfs等)的recordfail功能,但是它在任何时候都不跳过LVM和RAID。
为了在文件系统中进行正确的读写操作,GRUB加载适当的模块。
GRUB在RAID分区中使用diskfilter模块(insmod diskfilter
),在LVM分区中使用lvm模块。
让我们看一下diskfilter模块的读写实现:
apt-get source grub2
vim grub2-2.02~beta2/grub-core/disk/diskfilter.c
static grub_err_t
grub_diskfilter_read (grub_disk_t disk, grub_disk_addr_t sector,
grub_size_t size, char *buf)
{
return read_lv (disk->data, sector, size, buf);
}
static grub_err_t
grub_diskfilter_write (grub_disk_t disk __attribute ((unused)),
grub_disk_addr_t sector __attribute ((unused)),
grub_size_t size __attribute ((unused)),
const char *buf __attribute ((unused)))
{
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
"diskfilter writes are not supported");
}
save_env
语句。grub-probe --target=abstraction "${grubdir}"
命令,以获取GRUB用于读写/boot/grub
目录中文件的抽象模块类型;diskfilter
或lvm
模块,则跳过记录失败的save_env
语句,在/boot/grub/grub.cfg
文件中写入适当的注释;
# GRUB缺少对/dev/md0的写支持,因此禁用了记录失败的支持。
00_header
文件。# Download
wget https://gist.githubusercontent.com/rarylson/da6b77ad6edde25529b2/raw/99f266a10e663e1829efc25eca6eddb9412c6fdc/00_header_patched
# Apply
mv /etc/grub.d/00_header /etc/grub.d/00_header.orig
mv 00_header_patched /etc/grub.d/00_header
# Disable the old script and enable the new one
chmod -x /etc/grub.d/00_header.orig
chmod +x /etc/grub.d/00_header
# Update Grub
update-grub
00_header
文件(如此处推荐)不起作用。我知道仅仅因为它对我(和 Rarylson Freitas)有效,并不意味着它一定适用于每个人。但是你确定给了旧的和新的 00_header
正确的权限,并运行了 update-grub
吗?(如果你只是直接编辑了 00_header
,则不需要 chmod
,但 update-grub
仍然是必要的。) - Eliah Kagangrub
。问题一直存在,但似乎软件更新解决了这个问题。 - douggrosave_env
没有任何作用。那又怎样? - Alexis Wilke00_header
文件中引入了一个语法错误,在文件的第106行多了一个cat <<EOF
语句。删除了那个语句后,错误消失了。也许我在修复后没有正确运行update-grub
,但现在它已经正常工作了。 - douggrofunction recordfail { set recordfail=1 # GRUB缺乏对lvm的写入支持,因此禁用了recordfail支持。 }
,但我仍然遇到了错误。 - Paul Tomblinsudo apt install linux-lowlatency-hwe-22.04
)来解决音频问题。然而,Ubuntu仍然想要启动默认内核。我在某个地方读到,启用GRUB_SAVEDEFAULT=true
并将GRUB_DEFAULT=saved
更改为应该解决此问题。但这并没有解决问题,每次重新启动时我都会收到这个错误。不过似乎并没有引起任何问题。我将恢复那些GRUB的更改,希望能清除这个错误,或者尝试@nux发布的解决方案。 - AnthonyKsudo update-grub