获取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
.
使用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
.