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

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

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

答案1

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

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

    pvs -o pe_start --units s /dev/sda3
    

    用坏扇区偏移量减去该偏移量,即可得到距第一个 PE 的扇区偏移量。如果结果为负数,则表示坏扇区位于 LVM 元数据区域。

    Bad_Offset_from_1st_PE = Bad_Offset_in_Partition - First_PE_Start
    
  3. 运行pvdisplay --maps --units s /dev/sda3以获取 PV 中的段列表;此输出的“物理卷”部分还将显示“PE 大小”字段。

  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
    
  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
    
  8. Bad_LV_Offset返回 Bad Blocks Howto 的第二步,查找与文件系统中的扇区相对应的文件。

相关内容