ext4 可以从不可读的磁盘扇区 (512/4K) 恢复什么

ext4 可以从不可读的磁盘扇区 (512/4K) 恢复什么

如果硬盘坏扇区发生在文件系统/home/user/me的元数据中ext4,是否意味着所有子目录的数据丢失?

背景:
我知道许多用户对 ext4 文件系统感到满意,甚至不愿意更换为“最近”开发的替代方案(例如 BTRFS),声称数据丢失的风险增加。事实上,当考虑到 ext4 的代码在今天左右时,可以找到一些结果虫子说话

通过这个介绍,我的问题是:

ext4文件系统对块设备坏扇区的抵抗力是多少?坏扇区可能会吞噬 4K 字节,我想如果这些 4K 碰巧吞噬了目录结构(即/home/user/me目录)中高层的一些目录信息,这将“造成严重破坏”。

我知道超级块(更基本的信息源在 ext4 中以冗余形式保存,所以我想象一个坏块在那里可以修复,但我不确定它是否会被自动检测)

所以我的问题是:ext4 能否抵抗元数据中丢失坏块的情况?

我知道数据/文件内容中的坏块总是意味着丢失那些 512/4K 扇区(但是我使用 parchive 作为补救措施)。

答案1

对此事进行一番调查后“如果ext4可以处理来自块设备的读取错误”我的初步结论是:ext4 中仅存在部分冗余

以下是我“调查”的ext4“安全特征”的一些发现(基于Ext4 维基“EXT4 文件系统中的索引节点结构”

  • 除了少数例外情况,例如内联数据或者内联数据 ext4分别存储文件内容“数据块”和文件系统“元数据块”。据我所知,ext4仅需要对后者进行一些维修/冗余。
  • 元数据的修复/冗余依赖于a) 2010年新引入/添加的校验和功能b) 拥有额外的副本关键元数据
  • 这样的 ”关键元数据“(在块设备的不同部分的意义上)是。
    1. 超级ext4街区
    2. 的信息block group descriptors
  • 校验和保护超级块、多重挂载保护、扩展属性、目录条目、HTREE 节点、扩展、索引节点和组描述符。虽然范围(因此受到保护的新ext4功能部分取代了旧的间接块寻址(IBA)),但旧的 IBA 块却不受保护,如下所述:

    请注意,既没有幻数也没有校验和来提供任何级别的信心,表明 [IBA] 块没有充满垃圾。

ext4 可以从不可读的磁盘扇区 (512/4K) 恢复什么

  • 损失超级街区块组描述符,其冗余副本存储在磁盘上的所有/或某些特定块组中。
  • 由于不可读扇区而丢失目录条目并不意味着无法访问,而且还意味着目录中存储的文件内容丢失(仅丢失文件名)。这些文件(包括子目录)仍然可以通过其filespec <inode-number>in debuge2fs.
  • 的零件丢失inode table。中的每个条目索引节点表(被分割的表和被写入形成磁盘ext4布局的块组的部分)占用(填充)256字节。因此,一个不可读的扇区应该意味着仅丢失 2 到 16 个文件。另外随着校验和功能 inode 表中的任何损坏即使不一定可以纠正,也应该是可以纠正的,但不要忽视。

什么是坏扇区引起的麻烦ext4似乎无法防范

  • 不重要的元数据,包括索引节点、目录条目、扩展区,IBA 不受保护。
  • 索引节点:正如前面提到的,inode 占用 256 字节并且是构成文件数据的块的核心句柄,这意味着失去对 2 至 16 个文件的访问权限(主要与文件大小无关)。
  • 目录条目:如果由于坏扇区而丢失,则意味着内部所有文件的文件路径将丢失文件名部分。一方面,坏扇区的大小为 512 或 4K 字节,目录散列功能占用的文件名和空间会影响丢失的程度。另外,据我了解,目录散列本质上提供了冗余(但我不能保证这一点)。
  • 范围:范围树中丢失部分信息,就像 inode 本身的丢失一样,会影响对构成文件内容的数据块的访问,因此大约意味着丢失 1 个文件。
  • IBA 块:(参见范围)+ 如前所述,还将遭受部分破坏的增加的脆弱性(但这不是问题的主要焦点)。

另外使用的方法

为了测试和证明ext4磁盘布局的一些列举的挑战(关于其对坏扇区的抵抗力),以下工具很方便

  • debugfs <blockdev>它允许通过 filespec 访问文件(文件路径,或者在出现问题时通过 inode 编号< >
  • truncateddlosetupmountmkfs.ext4创建ext4要使用的文件系统。
  • dumpe2fstune2fs提供信息
  • dm-setup组装一个模拟读取错误的虚拟块设备,如下所示:
    $> dmsetup 创建 badsectordevice << EOF
    0 2902 线性 /dev/loop1 0
    2902 2 错误
    2904 17576 线性 /dev/loop1 2904
    EOF
    
    其中示例显示块设备扇区为 512,ext4块大小为 1024,因此 LBA 扇区 2902,2903 不可读。

相关内容