ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

机械硬盘C5/C6坏道维修:Victoria扫描、擦除与重映射流程

机械硬盘C5/C6坏道维修:Victoria扫描、擦除与重映射流程

简介:这份资料包面向遭遇硬盘坏道、读写报错或SMART告警的个人用户与小型办公维护人员,围绕Victoria硬盘检测修复工具及配套教程展开,用于硬盘健康诊断、表面扫描、坏道定位与修复可行性判断。压缩包共18个文件,约2.79MB,内有可执行程序与bin模块、doc和docx图文教程、txt与htm说明文档,以及ini、sys等配置和驱动支持文件,工具运行与学习查阅相对完整。已有2244人学习下载,在轻度硬盘故障自检场景中具有一定参考价值。内容把物理坏道与逻辑坏道的区分、SMART参数解读、扫描结果判断、覆盖标记与簇重分配思路同图文教程结合,并强调修复前备份重要数据、严重故障转专业恢复等边界,适合希望降低送修成本、建立硬盘维护认知的读者按需查阅,也可作为日常巡检和故障初筛的参考。

1. 一块 C5 变黄的旧机械盘,救与不救分界线在哪

开机转圈转了两分钟,任务管理器里磁盘占用 100%,随便点个文件夹都能卡一下。用任何一款 SMART 工具读出来的信息里,C5(Current Pending Sector,待映射扇区)和 C6(Offline Uncorrectable,离线不可纠正扇区)同时亮起黄色,从 0 开始往上跳,这时大部分人的第一反应是换盘。但如果你手上是块还存着数据的机械盘,正确的动作顺序是先判断坏道的性质,再决定是修、是隔离,还是直接拆掉。Victoria 这个软件就是干这件事的:它绕过操作系统,直接朝 ATA 通道发指令,能读 SMART、能按 LBA 逐块做表面扫描、能把待映射扇区通过擦除或重映射处理掉。硬盘坏道维修这一行里,Victoria 硬盘坏道维修软件加上一份讲清楚扫描—判读—处理—复扫的维修教程,比任何“一键修复”按钮都实在。这篇只面向两类人:手上有一两块能通电、有异响以外症状的机械盘想抢救数据的,以及需要给二手盘、退役监控盘做验货判断的。

2. 摸清 Victoria 的底:它到底改了硬盘的什么

先把话说在前面,Victoria 不是数据恢复软件,它不会帮你还原被覆盖的文件,也不会动分区表。它是工作在下边的工具:向硬盘的 ATA 寄存器发指令,读 SMART 属性,发起 READ DMA / WRITE DMA / 擦除命令,然后统计每个 LBA 块返回的耗时和错误码。理解这一层,后面所有参数的取舍才有依据。

2.1 它和常见磁盘工具的分工差别

很多工具只做“读一遍看有没有错”,Victoria 的区别在于扫描结果被量化成了延迟,不是简单的“好/坏”二元结论。同一块盘,读某个 LBA 用了 3ms 和用了 800ms,在 SMART 里都是“读成功”,但对维修判断是完全不同的两件事:3ms 是正常磁道,800ms 说明磁头在这一片反复定位、纠错电路在拼命算,属于“快撑不住了但还没报错”的临界区。

这就决定了它的典型用法——不是查“盘坏没坏”,而是查“盘还剩多少余量、坏道是集中的还是散在的”。常见做法是先用只读扫描把整盘跑一遍,得到一张延迟分布图,再决定要不要动写操作。因为一旦动写,就是不可逆的。

和那些跑在操作系统文件层之上的工具相比,Victoria 走的是物理扇区地址(LBA),不认分区、不认文件系统。好处是分区表损坏、文件系统全乱、甚至全盘被写乱的情况下它照样能扫;代价是它也不会告诉你“这个坏块属于哪个文件”,那是文件系统层的事。

还有一点常被忽略:Victoria 在较老的 4.x 版本上主要面向 ATA/SATA 设备,对 USB 移动硬盘盒的支持取决于盒子里的桥接芯片能不能透传 ATA 命令——很多廉价盒子只做 USB 大容量存储协议转换,Victoria 根本看不到 SMART。较新的 5.x 版本在 NVMe 上能读到一部分 SMART 项,但表面扫描这类操作仍然以 ATA 通道为主。NVMe 固态想做全盘扫描,得换用别的工具组合,这一点不要硬凑。

