如何修复 BTRFS 块?

如何修复 BTRFS 块?

由于某些未知原因,我的 BTRFS 文件系统已损坏。 dmesg 打印

BTRFS critical (device sda2): corrupt leaf, slot offset bad: block=43231330304,root=1, slot=47

(在 dmesg 跟踪中超过 1000 倍)。

如何修复区块#43231330304?

答案1

你应该安装智能监控工具并进行长时间测试(需要一段时间)

#smartctl -t long /dev/sd?

然后它在坏块上失败

Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Extended offline    Completed: read failure       80%       682         1193046

这样你就有了该块的 LBA 地址 (1193046)。

然后你安装sg_utils并使用上面的 lba 地址运行

# sg_verify --lba=1193046 /dev/sda

你会得到类似的回复

# sg_verify --lba=1193046 /dev/sdb
verify (10):  Fixed format, current;  Sense key: Medium Error
 Additional sense: Unrecovered read error
  Info fld=0x123456 [1193046]
  Field replaceable unit code: 228
  Actual retry count: 0x008b
medium or hardware error, reported lba=0x123456

这样你就会知道这个扇区确实坏了,无法自动放入磁盘微控制器的缺陷列表中。

您可以使用以下命令检查缺陷列表

# sg_reassign --grown /dev/sda
>> Elements in grown defect list: 0

如果您重新分配该扇区

# sg_reassign --address=1193046 -v /dev/sda

然后您检查增加的缺陷列表

# sg_reassign --grown /dev/sdb
>> Elements in grown defect list: 1

您应该会看到计数器增加 1。

之后你应该运行

#smartctl -t long /dev/sd?

再次并重试此过程,直到磁盘干净并且长时间测试运行没有错误。

在这种情况下,我会将此磁盘用于不重要的东西,例如蒸汽库或类似的东西。但为了确定起见,我会更换磁盘。但目前磁盘应该没问题。

答案2

如果问题是由硬盘驱动器故障(例如坏块)引起的,则无法修复。

检查坏块: badblocks -n /dev/sdX

要了解损坏的文件,请参阅如何列出 BTRFS 块的文件部分?

答案3

请不要建议跑步

btrfs check --repair

除非您完全确定导致问题的原因,并且这应该是最后一个选项,此时您应该有一个正在运行的备份。

手册页指出

--repair警告:除非开发人员或有经验的用户建议您这样做,并且只有在接受没有 fsck 成功修复所有类型的文件系统损坏之后才使用,否则请勿使用。例如。一些其他软件或硬件错误可能会严重损坏卷。

答案4

BTRFS 开发人员建议通过 IRC 或 linux-btrfs 邮件列表联系他们,根据 BTRFS 的任何(相对严重的)问题BTRFS Wiki 常见问题解答:我的 Btrfs 文件系统有问题!:

请参阅问题常见问题解答针对常见问题及解决方案。
如果该页面对您没有帮助,请尝试在 IRC 或Btrfs 邮件列表
明确表示:请向邮件列表报告错误和问题(你是不是需要订阅)。

Btrfs 邮件列表有关如何发帖到邮件列表以及寻求帮助时应包含哪些信息的详细信息。

就我而言,“损坏的叶子”错误的最简单解决方案是简单地删除受影响的文件,因为它们不包含任何重要的内容。

要找出哪个文件受到损坏的叶子的影响:

btrfs inspect-internal logical-resolve 43231330304 <mountpoint>

其他一般建议是

  • 先备份数据;
  • 运行内核 5.11 或更高版本(越新越好)(v5.11 引入了更多针对写入元数据的健全性检查);
  • 使用最新的 btrfs-progs(截至 2021 年 9 月为 5.14);
  • 正如 user2246514 所提到的,做不使用“btrfs check --repair”,除非 BTRFS 开发人员建议。从btrfs-check(8) 手册页:

警告:不要使用 --repair ,除非开发人员或有经验的用户建议您这样做,并且只有在接受没有 fsck 成功修复所有类型的文件系统损坏之后。例如。一些其他软件或硬件错误可能会严重损坏卷。

相关内容