所以我在我的工作中正在研究一个相当简单的自定义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是否以其他我不知道的方式存储它们。
答案 0 :(得分:1)
UUID不是分区设置,它存储在文件系统级别。
# tune2fs -l /dev/sda4|grep UUID Filesystem UUID: 7a7be8cb-8271-4442-b0c3-2c1df2eaab6c
答案 1 :(得分:1)
您可以查看/dev/disk/by-uuid
中的符号链接。您可以使用诸如opendir
和readlink
之类的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也是用C语言编写的,你已经用C编写代码了,所以必须有一个C编译器来编译libblkid。如有必要,您可以制作静态版本。
libblkid的主要工作方式是直接从块设备读取数据。对于磁盘,这意味着要读取分区表。对于文件系统,这意味着从文件系统超级块读取。从理论上讲,如果你不能使用libblkid(这是非常不寻常的,即使对于精简系统),你也可以自己解析分区表或超级块。
Libblkid确实在/etc/blkid.tab
使用了一个缓存文件,但这只是一个缓存而且没有必要。
UUID的其他接口,如/dev/disk/by-uuid
,是在用户空间中由使用libblkid的程序创建的。
通常,如果您在谈论/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,你也可以得到它。 Libblkid从分区表中读出这个。只有某些类型的分区表具有分区的UUID。 GPT可以,但DOS分区表没有。