不支持Diskfilter写入>是什么导致此错误?

RCF

离开Grub菜单时且在Ubuntu启动屏幕之前,会出现此消息。

如何解决问题以清除消息?

那是什么意思?

error:  Diskfilter writes are not supported

系统启动,并且看起来工作正常。

拉里森·弗雷塔斯(Rarylson Freitas)

这是一个错误!

在最新版本的Ubuntu Server LTS(Ubuntu Server 14.04 LTS)中,当您在LVM或RAID分区内创建启动分区(或根分区,如果启动分区不存在)时,会发生此错误。 。

您可以在Ubuntu Launchpad中获得有关此错误的更多信息:错误#1274320“错误:不支持diskfilter写入”

更新:此错误已在Ubuntu Server 14.04和某些较新的Ubuntu版本中修复。可能只需要运行即可apt-get upgrade

为什么会发生此错误?

系统启动时,GRUB读取中的(load_env)数据/boot/grub/grubenv该文件称为GRUB环境块

从GRUB手册中:

能够记住从一次引导到下一次引导的少量信息通常是有用的。

[...]

在引导时,load_env命令(请参见load_env)从中加载环境变量,而save_env(请参见save_env)命令将环境变量保存到其中。

[...]

grub-mkconfig 使用此工具来实施 GRUB_SAVEDEFAULT

可以在以下行为中建立此行为/etc/grub.d/00_headerupdate-grub使用此文件来生成/boot/grub/grub.cfg文件):

if [ -s $prefix/grubenv ]; then
  set have_grubenv=true
  load_env
fi

问题在于该save_env语句仅在简单的安装中有效(您不能save_env在RAID或LVM磁盘中运行)。从GRUB手册中:

出于安全原因,仅当安装在普通磁盘(无LVM或RAID),使用非校验和文件系统(无ZFS)以及使用BIOS或EFI功能(无ATA,USB或IEEE1275)时,此存储才可用。

GRUB recordfail功能使用该save_env语句来更新recordfail状态(请参见Ubuntu帮助-Grub 2的“上次引导失败或引导进入恢复模式”部分)。但是,在Ubuntu 14.04(和最新的Debian版本)中,save_env即使GRUB安装在LVM或RAID中,也会使用语句(recordfail功能内)。

让我们看一下从104到124的行/etc/grub.d/00_header

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

当使用不受支持的文件系统(btrfs,zfs等)时,GRUB会正确跳过recordfail功能,但它不会随时跳过LVM和RAID

GRUB如何保护自己免于在RAID和LVM中写入?

为了在文件系统中正确读取/写入,GRUB会加载适当的模块。

GRUB在RAID分区中使用diskfilter模块(insmod diskfilter),在LVM分区中使用lvm模块。

让我们看一下diskfilter模块的读/写实现

apt-get source grub2
vim grub2-2.02~beta2/grub-core/disk/diskfilter.c

我在这里粘贴代码(从808到823行)。此问题中显示的警告出现在第821行:

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");
}

grub_diskfilter_read功能已实现(GRUB可以读取RAID文件系统)。但是,该grub_diskfilter_write函数会引发GRUB_ERR_NOT_IMPLEMENTED_YET错误。

为什么使用可以quick_boot=0解决问题?为什么这是错误的解决方案?

如果您在/etc/grub.d/00_header代码中再看一遍,将会看到仅在时使用了recordfail功能quick_boot=1因此,quick_boot从1更改为0将禁用recordfail功能,并禁用RAID / LVM分区中的写操作。

