获取HD /分区序列号

时间:2015-02-04 20:49:30

标签: c++ c linux windows uniqueidentifier

使用Windows时,我可以使用命令

获取(或多或少)唯一的​​HDD分区序列号
GetVolumeInformation()

我的问题:是否有适用于Linux的类似内容?表示只有在某人格式化分区并且可以通过编程方式检索时才会更改的数字?

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以使用udev获取设备的序列号。 (你需要知道设备名称)

struct udev *context = udev_new();
struct udev_device *device = udev_device_new_from_syspath(context, "/sys/block/sda");
const char *id = udev_device_get_property_value(device, "ID_SERIAL");
// Cleanup
udev_device_unref(device);
udev_unref(context);

答案 1 :(得分:1)

在linux中,您可以使用blkid命令获取分区的UUID:

# blkid /dev/sda1
/dev/sda1: UUID="15677362-cef3-4a53-aca3-3bace1b0d92a" TYPE="ext4"

此信息存储在特定分区类型(如ext4,xfs)的格式中,并在重新格式化时更改。无格式分区没有可用信息。

如果你需要从代码中调用它,调用shell来运行这个命令并不是最漂亮的方法,但它可以工作:

#include <stdio.h>

int main(int argc,char ** argv) {

  /* device you are looking for */   
  char device[]="/dev/sda1";

  /* buffer to hold info */
  char buffer[1024];

  /* format into a single command to be run */
  sprintf(buffer,"/sbin/blkid -o value %s",device);

  /* run the command via popen */
  FILE *f=popen(buffer,"r");

  /* probably should check to make sure f!=null */

  /* read the first line of output */
  fgets(buffer,sizeof(buffer),f);

  /* print the results (note, newline is included in string) */
  fprintf(stdout,"uuid is %s",buffer);

  }

答案 2 :(得分:1)

分区在linux中至少有三个身份:

  • 原始设备标识符(考虑cat /proc/partitions) - 这不是唯一的序列号
  • 分区的UUID - 可以与blkid一起找到,并存储在分区本身中。您也可以手动解析/dev/.blkid.tab - 显而易见的格式。
  • 磁盘标签 - 也存储在分区中。 EG:
lsblk -o name,mountpoint,label,uuid
NAME   MOUNTPOINT LABEL UUID
sda
├─sda1 /                315eaf50-adcc-4f0d-b767-f008f3f1c194
├─sda2
└─sda5 [SWAP]           1ff31705-f488-44a4-ba5f-e2fe9eff4b96
sr0

其中,第二个最接近你想要的。要以编程方式阅读,请使用libblkid