ext4 文件系统可以承受坏扇区(不可读)吗?

hum*_*ace 6 ext4 data-recovery block-device

如果/home/user/me在ext4fs的元数据中出现硬盘坏扇区,是否意味着所有子目录的数据丢失?

背景:
我知道许多用户对 ext4 文件系统感到满意,甚至不愿意更改为“最近”开发的替代方案(例如 BTRFS),声称数据丢失的风险增加。事实上,当关于 ext4 的代码在今天出现时,一些发现错误的结果会说话。

有了这个介绍,我的问题是:

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

我知道超级块(更基本的信息源在 ext4 中以冗余形式保存,所以我对坏块进行成像可以在那里修复,但我不确定它是否会被自动删除)

所以我的问题是:ext4 能否阻止在其元数据中丢失坏块?

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

hum*_*ace 5

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

以下是我“调查”ext4的“安全特性”的一些发现(基于Ext4 wiki和 “EXT4 文件系统中的 Inode 结构”)

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

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

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

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

坏道引发的问题ext4似乎无法防范什么

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

另外使用的方法

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

  • debugfs <blockdev>它允许通过文件规范访问文件(文件路径,或者在通过 inode 编号出现问题的情况下< >)
  • truncate, dd, losetup,mount和mkfs.ext4创建ext4文件系统来玩。
  • dumpe2fs,tune2fs提供信息
  • dm-setup 组装一个模拟读取错误的虚拟块设备,如下所示:
    $> dmsetup 创建 badsectordevice << EOF
    0 2902 线性 /dev/loop1 0
    2902 2 错误
    2904 17576 线性/dev/loop1 2904
    EOF
    
    如示例所示,块设备扇区为 512,ext4块大小为 1024,因此 LBA 扇区 2902,2903 不可读。