hdparmsdparm 是 Linux 下常用的两个查询和设置硬盘参数的工具,这两个工具分别适用于不同的硬盘类型。

硬盘类型

不考虑早起的 IDE 硬盘,以及最新的 NVME 等硬盘,目前主流的硬盘分为两个类型:

  1. SATA: Serial Advanced Technoogy Attachment
  2. SAS: Serial Attached SCSI

在 Linux 系统中,可以用 smartctl 命令查看硬盘的类型。 这里,我们不看这两种接口的标准和实现的差异,重点关注的是使用上的差异。

转速差距

  • SATA 一般是 7200 rpm
  • SAS 一般是 10k 或者 15k rpm

IOPS (小 IO)

  • 7.2k rpm 的 SATA 盘一般是 IOPS 80
  • 10k rpm 的 SAS 盘一般是 IOPS 120
  • 10k rpm 的 SAS 盘一般是 IOPS 180

可靠性

可靠性上,SAS 更可靠。

SAS drives are more reliable than SATA drives. The industry accepted Mean Time Between Failure (MTBF) for SAS drives is 1.2 million hours vs 700,000 hours MTBF for SATA drives.

容量

SATA 盘的容量可以做得更大。

In terms of capacity though, SATA drives win hands down. 3TB SATA hard drives are not uncommon and there are 8TB disk offerings in a 3.5 inch format. Generally though they are most cost effective in the 1TB to 3TB range. SAS drives on the other hand tend to max at around 900GB although the most popular configuration is around 450GB to 500GB.

其他

SATA 的线缆长度很短,最多 1 米;SAS 可达 10 米。

From a physical perspective the data cables are also significantly different. SATA cables are limited to 1 metre in length and the data and power are separate whereas SAS cables can be up to 10 metres in length with power and data provided through the same cable.

hdparm

hdparm 工具是通过 kernel 的 libata 子系统和 IDE 子系统来和硬盘交互,达到读取或者设置硬盘参数的目的。这个工具并不能百分百兼容 SAS 硬盘,只有部分选项对 SAS 硬盘是有效的,比如 write-caching 参数就不兼容 SAS 盘。

hdparm 直接通过指定参数即可和硬盘交互,更详细的文档请参考: https://wiki.archlinux.org/index.php/hdparm 或者 man hdparm

例如可以用 -W 来设置 SATA 盘的 write-caching 属性:

[root ~]# hdparm -W 1 /dev/sda
[root ~]# hdparm -W /dev/sda

/dev/sda:
 write-caching =  1 (on)

sdparm

sdparm 是一个 SCSI 协议交互工具,用于访问 SCSI mode pages,读取 VPD pages,以及发送简单的 SCSI 命令。因此这个工具一般被用来控制 SAS 盘。这里只是简单说明下几个主要的概念和工具用法,更详细的内容,推荐阅读 http://sg.danny.cz/sg/sdparm.html#mozTocId871473

SCSI mode pages

SCSI mode pages 包含了一些 SCSI 设备的元数据,用户可以通过设置这些元数据来改变设备的行为。SCSI 协议在 SPC 中定义了 mode page 相关的内容。

sdparm 可以使用 -all 参数来查看设备所支持的 page:

[root ~]# sdparm --all --long /dev/sdb | grep page
Read write error recovery [rw] mode page:
Disconnect-reconnect (SPC + transports) [dr] mode page:
Format (SBC) [fo] mode page:
Rigid disk (SBC) [rd] mode page:
Verify error recovery (SBC) [ve] mode page:
Caching (SBC) [ca] mode page:
Control [co] mode page:
  ATMPE       0  [cha: n, def:  0, sav:  0]  Application tag mode page enabled
Protocol specific logical unit [pl] mode page:
Protocol specific port [pp] mode page:
Power condition [po] mode page:
Informational exceptions control [ie] mode page:
Background control (SBC) [bc] mode page:

每一行是一个 mode page,其中中括号内的是 page 的缩写。要查询一个 page 的指定内容,每行一个域:

