更新
我最终放弃修复 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
- 下列的AskUbuntu 上的这个答案,我运行了
btrfs rescue zero-log
,但失败了:
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
- 我不知道如何解释
Root
或Roots
列,但它看起来并不显着
- 我一直在寻找这些错误,并阅读了许多论坛上的许多帖子,但未能找到任何内容来解释它们,或找到解决问题的明确方法。
可能的后续步骤
之一:
btrfsck --repair
btrfsck --init-extent-tree
- 删除有问题的子卷(如果可以的话)
- 擦除驱动器,将数据复制回来
- 我会保存这个直到所有其他选项都被排除为止。
然而,这两种方法都被标记为危险,可能会进一步破坏系统。我正在等待可以 rsync 到另一个硬盘驱动器,然后再尝试--repair
我的问题
- 文件系统的实际问题可能是什么?
- transid 指向日志问题,但是零日志和其他错误让我持怀疑态度。
- 我错过了哪些工具/命令来找出问题所在?
- 我应该采取下一步什么措施?