2.2 三条处理路径:逻辑坏道、待映射扇区、物理坏道

硬盘坏道维修这个词被用得很泛,实际落到操作上只有三条路径,Victoria 分别对应不同功能:

路径适用对象Victoria 里的动作可逆性典型收益
逻辑坏道修复扇区数据本身校验错、磁介质没坏Erase(擦除)/ Write(写零)数据被覆盖,不可逆C5 计数回落,扇区可重新读写
待映射扇区重映射扇区物理损坏,硬盘还有备用扇区勾选 Remap 后扫描写入逻辑上换扇区,不可逆C5 转成 05,坏扇区被备用区顶替
物理坏道隔离坏道成片、备用扇区耗尽记录 LBA 区间,分区时避开不修改盘避免坏道扩大影响可用区

看懂这张表,很多“翻车”就能提前避免。逻辑坏道擦除是成本最低的一步,一块盘如果只是某个区域因为意外断电写坏了一个扇区,一次 Erase 就能让 C5 归零,盘继续用几年都没问题。但如果擦完复扫还是报错,那就不是数据问题了,是磁介质真有损伤。

重映射要理解它的本质:硬盘出厂时在用户可寻址区域之外留了一小片备用扇区(spare sector pool),当某个 LBA 反复读失败,固件会把该 LBA 的映射指向备用区里的一个物理扇区,同时在 SMART 的 05 属性上加一。Victoria 里的 Remap 操作就是主动触发这个机制。注意,备用扇区是有限的,机械盘通常是几百到几千个,用完了就再也没有后悔药,届时 05 属性会顶到阈值,盘进入“只读或报废”状态。所以重映射不是越多越好,它是有限资源。

物理坏道隔离这一条最朴实,也最容易被忽略。当坏道集中在盘片的前若干 GB(很多盘的 0 磁道附近最容易出问题),完全可以用分区工具把这一片划出去不用,剩下的空间继续服役。Victoria 扫描日志里的 LBA 数字,就是给这件事提供依据的。

2.3 上手前的准备:盘序、只读模式、断电保护

真正开始之前有三个动作必须先做,顺序不能反。

第一是确认设备序。接了多块盘的机器上,选错盘然后把 Erase 点下去,是这一行里最经典的灾难。我的习惯是:接盘前先拔掉所有其他非系统盘的数据线,只留待测盘,或者在设备下拉列表里对一遍型号和容量,再对一遍序列号。Victoria 的设备列表里会显示型号和固件版本,容量对不上立刻停手。

第二是把默认操作设成只读。新建扫描任务时先把操作类型选成 Read,不要图省事直接选 Erase。Victoria 的界面里写操作通常需要额外确认,但不同版本的行为不一致,别把自己的安全寄托在弹窗上。

第三是供电和连线。大容量机械盘启动电流不小,用 USB 转接线跑全盘扫描,中途掉盘是常事;台式机尽量走主板原生 SATA 口,电源用独立的一路。这一点在后面的避坑章节还会展开,因为相当比例的“全盘报红”最后查出来都是线和电的问题,跟盘本身没关系。

注意:确认待测盘上没有正在使用的分区、没有挂载中的卷。Windows 对正在被系统占用的卷会拦截写操作,扫描会中途报错,看起来像是硬盘故障。

3. 四段式流程:从只读 Read 到重映射 Remap 怎么跑

这一章是整套流程的主干。把整个维修拆成四段,每段有明确的进入条件和退出条件,任何一段不满足就不要进下一段。这套节奏比“扫一遍看结果”靠谱得多,也是维修教程里最该被固化下来的部分。

3.1 第一段:Read 只读扫描与色块判读

第一段永远是只读。目的不是修,是取证。

打开 Victoria,选中目标盘,操作类型选 Read,设定起始和结束 LBA(默认全盘),块大小先给一个中等值,超时给一个相对宽松的值,然后开始。扫描过程中界面上会滚出一片色块,颜色对应的是这一块的响应耗时,不同版本的分级略有差别,大体是:

