You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于通过ATA透传获取RAID卡挂载SATA磁盘通电时间(POH)及SMART信息的技术咨询

关于通过ATA透传获取RAID卡挂载SATA磁盘通电时间(POH)及SMART信息的技术咨询

嘿,我最近在折腾一个需求:要通过ATA透传机制,读取挂在RAID卡上的SATA硬盘的SMART信息,重点是要拿到通电时间(POH,Power-On Hours)。研究了smartmontools的源码后,遇到了个小卡点,想过来请教下各位大佬。

先跟大家说下我目前的进展:

  • 我先用smartctl命令行工具验证了可行性:执行sudo smartctl -a /dev/sdb -d megaraid,29,确实能成功读出目标硬盘的所有SMART数据。翻源码发现这个流程用的是sat_device::ata_pass_through()函数,它依赖的CDB结构和ATA透传的标准定义完全匹配,逻辑很清晰。
  • 但现在的问题是,我只能使用源码里另一个类似的API——csmi_ata_device::ata_pass_through()。这个函数和前者的核心区别是,它用的是14字节的FIS结构,而不是CDB。我看了它填充FIS的代码片段,是把ATA命令的寄存器值拆分到FIS的各个字节位置的,具体的初始化逻辑大概是这样:
{
  unsigned char * fis = pthru.bCommandFIS;
  const ata_in_regs & lo = in.in_regs;
  const ata_in_regs & hi = in.in_regs.prev;
  fis[ 0] = 0x27; // PIO Setup FIS标识
  fis[ 1] = lo.device;
  fis[ 2] = lo.lbal;
  fis[ 3] = lo.lbam;
  fis[ 4] = lo.lbah;
  fis[ 5] = lo.command;
  fis[ 6] = lo.feature;
  fis[ 7] = hi.device;
  fis[ 8] = hi.lbal;
  fis[ 9] = hi.lbam;
  fis[10] = hi.lbah;
  fis[11] = hi.command;
  fis[12] = hi.feature;
  fis[13] = 0x00;
}

我现在的核心困惑是:怎么基于这个FIS结构的ata_pass_through()函数,构造出正确的ATA命令,从而读取到硬盘的通电时间(POH)以及其他SMART信息?有没有熟悉这个函数实现的朋友,或者能给我讲讲怎么把读取SMART的标准ATA命令,转换成对应的FIS结构填充逻辑?

备注:内容来源于stack exchange,提问作者Jason Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 15:44:50