获取HD/Partition个序列号

Get HD/Partition serial number

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

获得硬盘分区的(或多或少唯一的)序列号
GetVolumeInformation()

我的问题:Linux 有类似的东西吗?表示只有当有人格式化分区时才会更改的数字,并且可以通过编程方式检索?

谢谢!

在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);

  }

您可以使用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);

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

  • 原始设备标识符(认为 cat /proc/partitions)- 这不是唯一的序列号
  • 分区的 UUID - 可以通过 blkid 找到,并存储在分区本身中。您也可以手动解析 /dev/.blkid.tab - 格式很明显。
  • 磁盘标签 - 也存储在分区内。例如:
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.