我需要在外部安装的硬盘上创建一个文件。创建的文件应该包含硬盘的序列号,并且该文件可以被其他进程使用。
我试图使用以下代码
#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,auto
,hdparm
可以显示有关设备的一些信息:$ 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/