[root ~]# sdparm --all --page=ca /dev/sdb
    /dev/sdb: TOSHIBA   MG03SCA200        5702
Caching (SBC) mode page:
  IC          0  [cha: y, def:  0, sav:  0]
  ABPF        0  [cha: n, def:  0, sav:  0]
  CAP         0  [cha: n, def:  0, sav:  0]
  DISC        1  [cha: n, def:  1, sav:  1]
  SIZE        0  [cha: n, def:  0, sav:  0]
  WCE         0  [cha: y, def:  0, sav:  0]
  MF          0  [cha: n, def:  0, sav:  0]
  RCD         0  [cha: y, def:  0, sav:  0]
  DRRP        0  [cha: n, def:  0, sav:  0]
  WRP         0  [cha: n, def:  0, sav:  0]
  DPTL       -1  [cha: n, def: -1, sav: -1]
  MIPF        0  [cha: n, def:  0, sav:  0]
  MAPF        0  [cha: n, def:  0, sav:  0]
  MAPFC      -1  [cha: n, def: -1, sav: -1]
  FSW         1  [cha: y, def:  1, sav:  1]
  LBCSS       0  [cha: n, def:  0, sav:  0]
  DRA         0  [cha: n, def:  0, sav:  0]
  SYNC_PROG   0  [cha: n, def:  0, sav:  0]
  NV_DIS      0  [cha: n, def:  0, sav:  0]
  NCS         8  [cha: y, def:  8, sav:  8]
  CSS         0  [cha: n, def:  0, sav:  0]

还可以通过 --get--set 来设置一个指定域的值。域的缩写就是上面第一列的大写字母,这个缩写是全局唯一的,在不同的 page 内也不重复。比如查看和设置一个硬盘的 write-caching 的方法如下:

[root ~]# sdparm --set WCE=0 --save /dev/sdb
    /dev/sdb: TOSHIBA   MG03SCA200        5702
[root ~]#
[root ~]# sdparm --get=WCE /dev/sdb
    /dev/sdb: TOSHIBA   MG03SCA200        5702
WCE         0  [cha: y, def:  0, sav:  0]

VPD pages

VPD (Vital Product Data) 是指软件或者硬件提供的一组配置和信息,一般在硬件中都用来存储硬件的关键信息。SCSI 协议是在 SBC 中定义了 VPD 相关的内容,最重要的就是 Device Identification VPD page (page number: 0x83),这个 page 包含了磁盘序列号等信息。

在 sdparm 参数中,可以通过指定 --inquiry 参数来指定要查询的是 VPD pages:

[root ~]# sdparm --inquiry --all /dev/sdb
    /dev/sdb: TOSHIBA   MG03SCA200        5702
Supported VPD pages VPD page:
  Supported VPD pages [sv]
  Unit serial number [sn]
  Device identification [di]
  Extended inquiry data [ei]
  Power condition [pc]
  Protocol-specific logical unit information [pslu]
  Block device characteristics (SBC) [bdc]

一般我们是通过 sn page 来查询硬盘的序列号:

[root ~]# sdparm --inquiry --page=sn /dev/sdb
    /dev/sdb: TOSHIBA   MG03SCA200        5702
Unit serial number VPD page:
  Z3M0AXXXXXU6

References

  1. https://www.pickaweb.co.uk/kb/difference-between-sata-sas-hard-drives/
  2. https://www.intel.com/content/www/us/en/support/articles/000005782/server-products.html
  3. https://www.kernel.org/doc/html/v4.13/driver-api/libata.html
  4. https://en.wikipedia.org/wiki/SCSI_mode_page
  5. https://en.wikipedia.org/wiki/Vital_Product_Data
  6. Working Draft SCSI Block Commands - 3 (SBC-3) http://t10.org/ftp/t10/document.05/05-344r0.pdf
  7. Working Draft SCSI Primary Commands - 4 (SPC-4) http://caxapa.ru/thumbs/563550/spc4r31.pdf
  8. https://www.systutorials.com/docs/linux/man/8-sg_vpd/

知识共享许可协议本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。