如何确定哪个分区有坏块?

如何确定哪个分区有坏块?

我有以下设备:

型号系列:Western Digital Caviar Green(AF)
设备型号:WDC WD15EARS-00MVWB0
序列号:WD-WCAZA3607921
LU WWN 设备 ID:5 0014ee 2b01eac3e
固件版本:51.0AB51
用户容量:1,500,301,910,016 字节 [1.50 TB]
扇区大小:512 字节逻辑/物理
设备位于:在 smartctl 数据库中 [有关详细信息,请使用:-P show]
ATA 版本为:ATA8-ACS(未标明小修订)
SATA 版本为:SATA 2.6,3.0 Gb/s
当地时间是: 星期四 十一月 21 00:08:20 2013 CET
SMART 支持:可用 - 设备具有 SMART 功能。
SMART 支持:已启用

最近我在读取此磁盘的表面时遇到错误。错误如下:

完整错误日志:
SMART 错误日志版本:1
ATA 错误计数:25(设备日志仅包含最近的五个错误)
    CR = 命令寄存器 [十六进制]
    FR = 功能寄存器 [HEX]
    SC = 扇区计数寄存器 [HEX]
    SN = 扇区号寄存器 [HEX]
    CL = 气缸低位寄存器 [HEX]
    CH = 气缸高寄存器 [HEX]
    DH = 设备/头寄存器 [HEX]
    DC = 设备命令寄存器 [HEX]
    ER = 错误寄存器 [十六进制]
    ST = 状态寄存器 [HEX]
Powered_Up_Time 从通电开始测量,并打印为
DDd+hh:mm:SS.sss 其中 DD=天,hh=小时,mm=分钟,
SS=sec,sss=millisec。49.710 天后“结束”。

磁盘开机时发生错误25 寿命:18798小时(783天+6小时)
  当导致错误的命令发生时,设备处于活动状态或空闲状态。

  命令完成后,寄存器:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  40 51 08 00 40 37 e6 错误:LBA 处的 UNC 8 个扇区 = 0x06374000 = 104284160

  导致发生错误的命令是:
  CR FR SC SN CL CH DH DC 上电时间 命令/功能名称
  -- -- -- -- -- -- -- -- -- ---------------- --------------------
  c8 00 08 00 40 37 e6 08 08:54:35.771 读取 DMA
  ec 00 00 00 00 00 a0 08 08:54:35.763 识别设备
  ef 03 46 00 00 00 a0 08 08:54:35.763 设置功能 [设置传输模式]

这是第 25 个错误,但之前的错误完全相同。

以下是一份智能报告:

SMART 属性数据结构修订号:16
供应商特定的 SMART 属性及阈值:
ID# ATTRIBUTE_NAME 标志值 最差阈值类型 已更新 WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate 0x002f 200 200 051 预失败始终 - 1
  3 Spin_Up_Time 0x0027 253 189 021 始终预故障 - 2066
  4 启动停止计数 0x0032 099 099 000 Old_age 始终 - 1118
  5 Reallocated_Sector_Ct 0x0033 200 200 140 预故障始终 - 0
  7 Seek_Error_Rate 0x002e 200 200 000 Old_age 始终 - 0
  9 通电时间 0x0032 075 075 000 老化时间 始终 - 18833
 10 Spin_Retry_Count 0x0032 100 100 000 Old_age 始终 - 0
 11 校准重试计数 0x0032 100 100 000 Old_age 始终 - 0
 12 Power_Cycle_Count 0x0032 099 099 000 Old_age 始终 - 1101
192 Power-Off_Retract_Count 0x0032 200 200 000 Old_age 始终 - 277
193 Load_Cycle_Count 0x0032 085 085 000 Old_age 始终 - 346753
194 温度_摄氏度 0x0022 122 109 000 Old_age 始终 - 28
196 Reallocated_Event_Count 0x0032 200 200 000 Old_age 始终 - 0
197 Current_Pending_Sector 0x0032 200 200 000 Old_age 始终 - 1
198 Offline_Uncorrectable 0x0030 200 200 000 Old_age 离线 - 2
199 UDMA_CRC_Error_Count 0x0032 200 196 000 Old_age 始终 - 11
200 Multi_Zone_Error_Rate 0x0008 200 200 000 Old_age 离线 - 1

所以,它还不是一个糟糕的行业,但我认为它会成为一个糟糕的行业。

该驱动器上有 7 个分区,问题是我不知道扇区在哪里、哪个分区或/以及从磁盘开头开始的哪个 MiB、KiB 等。有办法解决吗?

答案1

我找到了解决方法。智能报告中的以下行确定了 LBA:

40 51 08 00 40 37 e6 错误:LBA 处的 UNC 8 个扇区 = 0x06374000 = 104284160

因此,它是 104284160。如果我们知道这一点,我们也知道涉及哪个分区:

根:〜#fdisk -lu / dev / sda
设备启动开始结束块ID系统
...
/dev/sda3 99610624 1466798079 683593728 83 Linux

要确定第三个分区的具体位置:

104284160-99610624=4673536

我们还必须知道块大小:

# tune2fs -l /dev/mapper/crypt_data | grep Block
区块数量:170897920
区块大小:4096
每组块数:32768

现在我们可以使用以下公式确定哪个文件系统块包含此 LBA:

   b = (整数)((LS)*512/B)
在哪里:
b = 文件系统块号
B = 文件系统块大小(以字节为单位)
L = 坏扇区的 LBA
S = 分区的起始扇区,如 fdisk -lu 所示。
并且 (int) 表示整数部分。

就我的情况来说,应该是:

b = (整数)((104284160-99610624)*512/4096
号码=584192

现在我们必须检查那里是否有一个文件:

# 调试文件系统
debugfs 1.42.8(2013 年 6 月 20 日)
debugfs:打开/dev/mapper/crypt_data
调试文件:testb 584192
区块 584192 已标记为正在使用
调试:icheck 584192
块 Inode 号
584192 37486656
调试:ncheck 37486656
Inode 路径名
37486656 /一些/文件

基本上就是这样。现在我必须手动重新分配扇区。有关如何操作的更多信息,您可以查找这里

相关内容