如何在 Dell 12th/13th Gen 服务器上通过 ESXi 获取硬盘 SMART 状态
本文介绍了在Dell 12th/13th Gen服务器上运行ESXi时如何获取硬盘SMART状态。由于标准SMART工具无法工作,作者发现可以使用perccli命令提取原始SMART十六进制数据,并提供了通过脚本或AI解析输出的方法,以及一个在线WASM工具用于解析SMART数据。
本文原载于我的个人博客: 如何在 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属性表。
查看这个示例输入。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)