恢复 BTRFS,btrfsck 失败;下一步怎么办?

恢复 BTRFS,btrfsck 失败;下一步怎么办?

更新

我最终放弃修复 FS,而是购买了一对新的 HDD,创建了一个新的 BTRFS 池,并使用 rsync 从剩余的良好磁盘传输数据。

服务器设置

  • Rockstor,最新稳定版本(目前无法检查具体版本)
  • 3 个硬盘:操作系统驱动器 + 2 个“存储”驱动器
  • 存储驱动器为 BTRFS RAID 1,/dev/sdb并且/dev/sdc
  • btrfs-progs v4.12

初始问题

  • 昨晚正确关闭了电脑,一切似乎都很好
    • 讽刺的是,为了在雷雨天气保护文件系统
  • 重新启动,一切似乎正常且正常运行
  • 尝试运行备份到其上的共享,但权限始终被拒绝
  • 所有子卷均已正确安装,但以下情况除外MyVol
  • 尝试进入此目录时发生 I/O 错误

迄今为止的调查

  • 我一两天前运行的 SMART 检查没有返回任何错误
  • dmesg 显示此错误(请注意,“found”高于“wanted”):
    • BTRFS error (device sdb): parent transid verify failed on 5293051445248 wanted 1522252 found 1526184
  • 关闭电源,物理断开/dev/sdb,打开电源,以降级模式安装驱动器:
    • $ mount -t btrfs -o ro,recovery,degraded /dev/sdb /mnt(注意:/dev/sdc 现在是 /dev/sdb)
    • 与以前相同的结果:其他一切都已安装,但无法访问/mnt/MyVol,相同的 transid 错误。
  • 能够从最近的快照恢复数据(/mnt/.shapshots/MyVol/MyVol-monthly_date
  • 运行btrfsck /dev/sdb,检查范围时失败
    • 使用超级块 1 或 2 时出现相同错误
warning, device 1 is missing
Checking filesystem on /dev/sdb
UUID: 5b1726e8-eb11-46de-b974-f3ca3cb3a41d
checking extents
// Takes a few minutes, then fails:
cmds-check.c:5494: check_owner_ref: BUG_ON `rec->is_root` triggered, value 1
btrfs check[0x454958]
btrfs check[0x40bd93]
btrfs check[0x45bfa6]
btrfs check[0x45c1ea]
btrfs check[0x45cf99]
btrfs check(cmd_check+0x935)[0x4605f5]
btrfs check(main+0x80)[0x4122c0]
/lib64/libc.so.6(__libc_start_main+0xf5)[0x7f205c58b505]
btrfs check[0x4123cd]
Aborted
warning, device 1 is missing
Clearing log on /dev/sdb, previous log_root 0, level 0

// Waits a couple of minutes then fails:

Unable to find block group for 0
extent-tree.c:287: find_search_start: Warning: assertion `1` failed, value 1
btrfs-zero-log(btrfs_reserve_extent+0x713)[0x4198b3]
btrfs-zero-log(btrfs_alloc_free_block+0x6a)[0x419e2a]
btrfs-zero-log(__btrfs_cow_block+0x199)[0x409e39]
btrfs-zero-log(btrfs_cow_block+0x111)[0x40a651]
btrfs-zero-log[0x4101b8]
btrfs-zero-log(btrfs_commit_transaction+0x97)[0x4120d7]
btrfs-zero-log(main+0x180)[0x4089b0]
/lib64/libc.so.6(__libc_start_main+0xf5)[0x7faaec3c7505]
btrfs-zero-log[0x408ac5]

// Above error repeats another 2 times

Aborted
  • 尝试使用btrfs rescue super-recover -v /dev/sdb,所有超级块均被标记为良好。
  • 运行btrfsck --subvol-extents $MyVol_volid /dev/sdb,约 15 分钟后完全成功
    • 打印相同的 transid 错误,然后忽略 transid
    • 我不知道如何解释RootRoots列,但它看起来并不显着
  • 我一直在寻找这些错误,并阅读了许多论坛上的许多帖子,但未能找到任何内容来解释它们,或找到解决问题的明确方法。

可能的后续步骤

之一:

  • btrfsck --repair
  • btrfsck --init-extent-tree
  • 删除有问题的子卷(如果可以的话)
  • 擦除驱动器,将数据复制回来
    • 我会保存这个直到所有其他选项都被排除为止。

然而,这两种方法都被标记为危险,可能会进一步破坏系统。我正在等待可以 rsync 到另一个硬盘驱动器,然后再尝试--repair

我的问题

  1. 文件系统的实际问题可能是什么?
  • transid 指向日志问题,但是零日志和其他错误让我持怀疑态度。
  1. 我错过了哪些工具/命令来找出问题所在?
  2. 我应该采取下一步什么措施?

相关内容