关于c:获取SATA盘的WWN

obtaining WWN of SATA disks

最近我一直在尝试各种关于硬盘的事情。现在我被卡住了...

我想要的是硬盘的序列号、型号、版本和WWN。

对于 scsi,上述所有内容均可通过 scsi 查询获得。对于 SATA 驱动器,我使用 HDIO_GET_IDENTITY ioctl 来获取型号、序列号和修订版,但它不包括 WWN。但是,我还没有找到如何获得这些驱动器的 WWN id。有人有这方面的知识吗?


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

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

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

1
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 HEX 是十六进制数中的 vpd 页 0x83 中偏移量 8 处的 WWN,即 WNN naa。是同一页中偏移量 56 处的字符串!

1
2
3
4
5
model:      ST3600057SS    
serial:     3SL1DBA00
revision:   EN03
wnn HEX:    0x5000C500286ACC13
wnn naa.:   0x5000C500286ACC10

但是在 SATA 磁盘上执行相同的程序将导致:

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

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

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


您需要对设备进行特定的 Page83 INQUIRY 以获得
它的 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 获得。