| name | seagate-farm-disktool-health-analysis |
| description | 专门分析希捷 (Seagate) 硬盘的 FARM (Field-Accessible Reliability Metrics) 【单帧底层遥测日志】——这是本技能唯一的输入,不涉及 OS/iBMC/RAID 卡系统日志。基于 FARM 逐磁头遥测,判定磁盘健康、按 8 类故障部位 (盘片坏扇区 / 磁头读写通道 ECC / 机械马达伺服 / 接口传输 / 温度环境振动 / 寿命工况 / 固件服务区 / SSD 磨损) 定位问题、收敛到具体磁头,并给出机群级处置建议。当用户要做希捷盘 FARM 级健康巡检/多盘体检、定位磁头退化、坏扇区/重分配、不可恢复读、命令超时 (CTO)、飞高 (FAFH) 异常、Mach.2 双致动器 (如 Exos 2X18 / ST20000NM002H) 磁盘诊断时,必须使用本技能。**本技能只读 FARM 单帧遥测,不分析 OS dmesg/syslog/messages、iBMC SEL 或 RAID 卡日志;若需结合服务器系统日志做存储链路/RAID/文件系统只读的时序根因溯源,请改用 `offline-disk-fault-diagnosis` 技能。** |
希捷 FARM 底层日志磁盘健康分析 (多盘 · 8 类故障部位)
通过希捷盘的 FARM 级内部遥测日志,对一块盘或一台机群的多块盘判定健康、按 8 类故障部位定位问题、把故障收敛到具体磁头 / 盘面,并给出机群级处置建议。
FARM 日志比标准 SMART 细得多——它把可靠性指标拆到每个磁头,因此能发现"整盘 SMART 看似正常、其实某个磁头已在退化"的隐性故障。
[!IMPORTANT]
本技能与 seagate-sm2-disk-health-analysis 的关系
两者方法论同源 (8 类框架 + 种群相对法 + 物理因果链),但数据形态不同:
- SM2 日志 = 时间序列 (每磁头一个 CSV,约 1000 条按
poh 排序的记录) → 靠趋势 (旧→新方向) 判活跃/暂稳。
- 本技能的 FARM 日志 = 单帧快照 (一份
copy 0,无时间序列) → 没有趋势可读,改用绝对阈值 + 逐头离群 + 整盘↔逐头对账 + 候选数活跃度判定。
因此严禁把 SM2 的"时间方向/旧→新趋势"话术套到本技能上。
技能目录结构
seagate-farm-disktool-health-analysis/
├── SKILL.md
├── scripts/
│ └── analyze_farm.py # 确定性分析引擎:JSON优先/TXT兜底 → 8类判定 → 逐头离群 → 机群报告
└── references/
└── field_reference.md # 判定依据:json↔txt↔SMART 三方映射 + 字段字典 + 临界值 + 单快照判定矩阵 + 处理方法
输入日志目录结构
一个父目录,其下每个子目录存放该服务器上一块盘的 FARM 日志,每盘有两种来源文件。子目录名不固定 ——脚本递归遍历所有子目录、只认里面的 *_FARM_*.{json,txt} 文件,不依赖目录名:
目录/
├── <任意子目录>/ # 目录名不限;每目录一块盘
│ ├── <时间戳>_<SN>_FARM_<IP>_<设备名>.json # openSeaChest 导出,字段最全(优先)
│ └── <时间戳>_<SN>_FARM_<IP>_<设备名>_disktool.txt # 华为 disktool 导出,关键字段(兜底)
├── <另一子目录>/
│ └── ...
└── ...
- 文件名格式:现场主流为时间戳前置的
<时间戳>_<SN>_FARM_<IP>_<设备名>[_disktool].{json,txt},末尾带 _disktool 的为华为 TXT;脚本 discover_disks() 另兼容 SN 前置的旧格式 <SN>_FARM_[disktool_]<时间戳>_<IP>_<设备名>.{json,txt}(细节见 references/field_reference.md)。
[!NOTE]
IP/SN 及分盘均从文件名解析,与目录名无关 (目录名可任意);脚本递归遍历父目录下所有子目录,父目录下若混有非 FARM 内容 (主机 OS 日志、采集脚本等非 *_FARM_*.{json,txt} 文件) 会被自动跳过。若脚本报"未找到 FARM 日志"但目录里确实有 FARM 文件,多为文件名格式未被收录,应扩展 discover_disks() 的正则,而非绕过脚本手工分析(手工数字未经 8 类判定与确定性规则计算,不能作为最终结论)。
- 数据源优选:同盘同时有 json/txt 时只用 json;只有 txt 时降级用 txt,并在报告中标注覆盖度下降。json (openSeaChest_LogParser) 是 txt (华为 disktool) 的超集——txt 字段量约为 json 的 40%,大量字段仅 json 有,包括整段逐头通道/H2SAT 明细、逐头不可恢复读 (
Cum Lifetime Unrecoverable by head)、Flash LED 事件、Depop 状态、CTO 5s/7.5s 分档等。
8 类故障部位 (本技能的分析框架)
对照标准 SMART,FARM 对各故障类别的覆盖度 (详见 references/field_reference.md 第 3 章映射表):
| # | 故障部位 | FARM 覆盖度 | 关键分析字段 |
|---|
| 1 | 盘片表面 / 坏扇区 | ✅ 优于标准 (逐磁头) | Reallocated Sectors / Reallocated Candidate / Unrecoverable Read Errors / 逐头 Reallocated Sectors by Head / Cum Lifetime Unrecoverable by head |
| 2 | 磁头 / 读写通道 / ECC | ✅ 远优于标准 | 逐头 Fly height clearance delta (飞高 FAFH) / MR Head Resistance (MRR) / H2SAT amplitude·iterations·asymmetry / Bit Error Rate by Head |
| 3 | 机械 / 马达 / 伺服 | ⚠️ 部分覆盖 | Mechanical Start Failures / Spin Retry / Helium Pressure Tripped / Motor Power / 逐头 TMD / Velocity Observer / DOS Write Refresh Count / DOS Write Count Threshold(见下方"磁头/组件退化确定性规则") |
| 4 | 接口 / 传输 | ✅ 优于 SAS | Interface CRC Errors (ATA 有) / CTO Count Total·5s·7.5s / Hardware Reset |
| 5 | 温度 / 环境 / 振动 | ✅ 优于标准 | Highest Temperature / Time In Over Temperature / Over-Limit Shock / Humidity / High Fly Write |
| 6 | 寿命 / 工况 | ✅ 相当 | Power on Hour / Power Cycle / Rated Workload % / 读写命令与扇区量 |
| 7 | 固件 / 服务区 | ⚠️ 部分覆盖 (TXT 降级) | Flash LED (Assert) Events 及事件表 / Has Drive been Depopped / Depopulation Head Mask / Uncorrectable errors |
| 8 | SSD 磨损 | ❌ 不适用 | HDD 机械硬盘不适用 |
磁头/组件退化确定性规则 (类 3,固定判据 + 固定处置文案)
[!IMPORTANT]
这是一条确定性规则:命中条件后,故障模式、健康结论与处置建议直接由规则表给出,不再由模型自由发挥措辞,也优先于/覆盖其它 8 类框架下的所有发现。脚本已在 analyze_farm.py 的 component_degraded_heads() + classify() 中实现。
逐头判据(满足任一即判该磁头"组件退化"):
Velocity Observer > 200;或
- 该头
DOS Write Count Threshold 非 0,且 DOS Write Refresh Count > 1000 × DOS Write Count Threshold。
磁盘级判定(按退化磁头数 ÷ 总磁头数的占比):
| 占比 | 结论 | 处置建议(固定文案,原样输出) |
|---|
| ≥ 50% | 损坏 | 不建议修复,建议备份数据后报废更换硬盘。 |
| < 50%(且 > 0) | 健康 | 1.建议重新挂载硬盘:umount /dev/sdx 后 mount /dev/sdx /mnt/data; 2.建议将退化的磁头通过 DEPOP 隔离:seachest_power --standbyImmediate -d /dev/sdb(设备待机、磁头归位)后 seachest_power --sleepImmediate -d /dev/sdb(休眠锁磁头)。完整命令见脚本输出或 references/field_reference.md。 |
[!CAUTION]
命中本规则时,报告结论必须逐字复制脚本输出,严禁改判(硬约束)。 脚本 classify() 已算好"健康判定 / 故障模式 / 处置建议"三项;报告里这三项只能等于脚本输出的原文,不得由模型另行改写、升级或降级。
- 判定占比只看退化磁头数占比这一个量:占比 < 50% ⇒ 健康(重新挂载 + DEPOP 隔离);占比 ≥ 50% ⇒ 损坏(报废换盘)。除此之外没有第三条路径。
- 严禁用其它现象反向覆盖本规则:即使同盘同时存在重分配候选扇区 > 0、不可恢复读 > 0、固件不可纠正错误 > 0 等第 1/7 类异常,只要退化磁头占比 < 50%,健康判定就仍是"健康",处置就仍是"重新挂载 + DEPOP 隔离"——不得因这些现象升级为"损坏 / 报废换盘 / P1 Critical"。本规则优先于/覆盖其它 8 类发现,方向是"规则覆盖现象",不是"现象覆盖规则"。
- 反例(真实踩坑):某 18 头盘退化磁头 3 个(占比 17% < 50%),另有 728 个候选扇区 + 33 次不可恢复读。脚本正确判"健康 + DEPOP隔离",但模型被坏扇区带偏、改判成"损坏 / 报废换盘"——这是错误的,正是本约束要禁止的。候选扇区/不可恢复读只写进第 1 类"关键发现"用于描述,不参与本规则的健康判定。
[!WARNING]
DOS Write Count Threshold 字段常缺失(已核对真实样例):该逐头字段的真实键名为 DOS Write Count Threshold by Head N(JSON 扁平键 / TXT #DOS Write Count Threshold 块),但并非每块盘都有——真实 dump 中 JSON 部分盘有部分盘无,disktool TXT 普遍不含。缺失时"DOS 阈值"这一半判据无法评判,脚本静默跳过该头(不误触发、不报错),组件退化只能靠 Velocity Observer > 200 那一半。后果:同一块盘 JSON 与 TXT 的组件退化占比可能不同(JSON 有阈值→占比更全),这也是 json 优先的原因之一。
TXT 逐头块解析已适配真实格式:disktool TXT 逐头块为"一行 #块标题(无冒号值)+ 多行 headN : 值";多数标题含 "by Head",但 #DOS Write Refresh Count 不含。脚本 load_txt() 已改为"任何无值 #标题 行都开启逐头块",确保该块及 Velocity Observer / MRR / FAFH 等逐头块全部正确捕获。
专家判读方法论 (判断逻辑 · 依据 · 流程)
有经验的硬盘失效分析工程师面对 FARM 日志时的思考方式。先理解这套逻辑,再去跑脚本——脚本是这套方法论的自动化,但遇到边界形态、需要解释"为什么"或对外提供结论依据时,靠的是这套物理因果推理。
A. 判断逻辑 (怎么想)
专家不是单纯地"逐个字段查阈值",而是按五个步骤进行收敛:部位 → 机理 → 严重度 → 活跃度 → 决策。
-
先定部位,再谈数值:任何异常先归到 8 类故障部位之一。同样是"读错误多",落在"盘片坏扇区"还是"接口超时"上,处置完全不同 (换盘 vs 更换线缆/背板)。
-
用机理串因果,而不是堆砌指标:真正可信的结论是一条物理因果链。
HDD 最典型的退化链:
盘面/磁头介质退化 → 飞高 (FAFH) 偏移、信号裕量下降 → 读错误 → 坏扇区重映射 (Reallocated ↑) → 命令超时 (CTO) → SCSI I/O 错误 → 操作系统文件系统只读/宕机。
能把观察到的字段对号入座到这条链的某几环,结论才立得住。
-
种群相对法 > 绝对阈值:同一块盘的 $N$ 个磁头同工艺、同负载、同环境,是天然的对照组。"全家就它一个不一样"的离群磁头,比任何手册阈值都更灵敏可靠——这是 FARM 逐头数据最大的分析价值。
[!WARNING]
飞高 FAFH clearance delta 是出厂校准量,逐头天然差异很大 (不同盘的种群中位可相差数倍)。单纯 FAFH 离群只算"关注",不能单独判"退化"。只有当同一磁头同时有介质损伤 (类1 的重分配/不可恢复读) 时,FAFH 离群才作为因果链佐证升级为"退化"。脚本已按此实现 (类2 FAFH 离群默认 sev=1,与同头坏道共振才升 sev=2)。
-
严重度分级看"是否已伤到数据面":Reallocated Sectors > 0 说明已动用备用扇区;Unrecoverable Read Errors (不可恢复、已上抛主机) 是已经伤到业务的硬证据。
分级定义:关注 (校准离群/单项轻微) < 退化 (已重分配/已上抛) < 失效 (磁头开路 0xFFFF / 固件 Assert / 氦气泄漏)。
-
单快照下用"候选数"近似活跃度 (本技能特有,替代 SM2 的趋势):
[!IMPORTANT]
FARM 是单帧快照,没有趋势。判"退化进行中 vs 暂稳"的近似规则:
Reallocated Candidate Sectors > 0 (整盘或任一头) → 退化进行中 (有坏道已检出待重分配,说明退化仍在发生)。
- 候选 = 0 且已重分配 > 0 → 暂稳 (坏道已处理完,暂未发现新坏道)。
B. 判断依据 (凭什么)
- 现场统计规律:统计显示,76.7% 的故障盘在失效前 SMART 5/187/188/197/198 至少一项非零;单项非零时故障概率约 30%–40%,而第 1 类 (重分配/坏扇区) 与第 2 类 (不可恢复读) 同时非零时,故障概率升至约 76%——所以分析重在组合与共振,不轻信单项指标。
- 计数器语义:
Reallocated Sectors、CTO Count、Unrecoverable Read Errors 都是累计量;Reallocated Candidate 是"已检出但尚未完成重分配的坏道",是单快照下最接近"活跃度"的指标。
- 物理量含义:
Fly height clearance delta = 飞高间隙偏移、MR Head Resistance = 磁阻磁头电阻 (0xFFFF = 开路)、Interface CRC Errors = 接口链路误码、CTO = 命令超时——直接对应磁头/盘面/接口的物理状态。
- 整盘↔逐头对账:整盘
Reallocated Sectors 若能与某磁头的 Reallocated Sectors by Head 对上 (如整盘总数恰好等于某单头的逐头数),即可定位到具体磁头;若整盘很大而逐头全 0,则诚实标注"本帧未填充逐头分布,无法定位到磁头"。
- 覆盖度自知:第 3/7 类只是部分覆盖,TXT 来源时第 2/7 类及逐头明细进一步降级,第 8 类不适用——结论中应当明确标注"此类看不全"。
C. 分析流程 (怎么走)
①归集分组:递归遍历所有子目录,按文件名(SN/IP)分盘(与目录名无关);每盘选数据源(json 优先, txt 兜底);非 `*_FARM_*.{json,txt}` 内容自动跳过
②身份识别:读型号/固件/磁头数;18 磁头 + ST20000NM002H = Mach.2 双致动器
③逐头体检:每块盘 N 个磁头横向互比,挑出离群头(种群相对法)
④整盘↔逐头对账:用逐头数把整盘坏道定位到具体磁头;定不到则诚实标注
⑤八类归位:把每项异常落到 8 类故障部位,标注覆盖度
⑥机理串链:用物理因果链把字段串成一句"哪里坏了、怎么坏的"
⑦分级研判:按"是否伤到数据面 + 候选数活跃度"定严重度(注意 FAFH 单独离群只算关注)
⑧机群排序:多盘按健康度差→好排队(同级按不可恢复读+重分配+候选+退化头数加权),定处置优先级
⑨给出处置:换盘 / 磁头级降级 / 换线缆 / 改环境 / 带外重启 + 留用退出条件
脚本已自动执行 ①–⑧ 并给出建议;判读人重点复核 ⑥ (因果链是否成立)、④ (定位是否可信) 与 ⑨ (处置是否匹配现场)。
工作流
第 1 步:运行解析脚本 (获取确定性事实,避免手动计算)
脚本封装了全部分析逻辑:多盘发现 → 数据源优选 → 逐头聚合 → 8 类判定 → 故障分类 → 机群报告,每次运行结果一致。
python3 scripts/analyze_farm.py <log目录>
python3 scripts/analyze_farm.py <log目录> --source json
python3 scripts/analyze_farm.py <log目录> --source txt
python3 scripts/analyze_farm.py <log目录> --json
脚本会直接输出:机群汇总表 (按健康度 差 → 好 排序) + 每块盘的逐类 (8 类) 分析表 + 逐磁头明细表 + 结论与处置建议。
第 2 步:对照参考进行判读
脚本给出结论,而 references/field_reference.md 提供详细判定依据。当需要解释"为什么这么判"、查询某个具体字段的物理含义、确认临界阈值、查看 8 类与 json↔txt↔SMART 三方映射,或遇到脚本未覆盖的特殊边界形态时,请查阅该参考文件。
核心方法:
- 种群相对法:同一块盘的 $N$ 个磁头处于相同工艺、负载和环境,横向互比更容易挑出离群磁头。
- 组合判读:单项 > 0 时故障概率约 30%–40%;第 1 类 (重分配/坏扇区) + 第 2 类 (不可恢复读) 同时非零时,故障概率升至约 76%——属于最优先级换盘。
- FAFH 谨慎:飞高 clearance delta 逐头校准差异天然大,单独离群只算"关注",须与同头坏道共振才升级。
第 3 步:确认数据源与覆盖度 (直接影响结论的完整性)
[!WARNING]
先看是 json 还是 txt!
- json (openSeaChest):字段最全,能做逐头定位、逐头不可恢复读、Flash LED/Depop 判定。
- txt (华为 disktool):只有约 40% 字段,无逐头重分配/不可恢复读、无 Flash LED 事件、无型号/Depop——此时第 2/7 类及逐头明细会降级,故障常只能判到"整盘介质退化(未定位到磁头)"。
报告"数据源"列已标注。若某盘只有 txt 而结论关键,应索取其 json 重新分析。
第 4 步:确定健康结论与处置建议
按 references/field_reference.md 第 6 章的判定矩阵逐盘归类 (健康 / 亚健康 / 单磁头退化 / 多磁头退化 / 整盘介质退化 / 某类别异常 / 固件硬件级失效),用"候选数"区分退化进行中与暂稳。多盘场景下,根据机群汇总表的"差 → 好"排序分配处置优先级。详细处理方法见 references/field_reference.md 第 8 章。
第 5 步 (可选):关联主机 OS 日志
FARM 数据仅反映磁盘内部的物理及遥测指标。若需要论证磁头退化对上层业务的影响 (如 I/O 错误、卷宕机),需结合主机的 dmesg / /var/log/messages (关键词如 Medium Error、xfs_do_force_shutdown 等) 与 xfs_repair 恢复流程——详见 references/field_reference.md 第 9 章。
报告输出结构
向用户交付报告时,推荐使用以下格式 (脚本的默认输出已基本符合该结构,分析人员只需在结论处补全判读和机群处置意见即可)。
[!CAUTION]
命中「磁头/组件退化确定性规则」的盘,报告的"健康判定 / 故障级别 / 处置建议"三项只能逐字等于脚本输出,不得因坏扇区/不可恢复读/固件不可纠正错误等其它现象改判为"损坏 / 报废换盘 / P1 Critical"(详见「磁头/组件退化确定性规则」一节的硬约束)。 此处"补全判读"仅指补充因果链叙述与机群排序,不包括改动这三项确定性结论。
# 希捷 FARM 多盘健康分析报告
## 一、 机群汇总 (按健康度 差 → 好 排序)
| IP | 盘SN | 型号 | 固件 | 磁头数 | 数据源 | 综合评级 | 故障模式 | 主要异常类别 | 受影响磁头 | 处置建议 |
|---|---|---|---|---|---|---|---|---|---|---|
## 二、 逐盘详细分析
### 1. 磁盘身份与运行环境 (以 SN: XXXXXXXX 为例)
- 序列号 (SN) / 型号 / 固件 / 接口 / 磁头总数 (18 头标注为 Mach.2 双致动器)
- 数据源: JSON / TXT (及覆盖度)
- 运行环境: 温度 XX℃ (Max XX℃), 湿度 XX%, 冲击 XX, 上电 XX 小时
### 2. 逐类 (8 类故障部位) 分析表
| 故障分类 | 覆盖度 | 评级 | 关键发现与字段表现 |
|---|---|---|---|
### 3. 逐磁头明细数据 (仅 JSON 完整)
| 磁头 ID | 表面评级 | 通道评级 | 重分配 | 候选 | 不可恢复读 | FAFH(O/M/I) | MRR | 离群标记 |
|---|---|---|---|---|---|---|---|---|
### 4. 研判结论与处置建议
> 命中确定性规则时,下列"故障模式 / 健康判定 / 处置建议"三项**逐字复制脚本输出**,只按占比二选一(<50%→健康+DEPOP隔离;≥50%→损坏+报废换盘),**不得因坏扇区/不可恢复读等其它现象改判**。
- **故障模式**:单磁头退化 / 多磁头退化 / 整盘介质退化 / 接口异常 / 固件硬件级失效 / 磁头组件退化(确定性规则)等
- **健康判定**:健康 / 亚健康 / 退化 / 失效 / 损坏(命中"磁头/组件退化"确定性规则时**仅按退化磁头占比**二选一:<50%→健康、≥50%→损坏,见该节硬约束;不受候选扇区/不可恢复读影响)
- **活跃度**:退化进行中 (候选>0) / 暂稳 (候选=0)
- **处置建议**:保留监控 / 磁头级降级 / 立即换盘 / 更换线缆 / (命中确定性规则时)报废换盘或"重新挂载+DEPOP隔离"固定命令等
## 三、 主机 OS 日志关联分析 (如有)
- 触发时间对齐 / 主机端报错 (Medium Error / 文件系统只读) / 文件系统修复动作与业务恢复结论
核心纪律 (一句话速记)
- 数据源:json (openSeaChest) 优先、txt (华为 disktool, ~40%字段) 兜底;txt 来源时第 2/7 类与逐头明细会降级,结论中必须说明。
- 无趋势:FARM 是单帧快照,禁止套用 SM2 的"旧→新方向"话术;活跃度用
Reallocated Candidate 近似。
- 整盘↔逐头对账:用逐头数定位到具体磁头;逐头全 0 而整盘很大时,诚实标注"无法定位到头"。
- FAFH 谨慎:飞高 clearance delta 逐头校准差异天然大,单独离群只算"关注",须与同头坏道共振才升级为"退化"。
- 种群相对:同盘磁头横向互比寻找离群磁头,比绝对阈值更灵敏。
- 覆盖度要诚实:第 3/7 类为部分覆盖,第 8 类 (SSD) 对 HDD 不适用,结论中必须明确说明。
- 结论边界:FARM 仅能证明磁盘内部物理及通道的退化,对业务的具体影响需结合主机操作系统日志 (如 SCSI Error / XFS 报错) 进行闭环佐证。
- 磁头/组件退化规则是确定性的,报告须逐字复制、严禁改判:
Velocity Observer > 200 或 DOS Write Refresh Count > 1000×Threshold 命中的磁头占比 ≥50%/<50%,仅凭这一个占比直接决定"损坏/报废换盘"或"健康/DEPOP隔离";健康判定/故障级别/处置三项逐字等于脚本输出,即使同盘有坏扇区/不可恢复读/固件不可纠正错误也不得改判为损坏,覆盖其它 8 类发现而非被其覆盖(见「磁头/组件退化确定性规则」一节硬约束)。