颜色大致耗时区间含义处理倾向
浅灰/白< 5 ms正常无需处理
灰5–20 ms轻微偏慢观察
绿20–50 ms明显偏慢记下 LBA 区间
橙50–200 ms重试多次才成功重点关注
红200–500 ms 及以上接近超时高危区
蓝/叉超时或读错误读不出来坏道候选

跑完全盘之后,不要只看“有没有红块”,要看分布。三种典型形态:坏块集中在前 1%–5% 的 LBA 区间,多半是 0 磁道附近的固件区或启动区损伤,这块盘基本可以判死;坏块均匀散布在整盘,通常是磁头或介质整体老化,也不乐观;坏块只在某一两个孤立 LBA 周围出现,周围一片绿,这种是最值得救的,大概率是局部介质损伤,擦除或重映射就能解决。

第一段的退出条件很明确:整盘扫完,记录下报错 LBA 的起止区间、总错误数、红橙块数量,以及扫描平均速度。这几项数据是后面判断的依据,别急着关窗口。日志一定要留,Victoria 支持把扫描结果写日志文件,这个文件后面做前后对比的价值远超你想象。

提示:扫描期间尽量不要在这台机器上跑别的重负载任务。CPU 抢占会影响计时精度,让本来 3ms 的块看起来有 30ms,凭空制造出一片“绿块”,白折腾一轮。

3.2 第二段:Erase 与 Write 写入测试的边界

第二段是第一次动写,也是风险最高的一步。动手前必须确认:盘上数据要么已经备份,要么本来就不需要。

Erase 和 Write 的区别值得说清楚。Erase 是向目标 LBA 区间发擦除命令,把扇区内容清掉;Write 是用 Victoria 自己生成的测试图案覆盖写入。两者都会销毁原有数据,但 Erase 对闪存和机械盘的行为不完全一样,对机械盘来说本质都是重写该扇区。用哪个取决于目的:想验证“这个扇区能不能被正常写入并读回”,Write 更直接;想尽量少扰动、只把校验错的扇区刷一遍,用 Erase。

实际操作我一般这样走:先只对第一段里标红的 LBA 区间做小范围 Erase,范围前后各留一点余量,不要直接全盘。小范围处理完立刻复扫这一段,看红块有没有消失。

如果消失了,说明这部分是逻辑坏道,处理完毕,可以再全盘复扫一遍确认没有新增。如果没消失、甚至红块变多,立刻停止,不要再扩大范围——这时候继续写只会加速备用扇区消耗。

# 示意:把第一段扫描日志里报错的 LBA 区间提取出来,供小范围擦除时填写起止地址 # 日志每行通常形如: LBA: 12345678 Block: 256 Time: 1200ms Error: UNC # 先用 head 看一眼你手上版本的日志长什么样,再改下面的正则 grep -E "Error|UNC|Timeout" victoria_scan_read.log \ | awk '{print $2, $NF}' \ | sort -k1,1n \ | head -50

这段脚本没有任何写操作,只是把只读扫描日志里的错误行挑出来,按 LBA 排序,方便你圈出“坏块密集区”的边界。grep的模式要按你实际日志的字段名改,Victoria 不同版本日志里的错误标记不完全一致,先head -n 20看几行再定正则,别直接抄。head -50是防止一次刷屏太多,你可以去掉它看全部。

全盘 Erase 什么时候用?只有当这块盘确认无数据、且你打算把它彻底翻新时才考虑。全盘擦除的耗时和全盘写入差不多,一块 4TB 的盘跑几个小时很正常,中途断电的后果比不擦更糟——很可能把好好的扇区也写坏。

3.3 第三段:Remap 重映射与 SMART 前后对比

如果小范围 Erase 之后复扫仍然报错,说明这个 LBA 对应的物理扇区确实坏了,进第三段:重映射。

Victoria 里触发重映射的方式通常是在扫描参数里启用 remap 相关选项,然后对目标区间执行写入或扫描,让固件在读失败后把该 LBA 交给备用区。不同版本把这个选项放在不同位置,有的叫 Remap,有的在高级设置里勾选“写入保留区”。这里我不给具体菜单路径,因为版本差异大,给了反而误导;你要找的是界面上带 remap / reassign / spare area 字样的勾选项。

