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

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

  1. 如Bad Block Howto中所述,find包含坏块的分区并计算分区内的扇区偏移量。 假设分区是/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 pvdisplay --maps --units s /dev/sda3列表; 该输出的“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 
  5. 在地图上find包含坏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 Block Howto,find与文件系统中的Bad_LV_Offset扇区对应的文件。