什么是 btrfs Generation_errs?

什么是 btrfs Generation_errs?

我有一个 btrfs 文件系统,我已经擦洗了几次并发现了一些错误。如果我检查设备状态,我会发现有 Generation_errs:

$ sudo btrfs device stats /dev/nvme0n1p5
[/dev/nvme0n1p5].write_io_errs   0
[/dev/nvme0n1p5].read_io_errs    0
[/dev/nvme0n1p5].flush_io_errs   0
[/dev/nvme0n1p5].corruption_errs 0
[/dev/nvme0n1p5].generation_errs 3

这些 Generation_errs 是什么?有什么值得担心的吗?

FWIW,以下是清理后在内核日志中发现的错误消息:

5/22/16 12:00 AM BTRFS warning (device nvme0n1p5): checksum/header error at logical 343949312 on dev /dev/nvme0n1p5, sector 671776: metadata leaf (level 0) in tree 321435615232
5/22/16 12:00 AM BTRFS warning (device nvme0n1p5): checksum/header error at logical 343949312 on dev /dev/nvme0n1p5, sector 671776: metadata leaf (level 0) in tree 321376649216
5/22/16 12:00 AM BTRFS warning (device nvme0n1p5): checksum/header error at logical 343949312 on dev /dev/nvme0n1p5, sector 671776: metadata leaf (level 0) in tree 109330432
5/22/16 12:00 AM BTRFS warning (device nvme0n1p5): checksum/header error at logical 343949312 on dev /dev/nvme0n1p5, sector 671776: metadata leaf (level 0) in tree 109330432
5/22/16 12:00 AM BTRFS error (device nvme0n1p5): bdev /dev/nvme0n1p5 errs: wr 0, rd 0, flush 0, corrupt 0, gen 2
5/22/16 12:00 AM BTRFS error (device nvme0n1p5): unable to fixup (regular) error at logical 343949312 on dev /dev/nvme0n1p5

答案1

Btrfs 维基术语表这是关于什么的一代是:

  • 一代

    每笔交易都会更新的内部计数器。当写入元数据块时(使用写入时复制),当前生成存储在该块中,以便可以识别太新(因此可能不一致)的块。

另一个条目提到

正常情况下,代号必须匹配。不匹配可能是由于崩溃后丢失写入(即悬空块“指针”;软件错误、硬件错误)、错误写入(块从未写入该位置;软件错误、硬件错误)而引起的。

它并没有告诉我太多,其他人也在问,参见例如这个邮件线程

实际上,最后一篇文章在该线程中提到了一些有用的东西:“生成错误”是“块尚未写入的指示”,这基本上与 Wiki 所说的相呼应。

因此,根据这些信息,我们可以得出一些结论:

  • 文件系统btrfs没有完整记录(用户端)及其工具的输出解释(维基甚至“目前,大部分信息都存在于人们的头脑中。”)

  • 将元信息写入磁盘时出现一些错误,这可能表明存在问题。

通过回答这个问题,我希望有一些btfs大师能够出现并为您提供“我该怎么办?”这个问题的正确答案。

您的下一个停靠港可能会在btrfs邮件列表上询问,例如维基百科中提到的(如果我是你,我现在就会这样做)。

答案2

我不是专家,但我在btrfs dev stats -c每月定期清理后得到了类似的报告。

4000 corruption_errs on sda
14 generation_errs on sdd

如中所述文档btrfs,

腐败错误 发现块校验和不匹配或元数据标头损坏。

生成错误 区块生成与预期值不匹配(例如,存储在父节点中)。

我运行了一个 raid 10,所以我认为擦洗应该通过用另一个副本中的健康标头替换这些坏标头来修复此类校验和错误,但擦洗没有这样做(或者至少它不会自动重置错误计数器,如果它)实际上确实修复了它们。

不管怎样,我决定改为运行平衡,然后擦洗磁盘。这确实用健康的校验和替换了损坏的校验和,并且错误消失了。

  • 是否建议或需要平衡?我不知道。
  • 在存在损坏错误的情况下运行平衡是否可能会将损坏的标头传播到其他磁盘?我不知道。
  • 它解决了我的问题吗?是的,YMMV。

相关内容