执行前,务必先截图记下当前 SMART 的关键项数值。执行后立刻再读一次 SMART。判读规则很简单:

  • C5 下降、05 上升:正常的重映射发生了,坏扇区被备用区顶替,处理成功。
  • C5 不变、05 不变:写入没触发固件重映射,可能是这块盘不支持主动重映射,或者该 LBA 是被固件标记为不可用的区域,跳过即可。
  • 05 大幅上升、C5 也上升:坏道在扩散,备用区在被快速消耗。这是危险信号,立刻停止所有写操作。

第三步之后一定要做一次全盘 Read 复扫。这一步不是走形式,它的作用是回答“处理之后这块盘整体表现有没有变好”。我见过不少盘,局部重映射成功,但复扫发现原本绿色的区域开始泛黄,说明在一次写操作之后介质状态整体劣化了,这种盘就不要留了。

3.4 命令行跑批与日志归档

机械盘全盘扫描动辄两三个小时,人工盯着不现实。可以把扫描任务做成批处理跑,人该干别的干别的。Victoria 提供命令行执行方式(不同版本参数名有差异,用-h或/?先列一遍自己的参数表),核心是四件事:指定设备、指定操作类型、指定 LBA 范围、指定日志输出。

# 示意:对设备 2 做只读全盘扫描,结果写入带时间戳的日志 # 参数名以你手上版本 -h 输出为准,这里演示的是组装思路而非可直接粘贴的命令 STAMP=$(date +%Y%m%d_%H%M) victoria.exe /dev:2 /read /start:0 /end:7814037167 /log:"scan_read_${STAMP}.log"

这段的重点不是命令行本身,而是日志命名规范。操作类型_时间戳这个命名让你后面能一眼看出“这块盘在几号做过什么”。我的归档习惯是一块盘一个文件夹,文件夹名用“型号_容量_序列号后四位”,里面按时间顺序堆日志,外加一个smrat.txt记录每次操作前后的 SMART 原始输出。半年后回头查某块盘的历史,这个目录结构能省掉大量回忆。

参数部分的含义:/dev是设备序号,在 Victoria 界面里能看到,别用磁盘管理里的磁盘号,两者不一定对应;/start和/end是十进制 LBA,注意有些版本的结束 LBA 是包含的,有些是不包含的,差一个块对全盘扫描影响不大,但对小范围精确定位有影响,跑之前用一个小范围试一下;/log建议给绝对路径,相对路径在不同工作目录下起跑会散落各处。

注意:批处理跑扫描时关掉系统的睡眠和硬盘休眠策略。跑到一半系统把盘挂起,扫描会以一个莫名其妙的超时错误终止,日志看起来像是硬盘出问题了。

4. 参数与判读:块大小、超时、LBA 范围怎么定

同样的盘,参数选得不一样,扫出来的图能差出两个结论。这一章讲清楚每个参数在影响什么,以及什么情况下该往哪边偏。

4.1 块大小与超时的取舍

块大小(Block Size)指的是每次读写命令覆盖多少个扇区,单位是扇区数,常见取值从 1 到 2048。它的影响是双向的:

块调小,定位精度高,能精确到单个扇区,但命令数量暴增,扫描时间成倍拉长,而且频繁的小 IO 会让硬盘本身的表现失真——机械盘磁头在相邻磁道间来回切换的开销被放大了。块调大,扫描快,但一块 2048 扇区(1MB)的范围里只要有一个坏扇区,整块都会被标红,你无法知道坏道具体在哪,后续小范围擦除就没法精确定位。

我的取值习惯是两遍走:第一遍用较大的块(比如 1024 或 2048)快速扫全盘,目的是找区间,两三小时出结果;第二遍把第一遍标红的区间单独拿出来,用小块(比如 8 或 16)慢扫,目的是定边界。两遍加起来的总时间未必比一遍小块全扫多,但拿到的信息量差很多。

