本文原载于我的个人博客: 如何在 Dell 12th/13th Gen 服务器上通过 ESXi 获取硬盘 SMART 状态,如需阅读完整内容(包括图片、代码块等),请前往我的博客阅读。

事件回顾

前几天,我收到一个"iDRAC状态"警报,说有一个硬盘坏了。我登录iDRAC,看到它掉出了总线,然后重新连接,正在重建中。iDRAC网页界面的SMART状态显示正常,但由于硬盘曾经掉线,我让SAST的负责人找备用硬盘尽快更换。

一天后,我又收到另一个警报,同一个硬盘在重建过程中失败,被标记为Failed。我再次让他们尽快更换。这次,我想检查所有硬盘的SMART状态,看看是否还有其他硬盘即将损坏。它们都已经用了10年了。

调查过程

iDRAC 8 没有详细的硬盘SMART状态,只有一个布尔值表示硬盘是否健康。ESXi无法从Dell PERC RAID控制器后面的磁盘读取SMART数据,只能获取HBA磁盘的SMART数据。我搜索并询问ChatGPT,但收效甚微。

不过,我知道LSI控制器有storcli,于是搜索了ESXi版本。(Google "storcli ESXi {version}"就能找到)我费了很大劲才安装成功(但总之,我成功了),但它不兼容Dell PERC控制器。

然后我尝试使用-d megaraid,N选项的smartctl。我们在运行常规Linux发行版时使用这个命令。然而,它实际上不起作用:

/opt/smartmontools/smartctl -a -d megaraid,0 /dev/disks/naa.xxx
smartctl 7.5 2025-04-30 r5714 [x86_64-linux-7.0.3] (local build) Copyright (C) 2002-25, Bruce Allen, Christian Franke, www.smartmontools.org

Smartctl open device: /dev/disks/naa.xxx [megaraid_disk_00] failed: can't get bus number

看起来获取总线号所需的ioctl在ESXi定制的内核中没有实现。

后来我发现了perccli,这是Dell专版的storcli。安装命令是:

esxcli software vib install -d /tmp/VMWare-perccli64_007.1910.zip --no-sig-check

虽然安装过程失败并提示备份启动银行已损坏,但实际上已经成功了。我运行ln -s /opt/lsi/perccli64/perccli64 /bin/perccli64以便直接运行perccli64

[root@esxi:~] perccli64 show
CLI Version = 007.1910.0000.0000 Oct 08, 2021
Operating system = VMkernel 7.0.3
Status Code = 0
Status = Success
Description = None

Number of Controllers = 1
Host Name = esxi.hera.net9.org
Operating System  = VMkernel 7.0.3
StoreLib IT Version = 07.2000.0200.0200
StoreLib IR3 Version = 16.14-0

System Overview :
===============

------------------------------------------------------------------------
Ctl Model        Ports PDs DGs DNOpt VDs VNOpt BBU sPR DS EHS ASOs Hlth
------------------------------------------------------------------------
  0 PERCH730Mini     8   7   3     0   3     0 Opt On  3  N      0 Opt
------------------------------------------------------------------------

实际上我当时并不是在获取SMART数据,而是iDRAC没有响应,我试图直接访问PERC控制器来获取重建状态。但当我输入perccli64 help时,发现了一个show smart命令。

[root@esxi:~] perccli64 /c0/e32/s0 show smart
CLI Version = 007.1910.0000.0000 Oct 08, 2021
Operating system = VMkernel 7.0.3
Controller = 0
Status = Success
Description = Show Drive Smart Info Succeeded.

Smart Data Info /c0/e32/s0 =
01 00 05 32 00 64 64 25 00 00 00 00 00 00 09 32
... (512 bytes of hex SMART blob)

解析方案

但输出的是原始十六进制,而不是人类可读的SMART属性表格。我搜索了在线解析器,没有找到。我让ChatGPT帮我找,也没有找到。不过,这里有一些建议:

  • 直接把十六进制数据发给ChatGPT,让它解码。如果提供硬盘型号,可以更准确地解析属性含义。
  • 让ChatGPT生成一个Python脚本来解析十六进制数据块。以下是ChatGPT为我生成的一个脚本:
    注意:Mermaid图表无法在CSDN上渲染,请前往原文查看完整内容和图表。

ChatGPT还建议可以使用skdump来解析十六进制数据块。它需要libatasmart格式的数据块。也许可以从上面的十六进制数据中构建一个,但我觉得这样做不值得。

我的想法是:也许我可以修改smartctl来读取十六进制数据并输出SMART数据。让我试试CodeX。

在线工具

所以我fork了smartmontools仓库,让CodeX帮我修改smartctl来读取上面的十六进制数据。他做得很好,编译成了WASM。然后我让他构建了一个前端网页来使用这个修改后的smartctl解析十六进制数据。这个工具现在已经上线了:smart.aajax.top。只需要把设备数据和十六进制数据粘贴到文本框中,然后点击"Parse SMART Data",就会得到一个干净的SMART属性表。

查看这个示例输入

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