Linux以编程方式查找UUID的分区

时间:2016-08-01 20:13:28

标签: c linux uuid

所以我在我的工作中正在研究一个相当简单的自定义Linux构建。我正试图找到一种方法来使用C来获取硬盘驱动器和zram分区的UUID。

libblkid不可用,/etc/blkid.tab不存在,/etc/fstab仅提供文件系统名称和类型。 /etc/mtab是空的。 udev也不可用。 /dev/disk/...不存在。

/proc/partitions可用,但即使在普通的Linux系统上也不提供UUID。

fdisk仅提供有关实际磁盘的信息,不提供UUID,也不提供有关闪存的信息。

我查看了blkid的来源,它似乎在阅读/etc/blkid.tab,除非通过环境变量提供了另一个文件作为信息来源。我试图找出是否有其他方法可以打开驱动器并找到UUID,或者linux是否以其他我不知道的方式存储它们。

3 个答案:

答案 0 :(得分:1)

UUID不是分区设置,它存储在文件系统级别。

  

# tune2fs -l /dev/sda4|grep UUID Filesystem UUID: 7a7be8cb-8271-4442-b0c3-2c1df2eaab6c

答案 1 :(得分:1)

您可以查看/dev/disk/by-uuid中的符号链接。您可以使用诸如opendirreadlink之类的POSIX系统调用。您还可以运行ls -l /dev/disk/by-uuid,其输出类似于:

lrwxrwxrwx 1 root root 10 Jul 27 11:23 ec13636b-a731-41d0-8273-442f194cf37f -> ../../sda5
lrwxrwxrwx 1 root root 10 Jul 27 11:23 ed8799bc-34c3-4d37-b1b2-44562423a298 -> ../../sda1

答案 2 :(得分:1)

首先,您是否知道两个分区和文件系统都有UUID?两者都不存在。 Linux本身并不了解UUID,整个概念是由系统上安装的程序在用户空间处理的,据我所知,这些程序都使用libblkid。

你说你想要分区UUID,但实际上你可能想要文件系统UUID。

Libblkid

抱歉,但当你说“libblkid不可用”时,这甚至意味着什么?我有点怀疑。毕竟Libblkid是开源和免费软件,所以如果你没有libblkid的副本,那么获得一个就是微不足道的。 Libblkid也是用C语言编写的,你已经用C编写代码了,所以必须有一个C编译器来编译libblkid。如有必要,您可以制作静态版本。

libblkid的主要工作方式是直接从块设备读取数据。对于磁盘,这意味着要读取分区表。对于文件系统,这意味着从文件系统超级块读取。从理论上讲,如果你不能使用libblkid(这是非常不寻常的,即使对于精简系统),你也可以自己解析分区表或超级块。

Libblkid确实在/etc/blkid.tab使用了一个缓存文件,但这只是一个缓存而且没有必要。

UUID的其他接口,如/dev/disk/by-uuid,是在用户空间中由使用libblkid的程序创建的。

Filesystem UUIDs

通常,如果您在谈论/dev/disk/by-uuid中看到的UUID,它们与您在/etc/fstab中使用的UUID相同,那么您正在谈论文件系统UUID。 libblkid库为各种文件系统解码超级块做了很多工作。例如,您可以看到Ext2文件系统的UUID出现在libblkid src/superblocks/ext.c line 48中。 Libblkid支持许多文件系统类型,您可以在src/superblocks目录中看到它们。

并非所有文件系统类型都具有UUID。 Ext2有一个UUID,但FAT32没有,但是它有一个不同的ID,用于相同的目的。

分区UUID

如果你真的需要唯一的分区UUID,你也可以得到它。 Libblkid从分区表中读出这个。只有某些类型的分区表具有分区的UUID。 GPT可以,但DOS分区表没有。