超时(Timeout)这个参数更容易被误解。它指的是单次命令最多等多久,超过了就判定为超时错误。设得太小,本来能靠重试读出来的弱扇区会被直接判成坏块,凭空造出一片假红;设得太大,真坏块会卡很久,整盘扫描时间失控。折中的思路是:第一遍全盘扫描给一个宽容的值(比如 1000–2000ms 量级),把“还能读但很慢”的块也纳入统计;第二遍精扫时再收紧,看这些块在严格条件下到底能不能过。两遍结果的差值本身就是一个信息——在宽松条件下能读、严格条件下读不出来的块,属于“临界坏道”,处理优先级高于彻底读不出来的块,因为它在消耗磁头和纠错电路。

还有一个容易被忘记的选项是错误重试次数和“忽略读取错误”。测盘的时候一般不该忽略,忽略掉等于把坏块当好的;但如果盘上还有重要数据、你只想快速摸一遍整体状况,临时开一下能显著缩短时间,事后记得关掉。

4.2 LBA 范围、分区位置与“前快后慢”

LBA 是逻辑块地址,从 0 开始,机械盘的 LBA 0 在最外圈。这一点决定了机械盘的扫描速度曲线:外圈线速度快,内圈线速度慢,所以同一块盘从 LBA 0 扫到末尾,前半段速度明显高于后半段,这是物理特性,不是故障。很多人第一次看到扫描速度从 180MB/s 一路掉到 80MB/s,误以为盘要坏了,其实是正常现象。

真正需要警惕的是速度曲线上的突变。正常的曲线是平滑下降,中间偶尔有小的抖动。如果曲线在某个点 abrupt 掉底,然后在低位徘徊,那是坏道集中区;如果曲线呈锯齿状反复升降,多半是磁头定位不稳或者供电不足。

设定 LBA 范围的场景主要有三类。一是只测某个分区对应的区间,比如你怀疑系统盘前面 100GB 有问题,就只扫这一段,省时间;二是复扫验证,处理完只扫被处理的那一段;三是跳过已知的坏道密集区,直接看剩余区域的表现。第三类要谨慎,跳过不等于不存在,只是暂时不看。

在算 LBA 和分区对应关系时,1 个扇区 512 字节(部分新盘是 4096 字节,Victoria 一般会显示出来),1GB 约等于 2097152 个 512 字节扇区。这个换算不精确但够用,做区间估算时别拿它当精确值。

4.3 SMART 里决定去留的几个值

扫描图告诉你“现在怎么样”,SMART 告诉你“固件自己怎么想”。两者结合才能下结论。

ID属性名关注点危险信号
05Reallocated Sectors Count已重映射扇区数数值不为 0 且在增长
C5Current Pending Sector Count等待重映射的扇区数持续大于 0,复扫不降
C6Offline Uncorrectable离线扫描不可纠正与 C5 同步上涨
BBReported Uncorrectable Errors上报给主机的错误出现即说明有扇区彻底读不出
C7UDMA CRC Error Count接口传输校验错上涨说明线材/接口问题,不是坏道
B8End-to-End Error端到端校验错缓存或链路问题
09Power-On Hours通电时间参考价值,结合其他项判断

判读的关键在趋势,不在单次数值。一块盘的 05 是 8,三个月前也是 8,那它稳定;一块盘的 05 上周是 0,今天是 8,那它在恶化。所以每次操作前后都要存一次 SMART 原始输出,手动抄也行,用工具导出也行,重要的是留痕。

C7 这一项要单独拎出来说,因为它太容易被误判成坏道。UDMA CRC 错误涨,说明数据在 SATA 线缆上传输时校验失败,绝大多数情况是线的问题、接口氧化、或者供电不稳,跟盘片没关系。见过太多人看到 C7 涨就开始跑全盘擦除,纯属白折腾。正确动作是换线换口再看。

提示:SMART 的阈值(Threshold)一栏不要当成“健康分”看。它只是厂商设定的“低于此值即视为失效”的线,很多盘的 05 阈值是 36,意味着你要重映射三十多个扇区它才报警,但这不代表 35 就是安全的。

5. 避坑与排查:五条真实踩过的坑

