facha Asked: 2013-05-26 12:29:05 +0800 CST2013-05-26 12:29:05 +0800 CST 2013-05-26 12:29:05 +0800 CST 在 lvm 上的 ext3 fs 上按块号查找文件 772 smartd 在我的硬盘驱动器上检测到一个坏块,我想知道那个块属于哪个文件。我在逻辑卷上有 ext3 文件系统。Google 给了我很多教程(比如这个:http ://www.vanderzee.org/bad_blocks_howto )关于当直接在硬盘块设备上创建文件系统时如何通过块号查找文件。他们都没有提到 LVM。在我的案例中,有没有办法通过块号查找文件? lvm 1 个回答 Voted Best Answer Sergey Vlasov 2013-05-26T13:38:41+08:002013-05-26T13:38:41+08:00 如Bad Blocks Howto中所述,找到包含坏块的分区并计算分区内的扇区偏移量。假设分区是/dev/sda3,它是一个 LVM PV。 确定第一个PE的扇区偏移量: pvs -o pe_start --units s /dev/sda3 从坏扇区偏移量中减去这个偏移量,得到第一个 PE 的扇区偏移量。如果结果是否定的,则坏扇区位于 LVM 元数据区域中。 Bad_Offset_from_1st_PE = Bad_Offset_in_Partition - First_PE_Start 运行pvdisplay --maps --units s /dev/sda3获取PV中的segment列表;此输出的“物理卷”部分还将显示“PE 大小”字段。 将第一个 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 在映射中找到包含不良 PE 的段。如果幸运的话,该段可能是空闲的,否则您将看到坏的逻辑卷。如果您对该卷不感兴趣(例如,它是交换空间,或一些您不关心的临时数据),您可以在此步骤停止。该扇区也可能超出最后一个 PE,这意味着它要么在小于完整 PE 的未使用区域,要么在 PV 末尾的第二个元数据区域(如果存在这样的元数据区域)。 如果坏卷是快照,将坏扇区映射到逻辑卷中的实际偏移量将非常困难。如果你真的关心快照内容,你唯一能做的就是尝试从中读取并希望坏扇区尚未被快照使用(如果使用过,希望机器不会完全挂起试图阅读它时)。 如果坏卷在 LVM 级别使用诸如镜像或条带化等奇特的东西……目前不知道如何处理。 计算Bad_LE = Bad_PE - Seg_First_PE + Seg_First_LE,其中Seg_First_PE是坏段的第一个物理范围, 是坏段Seg_First_LE中的第一个逻辑范围,如地图中的段数据所示。 计算逻辑卷内的扇区偏移量: Bad_LV_Offset = (Bad_LE * PE_Size) + Bad_Offset_in_PE 回到Bad Blocks Howto的第二步,找到文件系统中at扇区对应Bad_LV_Offset的文件。
如Bad Blocks Howto中所述,找到包含坏块的分区并计算分区内的扇区偏移量。假设分区是
/dev/sda3
,它是一个 LVM PV。确定第一个PE的扇区偏移量:
从坏扇区偏移量中减去这个偏移量,得到第一个 PE 的扇区偏移量。如果结果是否定的,则坏扇区位于 LVM 元数据区域中。
运行
pvdisplay --maps --units s /dev/sda3
获取PV中的segment列表;此输出的“物理卷”部分还将显示“PE 大小”字段。将第一个 PE(您在步骤 2 中获得)的扇区偏移量除以扇区中的 PE 大小。除法的整数结果将是坏 PE 编号,余数将是该 PE 内的坏扇区偏移量。
在映射中找到包含不良 PE 的段。如果幸运的话,该段可能是空闲的,否则您将看到坏的逻辑卷。如果您对该卷不感兴趣(例如,它是交换空间,或一些您不关心的临时数据),您可以在此步骤停止。该扇区也可能超出最后一个 PE,这意味着它要么在小于完整 PE 的未使用区域,要么在 PV 末尾的第二个元数据区域(如果存在这样的元数据区域)。
如果坏卷是快照,将坏扇区映射到逻辑卷中的实际偏移量将非常困难。如果你真的关心快照内容,你唯一能做的就是尝试从中读取并希望坏扇区尚未被快照使用(如果使用过,希望机器不会完全挂起试图阅读它时)。
如果坏卷在 LVM 级别使用诸如镜像或条带化等奇特的东西……目前不知道如何处理。
计算
Bad_LE = Bad_PE - Seg_First_PE + Seg_First_LE
,其中Seg_First_PE
是坏段的第一个物理范围, 是坏段Seg_First_LE
中的第一个逻辑范围,如地图中的段数据所示。计算逻辑卷内的扇区偏移量:
回到Bad Blocks Howto的第二步,找到文件系统中at扇区对应
Bad_LV_Offset
的文件。