![如何确定哪个分区有坏块?](https://linux22.com/image/1386857/%E5%A6%82%E4%BD%95%E7%A1%AE%E5%AE%9A%E5%93%AA%E4%B8%AA%E5%88%86%E5%8C%BA%E6%9C%89%E5%9D%8F%E5%9D%97%EF%BC%9F.png)
我有以下设备:
型号系列: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 /一些/文件
基本上就是这样。现在我必须手动重新分配扇区。有关如何操作的更多信息,您可以查找这里。