下面这五条,每一条都能让人白干半天。按“现象—原因—解决”的顺序写,遇到类似症状可以直接对号入座。

5.1 全盘扫出一片红,换台机器就好了

现象:一块在别的机器上还算正常的盘,接到当前机器上用 Victoria 全盘扫描,从第一个 LBA 开始就大量橙块红块,平均速度只有正常值的三分之一。

原因:九成是链路问题。SATA 数据线老化、接口氧化、用了 USB 转接线或廉价硬盘盒、电源供电不足导致盘在负载下电压跌落。这些都会表现为“读得出来但很慢”,在延迟统计里就是一片橙红。还有一种情况是主板的 SATA 口工作在兼容模式或者被其他设备抢占带宽。

解决:换一根新 SATA 线、换一个主板原生口、换一路电源接口,重新扫。如果换了还是这样,把盘接到另一台机器上验证一次。只有在两套独立硬件上都复现同样的分布,才轮到怀疑盘本身。这一步不做,后面所有的擦除重映射都是基于错误前提在操作。

5.2 Erase 之后 C5 归零,C6 却涨了

现象:对小范围红块做 Erase,复扫果然干净了,SMART 里 C5 从 8 变 0,但 C6 从 0 变成了 3,操作者以为把盘搞坏了。

原因:这是重映射发生的正常伴生现象。擦除过程中固件发现这些扇区写不进去,把它们标记为不可纠正并转入备用区,C5(待定)转成 C6(离线不可纠正)和 05(已重映射)。数值变化本身就证明处理生效了。

解决:不要慌,看 05 有没有同步上涨。05 涨了、且涨的数量和 C6 大致对得上,说明就是正常重映射,继续观察即可。真正要担心的是 05 在一次操作里暴涨几十上百,那说明坏道在成片扩散,备用区消耗速度不可接受,这块盘该退役了。

5.3 擦完全盘,系统装不上了

现象:为了“彻底翻新”对整块盘做了全盘 Erase,之后用 U 盘装系统,安装程序报错找不到可用磁盘,或者分区工具里显示的容量不对。

原因:Erase 是按 LBA 区间擦的物理扇区,不认分区表。全盘擦除会连 MBR/GPT 头、分区表、引导记录一起清掉。对操作系统来说,这盘现在是“未初始化”状态,某些主板 BIOS 在检测到没有有效分区表的盘时行为也不一样。

解决:这不是故障,是预期行为。用磁盘管理或分区工具重新初始化磁盘(GPT 或 MBR 按你的引导方式选)、新建分区、格式化,然后装系统。真正该反思的是操作前没想清楚:全盘擦除只应该用在确认无数据、且明确要重新分区的盘上。有数据的盘,哪怕是坏道盘,也应该先做镜像再做任何写操作。

5.4 扫描速度异常快,几百 MB/s,一看就不对

现象:一块机械盘,Victoria 显示扫描速度三四百 MB/s,比正常值高出一大截,扫完还全是灰块,一点问题都没有。

原因:几种可能。一是扫描对象根本不是机械盘,是 SSD,SSD 的随机读延迟本来就低,全盘顺序扫速度高很正常;二是块大小设得太大,读的是缓存命中;三是设备选错了,扫的是一个内存盘或者虚拟盘;四是某些桥接芯片会把读取请求在缓存层拦下来。

解决:先核对设备型号和容量,确认扫的是不是你以为的那块盘。再核对块大小和是否开启了某种缓存选项。对 SSD 来说,Victoria 的色块判读逻辑和机械盘完全不同——SSD 有磨损均衡,坏块由主控在后台用预留块替换,你在表面扫描里很难看到直接证据,真正该看的是 SMART 里的介质磨损指标和可用备用块百分比。拿机械盘那套“看红块”的方法套 SSD,结论没有意义。

5.5 重映射做完,05 顶到阈值,盘直接不认了

现象:连续对多个坏块区间做重映射,做完之后 SMART 的 05 达到或超过阈值,硬盘在 BIOS 里还能看到,但系统里访问极慢甚至报错。

