如何修复 Btrfs 损坏的叶子

如何修复 Btrfs 损坏的叶子

我有一个 btrfs 文件系统,无论我尝试用它做什么,其中一个目录都会导致 IO 错误:

  • 列出其内容或尝试删除它会导致 IO 错误,即使作为超级用户也是如此:

    $ ls thedir 
    ls: cannot access 'thedir': Input/output error
    $ sudo rm -fr thedir 
    rm: cannot remove 'thedir': Input/output error
    
  • 在其上挂载 tmpfs 会导致 IO 错误:

    $ sudo mount -t tmpfs -o size=10M tmpfs thedir
    mount: thedir: can't read superblock on tmpfs.
    

    我认为“超级块tmpfs”在这里具有误导性,在同一文件系统中的不同目录上安装 tmpfs 工作正常,并且超级块是 btrfs 的东西,而不是据我所知的 tmpfs 的东西。

内核日志说:

BTRFS critical (device sda1): corrupt leaf: root=5 block=46321315840 slot=24 ino=106823936, invalid inode generation: has 18446744073709551492 expect [0, 369151]
BTRFS error (device sda1): block=46321315840 read time tree block corruption detected

一方面,btrfs 检测到错误并防止出现更严重的问题是件好事,但现在整个文件系统基本上都被破坏了。坏目录是一个问题,特别是对于 rsync,它在 IO 错误后停止。

是否可以得到文件系统恢复到可用状态?我有备份;如果需要,我可以创建一个新的文件系统并复制所有数据,但这需要很多天,甚至可能几周的时间。我宁愿删除损坏的目录,只恢复那部分,它要小得多。

我正在使用 Linux 5.4.83 和btrfs-progs5.9。我知道btrfs check --repair,但我也知道其手册页中的警告:

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

相关内容