关于通过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
相关产品推荐
相关产品推荐