原因:备用扇区池被耗尽。前面说过,机械盘的备用区是有限的,一旦用光,固件没有可替换的物理扇区,任何一次读失败都无法被掩盖,盘进入降级状态。更糟的是,有些盘的固件在这种状态下会锁盘,只允许读取不允许写入。

解决:这一步没有后悔药,只能事前预防。规矩是:同一次维修里,重映射的扇区数量要设上限。我一般把单次处理控制在几十个扇区以内,超了就停下来评估——坏道数量到了这个量级,说明介质老化已经比较严重,与其继续榨备用区,不如把盘上的数据完整镜像出来换盘。另外,处理前先看一眼 05 当前值和阈值的差距,剩余余量不足一半的盘,直接放弃重映射这条路。

6. 进阶:把日志画成曲线,判断这块盘还能留多久

跑完前面四段流程,多数人卡在最后一步:SMART 看着还行,扫描也处理过了,这盘到底能不能继续用?我的做法是不看单次结论,看曲线。

Victoria 的扫描日志里,每一行都带着 LBA 和耗时。把这些数据抽出来,按 LBA 排序,画一条“LBA—耗时”的散点图,很多在色块界面上看不出来的东西会浮现出来。比如:坏块是不是集中在某个连续的 LBA 区间(集中型损伤,可隔离),还是每隔几十万 LBA 就冒一个(散布型,磁头或介质整体问题);处理前后的两条曲线叠在一起,红色区域是变窄了还是变宽了。

import re import pandas as pd import matplotlib.pyplot as plt # 日志格式因版本而异,先 head 看几行再改正则 pattern = re.compile(r"LBA[:\s]+(\d+).*?(\d+)\s*ms", re.IGNORECASE) rows = [] with open("scan_read_before.log", encoding="utf-8", errors="ignore") as f: for line in f: m = pattern.search(line) if m: rows.append({"lba": int(m.group(1)), "ms": int(m.group(2))}) df = pd.DataFrame(rows).sort_values("lba") # 抽样,几百万个点直接画会把内存打爆 df = df.iloc[::max(1, len(df) // 200000)] plt.figure(figsize=(14, 5)) plt.scatter(df["lba"], df["ms"], s=0.3, alpha=0.4) plt.yscale("log") # 用对数轴,3ms 和 3000ms 才看得见彼此 plt.xlabel("LBA") plt.ylabel("latency (ms, log scale)") plt.tight_layout() plt.savefig("latency_map.png", dpi=150)

这段脚本做三件事:用正则从日志里抓 LBA 和耗时、按 LBA 排序、画成对数纵轴的散点图。几个参数值得说明:iloc[::n]那个抽样步长是关键,日志动辄几百万行,全量画图会卡死,抽到二十万个点已经足够看出形态;plt.yscale("log")不能省,正常块是 3ms 量级、坏块是 3000ms 量级,线性轴下正常块会全部压成一条贴着底边的线,什么都看不见;alpha给小一点,重叠区域能看出密度。

图形出来之后看三件事。第一看形态:是一条平缓下降的带子(正常,外圈快内圈慢),还是中间有若干垂直的“柱子”(坏块,且是孤立的),还是有整段整段的抬升(区域性劣化)。第二看位置:如果所有异常都落在 LBA 0 到某个值之间,隔离这一片就还能用;如果异常均匀铺满全盘,别犹豫了。第三看前后对比:把处理前和处理后的两张图并排放,处理后的曲线如果整体抬高了哪怕一点点,说明这次写操作让盘的状态变差了,这种盘留着就是给自己埋雷。

我一般的判断线是:处理后复扫,橙块以上数量降到处理前的 30% 以内、且没有新增的孤立红块、05 属性在处理后 24 小时内不再增长,三条同时满足才算过关。少一条就进入“只读归档、不再写入”的模式。

血泪经验是有一年图省事,一块盘重映射完看着干净就直接塞回机器当备份盘,三个月后它在一个深夜安静地掉线,备份自然也没了。从那以后我每次做完重映射,都强制走一遍“复扫 + 48 小时挂机观察 + 再读一次 SMART”这条路,哪怕多花两天时间。坏道这个东西不会自己变好,它只会从一个扇区变成一片扇区,早一点认输,数据就早一点安全。

希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进