在 lvm 上的 ext3 fs 上按块号查找文件

fac*_*cha 7 ext3 lvm bad-blocks

smartd 在我的硬盘上检测到一个坏块,我想知道该块属于哪个文件。我在逻辑卷上有 ext3 文件系统。谷歌给了我很多教程(比如这个:http : //www.vanderzee.org/bad_blocks_howto),当文件系统直接在硬盘块设备上创建时,如何按块号查找文件。他们都没有提到 LVM。在我的情况下,有没有办法按块号查找文件?

Ser*_*sov 10

  1. 如坏块方法中所述,找到包含坏块的分区并计算该分区内的扇区偏移量。假设分区是/dev/sda3,并且它是一个 LVM PV。

  2. 确定第一个 PE 的扇区偏移:

    pvs -o pe_start --units s /dev/sda3
    
    Run Code Online (Sandbox Code Playgroud)

    从坏扇区偏移量中减去这个偏移量,得到第一个 PE 的扇区偏移量。如果结果是否定的,则坏扇区在 LVM 元数据区域中。

    Bad_Offset_from_1st_PE = Bad_Offset_in_Partition - First_PE_Start
    
    Run Code Online (Sandbox Code Playgroud)
  3. 运行pvdisplay --maps --units s /dev/sda3获取PV中的segment列表;此输出的“Physical Volume”部分还将显示“PE Size”字段。

  4. 将第一个 PE(您在步骤 2 中获得的)的扇区偏移量除以扇区中的 PE 大小。除法的整数结果将是坏 PE 编号,余数将是该 PE 内的坏扇区偏移量。

    Bad_PE           = Bad_Offset_from_1st_PE / PE_Size
    Bad_Offset_in_PE = Bad_Offset_from_1st_PE % PE_Size
    
    Run Code Online (Sandbox Code Playgroud)
  5. 在映射中找到包含坏 PE 的段。如果幸运的话,该段可能是空闲的,否则您将看到错误的逻辑卷。如果您对卷不感兴趣(例如,它是交换卷,或者您不关心的一些临时数据),您可以在这一步停止。该扇区也可能超出最后一个 PE,这意味着它要么位于小于完整 PE 的未使用区域,要么位于 PV 末尾的第二个元数据区域(如果存在此类元数据区域)。

    如果坏卷是快照,将坏扇区映射到逻辑卷中的实际偏移量将非常困难。如果你真的关心快照内容,你唯一能做的就是尝试从中读取并希望快照尚未使用坏扇区(如果使用了,希望机器不会完全挂起尝试阅读时)。

    如果坏卷在 LVM 级别使用了一些奇特的东西,例如镜像或条带化……目前不知道如何处理。

  6. 计算Bad_LE = Bad_PE - Seg_First_PE + Seg_First_LE,其中Seg_First_PE是坏段的第一个物理范围,是坏段Seg_First_LE中的第一个逻辑范围,如映射中的段数据所示。

  7. 计算逻辑卷内的扇区偏移:

    Bad_LV_Offset = (Bad_LE * PE_Size) + Bad_Offset_in_PE
    
    Run Code Online (Sandbox Code Playgroud)
  8. 返回到坏块指南的第二步,找到与文件系统中的扇区对应Bad_LV_Offset的文件。