处理 BTRFS ref/backpointer 不匹配、backref 丢失

处理 BTRFS ref/backpointer 不匹配、backref 丢失

btrfs receive由于缺少一些扩展,btrfs 文件系统在操作期间报告了一些错误。从日志中:

BTRFS error (device dm-1): unable to find ref byte nr 190303420416 \
      parent 0 root 594  owner 1 offset 0
BTRFS: error (device dm-1) in __btrfs_free_extent:6944: errno=-2 No such entry
BTRFS info (device dm-1): forced readonly
BTRFS: error (device dm-1) in btrfs_run_delayed_refs:2956: errno=-2 No such entry

A btrfs scrub(在 umount + mount 之后)因类似错误而失败。

Abtrfs check报告 3 个扩展的问题 - 每个扩展问题的报告如下:

checking extents
ref mismatch on [190303420416 16384] extent item 0, found 1
Backref 190303420416 parent 594 root 594 not found in extent tree
backpointer mismatch on [190303420416 16384]
owner ref check failed [190303420416 16384]

我的问题是:如何将这些数字转化为有用的东西?例如检查某些文件/目录是否受到影响?

以及如何处理此类错误?

Abtrfs check --repair似乎工作正常,没有严重抱怨:

  ref mismatch on [190303420416 16384] extent item 0, found 1
* repair deleting extent record: key 190303420416 169 1
* adding new tree backref on start 190303420416 len 16384 parent 0 root 594
  Backref 190303420416 parent 594 root 594 not found in extent tree
  backpointer mismatch on [190303420416 16384]
  owner ref check failed [190303420416 16384]

*标记是我的)

这是否意味着修复成功且没有丢失任何数据?

答案1

成功的btrfs check --repair命令不一定会产生一致的 btrfs 文件系统。

在一种情况下,我观​​察到btrfs scrubafterbtrfs check触发WARN_ON()fs/btrfs/extent-tree.c.并且接收快照导致 IO 失败(强制只读重新安装)。

btrfs check因此,由于 a 、后面跟着 abtrfs check --repair和 a的运行时间btrfs scrub可能非常重要 - 并且这些操作具有不确定的结果:实用的替代方案是重新创建 btrfs 文件系统并恢复备份。

2021-12-14 跟进:FWIW,这些错误是由故障/低质量 USB 集线器引起的(供应商字符串:“Genesys Logic, Inc.”)。直接连接 USB 磁盘驱动器后,这些错误再也不会出现。在此之前,当每天将快照发送到外部 USB 驱动器时,每隔几个月左右就会出现此类错误。我什至尝试了另一个 Genesys USB 集线器(尽管标记不同),但它产生了类似的错误模式。

相关内容