我需要在外部安装的硬盘上创建一个文件。创建的文件应该包含硬盘的序列号,并且该文件可以被其他进程使用。
我试图使用以下代码

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

int main(int argc, char *argv[])
{
   static struct hd_driveid hd;
   int fd;

   if (geteuid() >  0) {
    printf("ERROR: Must be root to use\n");
    exit(1);
    }

   if ((fd = open(argv[1], O_RDONLY|O_NONBLOCK)) < 0) {
    printf("ERROR: Cannot open device %s\n", argv[1]);
    exit(1);
    }

   if (!ioctl(fd, HDIO_GET_IDENTITY, &hd)) {
    printf("Hard Disk Model: %.40s\n", hd.model);
    printf("  Serial Number: %.20s\n", hd.serial_no);
    } else if (errno == -ENOMSG) {
      printf("No hard disk identification information available\n");
    } else {
     perror("ERROR: HDIO_GET_IDENTITY");
     exit(1);
   }

   exit(0);
}

对于内部硬盘来说,这是正常的,但是当我对外部硬盘(USB)执行此操作时,它会给出以下错误
ERROR: HDIO_GET_IDENTITY: Invalid argument

最佳答案

由于设备已连接到USB网桥,因此无法发送hdio_get_identity命令。
您可以尝试hdparm查询设备的标识。使用默认选项,hdparm无法识别设备,因此必须使用-d指定设备类型(请参见USB devices and smartmontools)。
如果没有-d选项,我得到:

$ sudo smartctl /dev/sdc
/dev/sdc: Unknown USB bridge [0x059f:0x1011 (0x000)]
Please specify device type with the -d option.

使用-d sat,autohdparm可以显示有关设备的一些信息:
$ sudo smartctl -d sat,auto -i /dev/sdc
/dev/sdc [SCSI]: Device open changed type from 'sat,auto' to 'scsi'
=== START OF INFORMATION SECTION ===
Vendor:               ST2000VN
Product:              000-1H3164
User Capacity:        2 000 398 934 016 bytes [2,00 TB]
Logical block size:   512 bytes
Device type:          disk
Local Time is:        Thu Mar 13 09:41:32 2014 CET
SMART support is:     Unavailable - device lacks SMART capability.

您可以尝试在C程序中执行与smartctl相同的操作,但编写调用smartctl的脚本可能更容易。

关于c - 如何在Linux中获得USB连接的硬盘串行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22372316/

10-13 08:06