红联Linux门户
Linux帮助

linux c获取硬盘的序列号

发布时间:2015-11-01 09:05:15来源:linux网站作者:linux_zhu

获取硬盘序列号的方法
找到指定硬盘的设备文件(如果是根目录的话,可以通过读取 /etc/mtab 文件获取),打开对应的设备文件。然后使用系统调用ioctl。
在这里 ioctl 的第二个参数为 HDIO_GET_IDENTITY (获得指定文件描述符的标志号)
第三个参数为 struct hd_driveid ,在 linux/hdreg.h 中。 struct hd_driveid 结构声明如下:


/*
* Structure returned by HDIO_GET_IDENTITY, as per ANSI NCITS ATA6 rev.1b spec.
*
* If you change something here, please remember to update fix_driveid() in
* ide/probe.c.
*/
struct hd_driveid {
unsigned short  config; /* lots of obsolete bit flags */
unsigned short  cyls;   /* Obsolete, "physical" cyls */
unsigned short  reserved2;  /* reserved (word 2) */
unsigned short  heads;  /* Obsolete, "physical" heads */
unsigned short  track_bytes;/* unformatted bytes per track */
unsigned short  sector_bytes;   /* unformatted bytes per sector */
unsigned short  sectors;/* Obsolete, "physical" sectors per track */
unsigned short  vendor0;/* vendor unique */
unsigned short  vendor1;/* vendor unique */
unsigned short  vendor2;/* Retired vendor unique */
unsigned char   serial_no[20];  /* 0 = not_specified */
unsigned short  buf_type;   /* Retired */
unsigned short  buf_size;   /* Retired, 512 byte increments
* 0 = not_specified
*/
unsigned short  ecc_bytes;  /* for r/w long cmds; 0 = not_specified */
unsigned char   fw_rev[8];  /* 0 = not_specified */
unsigned char   model[40];  /* 0 = not_specified */
unsigned char   max_multsect;   /* 0=not_implemented */
unsigned char   vendor3;/* vendor unique */
unsigned short  dword_io;   /* 0=not_implemented; 1=implemented */
unsigned char   vendor4;/* vendor unique */
unsigned char   capability; /* (upper byte of word 49)
*  3:  IORDYsup
*  2:  IORDYsw
*  1:  LBA
*  0:  DMA
*/
unsigned short  reserved50; /* reserved (word 50) */
unsigned char   vendor5;/* Obsolete, vendor unique */
unsigned char   tPIO;   /* Obsolete, 0=slow, 1=medium, 2=fast */
unsigned char   vendor6;/* Obsolete, vendor unique */
unsigned char   tDMA;   /* Obsolete, 0=slow, 1=medium, 2=fast */
unsigned short  field_valid;/* (word 53)
*  2:  ultra_okword  88
*  1:  eide_ok words 64-70
*  0:  cur_ok  words 54-58
*/
unsigned short  cur_cyls;   /* Obsolete, logical cylinders */
unsigned short  cur_heads;  /* Obsolete, l heads */
unsigned short  cur_sectors;/* Obsolete, l sectors per track */
unsigned short  cur_capacity0;  /* Obsolete, l total sectors on drive */
unsigned short  cur_capacity1;  /* Obsolete, (2 words, misaligned int) */
unsigned char   multsect;   /* current multiple sector count */
unsigned char   multsect_valid; /* when (bit0==1) multsect is ok */
unsigned intlba_capacity;   /* Obsolete, total number of sectors */
unsigned short  dma_1word;  /* Obsolete, single-word dma info */
unsigned short  dma_mword;  /* multiple-word dma info */
unsigned short  eide_pio_modes; /* bits 0:mode3 1:mode4 */
unsigned short  eide_dma_min;   /* min mword dma cycle time (ns) */
unsigned short  eide_dma_time;  /* recommended mword dma cycle time (ns) */
unsigned short  eide_pio;   /* min cycle time (ns), no IORDY  */
unsigned short  eide_pio_iordy; /* min cycle time (ns), with IORDY */
unsigned short  words69_70[2];  /* reserved words 69-70
* future command overlap and queuing
*/
unsigned short  words71_74[4];  /* reserved words 71-74
* for IDENTIFY PACKET DEVICE command
*/
unsigned short  queue_depth;/* (word 75)
* 15:5 reserved
*  4:0 Maximum queue depth -1
*/
unsigned short  words76_79[4];  /* reserved words 76-79 */
unsigned short  major_rev_num;  /* (word 80) */
unsigned short  minor_rev_num;  /* (word 81) */
unsigned short  command_set_1;  /* (word 82) supported
* 15:  Obsolete
* 14:  NOP command
* 13:  READ_BUFFER
* 12:  WRITE_BUFFER
* 11:  Obsolete
* 10:  Host Protected Area
*  9:  DEVICE Reset
*  8:  SERVICE Interrupt
*  7:  Release Interrupt
*  6:  look-ahead
*  5:  write cache
*  4:  PACKET Command
*  3:  Power Management Feature Set
*  2:  Removable Feature Set
*  1:  Security Feature Set
*  0:  SMART Feature Set
*/
unsigned short  command_set_2;  /* (word 83)
* 15:  Shall be ZERO
* 14:  Shall be ONE
* 13:  FLUSH CACHE EXT
* 12:  FLUSH CACHE
* 11:  Device Configuration Overlay
* 10:  48-bit Address Feature Set
*  9:  Automatic Acoustic Management
*  8:  SET MAX security
*  7:  reserved 1407DT PARTIES
*  6:  SetF sub-command Power-Up
*  5:  Power-Up in Standby Feature Set
*  4:  Removable Media Notification
*  3:  APM Feature Set
*  2:  CFA Feature Set
*  1:  READ/WRITE DMA QUEUED
*  0:  Download MicroCode
*/
unsigned short  cfsse;  /* (word 84)
* cmd set-feature supported extensions
* 15:  Shall be ZERO
* 14:  Shall be ONE
* 13:6 reserved
*  5:  General Purpose Logging
*  4:  Streaming Feature Set
*  3:  Media Card Pass Through
*  2:  Media Serial Number Valid
*  1:  SMART selt-test supported
*  0:  SMART error logging
*/
unsigned short  cfs_enable_1;   /* (word 85)
* command set-feature enabled
* 15:  Obsolete
* 14:  NOP command
* 13:  READ_BUFFER
* 12:  WRITE_BUFFER
* 11:  Obsolete
* 10:  Host Protected Area
*  9:  DEVICE Reset
*  8:  SERVICE Interrupt
*  7:  Release Interrupt
*  6:  look-ahead
*  5:  write cache
*  4:  PACKET Command
*  3:  Power Management Feature Set
*  2:  Removable Feature Set
*  1:  Security Feature Set
*  0:  SMART Feature Set
*/
unsigned short  cfs_enable_2;   /* (word 86)
* command set-feature enabled
* 15:  Shall be ZERO
* 14:  Shall be ONE
* 13:  FLUSH CACHE EXT
* 12:  FLUSH CACHE
* 11:  Device Configuration Overlay
* 10:  48-bit Address Feature Set
*  9:  Automatic Acoustic Management
*  8:  SET MAX security
*  7:  reserved 1407DT PARTIES
*  6:  SetF sub-command Power-Up
*  5:  Power-Up in Standby Feature Set
*  4:  Removable Media Notification
*  3:  APM Feature Set
*  2:  CFA Feature Set
*  1:  READ/WRITE DMA QUEUED
*  0:  Download MicroCode
*/
unsigned short  csf_default;/* (word 87)
* command set-feature default
* 15:  Shall be ZERO
* 14:  Shall be ONE
* 13:6 reserved
*  5:  General Purpose Logging enabled
*  4:  Valid CONFIGURE STREAM executed
*  3:  Media Card Pass Through enabled
*  2:  Media Serial Number Valid
*  1:  SMART selt-test supported
*  0:  SMART error logging
*/
unsigned short  dma_ultra;  /* (word 88) */
unsigned short  trseuc; /* time required for security erase */
unsigned short  trsEuc; /* time required for enhanced erase */
unsigned short  CurAPMvalues;   /* current APM values */
unsigned short  mprc;   /* master password revision code */
unsigned short  hw_config;  /* hardware config (word 93)
* 15:  Shall be ZERO
* 14:  Shall be ONE
* 13:
* 12:
* 11:
* 10:
*  9:
*  8:
*  7:
*  6:
*  5:
*  4:
*  3:
*  2:
*  1:
*  0:  Shall be ONE
*/
unsigned short  acoustic;   /* (word 94)
* 15:8 Vendor's recommended value
*  7:0 current value
*/
unsigned short  msrqs;  /* min stream request size */
unsigned short  sxfert; /* stream transfer time */
unsigned short  sal;/* stream access latency */
unsigned intspg;/* stream performance granularity */
unsigned long long lba_capacity_2;/* 48-bit total number of sectors */
unsigned short  words104_125[22];/* reserved words 104-125 */
unsigned short  last_lun;   /* (word 126) */
unsigned short  word127;/* (word 127) Feature Set
* Removable Media Notification
* 15:2 reserved
*  1:0 00 = not supported
*  01 = supported
*  10 = reserved
*  11 = reserved
*/
unsigned short  dlf;/* (word 128)
* device lock function
* 15:9 reserved
*  8   security level 1:max 0:high
*  7:6 reserved
*  5   enhanced erase
*  4   expire
*  3   frozen
*  2   locked
*  1   en/disabled
*  0   capability
*/
unsigned short  csfo;   /*  (word 129)
* current set features options
* 15:4 reserved
*  3:  auto reassign
*  2:  reverting
*  1:  read-look-ahead
*  0:  write cache
*/
unsigned short  words130_155[26];/* reserved vendor words 130-155 */
unsigned short  word156;/* reserved vendor word 156 */
unsigned short  words157_159[3];/* reserved vendor words 157-159 */
unsigned short  cfa_power;  /* (word 160) CFA Power Mode
* 15 word 160 supported
* 14 reserved
* 13
* 12
* 11:0
*/
unsigned short  words161_175[15];/* Reserved for CFA */
unsigned short  words176_205[30];/* Current Media Serial Number */
unsigned short  words206_254[49];/* reserved words 206-254 */
unsigned short  integrity_word; /* (word 255)
* 15:8 Checksum
*  7:0 Signature
*/
};


其中 serial_no 问硬盘的序列号,如果此项为0,则为没有提供。


源码如下:

#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <linux/hdreg.h>
#include <sys/fcntl.h>

int main(){
struct hd_driveid id;
int fd = open("/dev/sda",O_RDONLY | O_NONBLOCK);
if(fd < 0){
perror("dev/sda");
return 1;
}