但是,它也会禁用许多其他功能(运行grep \$quick_boot /etc/grub.d/*,您会看到)。更重要的是,如果有一天您将/boot/grub目录更改为RAID / LVM之外,那么recordfail功能仍将被禁用。

综上所述,此解决方案不必要地禁用了功能,并且不是通用的。

什么是正确的解决方案?

save_env当GRUB位于LVM或RAID分区内时,正确的解决方案应考虑禁用该语句。

在Debian Bug Tracker系统中提出了一个补丁程序来实施该解决方案。可以在以下位置找到它:https : //bugs.debian.org/cgi-bin/bugreport.cgi?bug=754921

该补丁背后的想法是:

  • 运行grub-probe --target=abstraction "${grubdir}"命令以获取GRUB用于读取/写入目录中文件的类型的抽象模块/boot/grub
  • 如果GRUB使用diskfilterorlvm模块,则跳过recordfailsave_env语句,并在/boot/grub/grub.cfg文件中写一个适当的注释
    • 例如, # GRUB lacks write support for /dev/md0, so recordfail support is disabled.

如何应用正确的解决方案?

如果您不想等待Ubuntu / Debian家伙在官方代码中应用此补丁,则可以使用我的补丁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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

是什么导致在VBA Excel中出现“对象不支持此属性或方法”的消息?

来自分类Dev

是什么原因导致“您选择的INF文件不支持这种安装方法。” 错误?

来自分类Dev

ValueError:不支持continuous。这是什么错误?

来自分类Dev

不支持的属性错误

来自分类Dev

是什么原因导致我的servlet在运行时出现“此驱动程序不支持Java Runtime Environment(JRE)1.7版本...”?

来自分类Dev

是什么原因导致我的servlet在运行时出现“此驱动程序不支持Java Runtime Environment(JRE)1.7版本...”?

来自分类Dev

对象不支持此属性或方法

来自分类Dev

GORM的此实现不支持findAll

来自分类Dev

此设备不支持HtmlResponse

来自分类Dev

对象不支持此属性或方法

来自分类Dev

“此系统不支持EFI变量”

来自分类Dev

对象不支持此属性或方法

来自分类Dev

对象不支持此操作

来自分类Dev

对象不支持此属性或方法

来自分类Dev

是什么导致使用有效路径的NotSupportedException(“不支持给定路径的格式”)?

来自分类Dev

导致错误的原因:不支持“NgenLocalized”参数

来自分类Dev

错误:Web Api中的此流不支持超时

来自分类Dev

错误:“此协议版本不支持加密方法”

来自分类Dev

Rails:类型错误:对象不支持此属性或方法

来自分类Dev

错误:此脚本不支持 -Xdebug

来自分类Dev

此平台不支持 SegmentedControlIOS 错误 React Native

来自分类Dev

MongoError:此MongoDB部署不支持可重试的写入。请在您的连接字符串中添加retryWrites = false

来自分类Dev

烧瓶测试信号不支持错误

来自分类Dev

错误:[布尔]查询不支持[术语]

来自分类Dev

错误:不支持给定路径的格式

来自分类Dev

套接字:不支持协议错误

来自分类Dev

错误:不支持沙丘1.11版

来自分类Dev

错误:请求方法'GET'不支持

来自分类Dev

网页上的MIME不支持错误

Related 相关文章

  1. 1

    是什么导致在VBA Excel中出现“对象不支持此属性或方法”的消息?

  2. 2

    是什么原因导致“您选择的INF文件不支持这种安装方法。” 错误?

  3. 3

    ValueError:不支持continuous。这是什么错误?

  4. 4

    不支持的属性错误

  5. 5

    是什么原因导致我的servlet在运行时出现“此驱动程序不支持Java Runtime Environment(JRE)1.7版本...”?

  6. 6

    是什么原因导致我的servlet在运行时出现“此驱动程序不支持Java Runtime Environment(JRE)1.7版本...”?

  7. 7

    对象不支持此属性或方法

  8. 8

    GORM的此实现不支持findAll

  9. 9

    此设备不支持HtmlResponse

  10. 10

    对象不支持此属性或方法

  11. 11

    “此系统不支持EFI变量”

  12. 12

    对象不支持此属性或方法

  13. 13

    对象不支持此操作

  14. 14

    对象不支持此属性或方法

  15. 15

    是什么导致使用有效路径的NotSupportedException(“不支持给定路径的格式”)?

  16. 16

    导致错误的原因:不支持“NgenLocalized”参数

  17. 17

    错误:Web Api中的此流不支持超时

  18. 18

    错误:“此协议版本不支持加密方法”

  19. 19

    Rails:类型错误:对象不支持此属性或方法

  20. 20

    错误:此脚本不支持 -Xdebug

  21. 21

    此平台不支持 SegmentedControlIOS 错误 React Native

  22. 22

    MongoError:此MongoDB部署不支持可重试的写入。请在您的连接字符串中添加retryWrites = false

  23. 23

    烧瓶测试信号不支持错误

  24. 24

    错误:[布尔]查询不支持[术语]

  25. 25

    错误:不支持给定路径的格式

  26. 26

    套接字:不支持协议错误

  27. 27

    错误:不支持沙丘1.11版

  28. 28

    错误:请求方法'GET'不支持

  29. 29

    网页上的MIME不支持错误

热门标签

归档