因此,我正在工作中开发相当精简的定制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是否以我不知道的其他方式存储它们。
最佳答案
首先,您是否知道分区和文件系统都有UUID?都不总是存在。 Linux本身并不了解UUID,整个概念是由系统上安装的程序在用户空间中处理的,据我所知,这些程序都使用libblkid。
您说要分区UUID,但实际上可能需要文件系统UUID。
Libblkid
抱歉,但是当您说“libblkid不可用”时,这甚至意味着什么?我有点怀疑。毕竟,Libblkid是开放源代码和免费软件,因此,如果您没有libblkid副本,那么获取libblkid就是一件很简单的事情。 Libblkid也是用C编写的,并且您已经在用C编写代码,因此您必须具有C编译器才能编译libblkid。您可以根据需要制作静态版本。
libblkid的主要工作方式是直接从块设备读取数据。对于磁盘,这意味着读取分区表。对于文件系统,这意味着从文件系统 super 块读取。从理论上讲,如果您不能使用libblkid(即使对于精简的系统也很不常见),则可以解析分区表或自己进行 super 块化。
Libblkid确实在/etc/blkid.tab
处使用了一个缓存文件,但这只是一个缓存,没有必要。
UUID的其他接口(interface)(如/dev/disk/by-uuid
)由使用libblkid的程序在用户空间中创建。
文件系统UUID
通常,如果您正在谈论在/dev/disk/by-uuid
中看到的UUID,它们与在/etc/fstab
中使用的UUID相同,那么您在谈论的是文件系统UUID。 libblkid库完成了解码各种文件系统的 super 块的艰苦工作。例如,您可以看到Ext2文件系统的UUID出现在libblkid src/superblocks/ext.c line 48中。 Libblkid支持许多文件系统类型,您可以在src/superblocks
目录中看到它们。
并非所有文件系统类型都具有UUID。 Ext2具有UUID,而FAT32没有,但具有不同的ID,具有相同的用途。
分区UUID
如果您确实需要唯一的分区UUID,也可以获取。 Libblkid将从分区表中读取该内容。只有某些类型的分区表才具有分区的UUID。 GPT可以,但是DOS分区表不可以。
关于c - Linux以编程方式找到分区的UUID,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38707338/