C语言 获取 SATA 磁盘的 WWN



最近我一直在尝试用硬盘做各种各样的事情。现在我被困住了...

我想得到的是硬盘驱动器的串行,型号,修订版和WWN。

对于 SCSI,以上所有内容都可以通过 SCSI 查询获得。 对于SATA驱动器,我使用HDIO_GET_IDENTITY ioctl来获取模型,串行和修订版,但它不包括WWN。但是,我还没有找到如何获取这些驱动器的WWN id。有人在这方面有所了解吗?

最后,

在查看了linux/hdreg.h和磁盘制造商的一些文档之后,我发现这些信息包含在IOCTL HDIO_GET_IDENTITY中。但它相当模糊。

http://lxr.free-electrons.com/source/include/linux/hdreg.h?v=2.6.32

在第 595 行有几个未指定的单词。 其中 4 个单词包含 WWN。 你可以像这样得到它们:

sprintf(wwnstr,"0x%04x%04x%04x%04x",hd.words104_125[4],hd.words104_125[5],hd.words104_125[6],hd.words104_125[7]);

无论如何,如前所述,SCSI查询也可用于获取SATA磁盘上的WWN数据。这是我编写的一个小程序的一些示例,该程序发送查询并获取数据。

这是一个 SCSI 磁盘,WWN 十六进制是 VPD 页面中偏移量为 8 的 WWN,0x83十六进制编号的偏移量为 WNN NAA。 是同一页面中偏移量 56 处的字符串!

model:      ST3600057SS     
serial:     3SL1DBA00
revision:   EN03
wnn HEX:    0x5000C500286ACC13
wnn naa.:   0x5000C500286ACC10

但是,在SATA磁盘上完成相同的程序将导致以下结果:

model:      SAMSUNG HD103UJ 
serial:     S13PJ1DQ403064  
revision:   1AA0
wnn HEX:    0x533133504A314451
wnn naa.:   0x    

如您所见,WWN 未指定为字符串。

2 WWN 不一样有什么原因吗?

您需要对设备进行特定的 Page83 查询才能获得它的WWN以及序列号,型号和修订版。

我(部分)在

https://www.jmcpdotcom.com/~jmcp/WhatIsAGuid.pdf

您需要设置 EVPD=1,页面代码 = 0x83,然后查找指示符类型0x2 (EUI-64) 或0x3 (NAA)。基于EUI-64的指示符包含在SPC-4rev 36表7.8.6.5中,基于NAA的指示符包含在SPC-4rev 36表7.8.6.6中。

对于 SATA 连接的设备,还应查看 SCSI/ATA 转换层规范 SAT-3 中的第 10.3.4 节。

SPC4 和 SAT3 均可从 http://www.t10.org 获得。

相关内容

  • 没有找到相关文章

最新更新