如何从 sysfs 获取文件系统标签?

How can I get a filesystem label from sysfs?

如何使用 /sys 获取文件系统的标签?我知道我可以通过转到 /sys/class/block/<device> 获取有关块设备的大部分信息,例如/sys/class/block/sr1 对于我知道的具有文件系统标签 config 的 CD。我搜索了每一件物品,找到了除了标签之外的所有东西。

我确实深入研究了 lsblk 源代码,而这又取决于在 libudev 中调用 udev_device_new_from_subsystem_sysname,所以我仔细研究了它。它似乎填充了 属性 ID_FS_LABEL_ENC,但我无法弄清楚它从树中的什么地方获取它,除非它在其他地方跟踪它?

我只想使用 libudev,但需要在 C 程序之外访问。

我认为这里的问题是你似乎认为卷的标签是内核的东西,大小或免费 space。

但据我所知,它不是,内核根本不关心卷标,它只是从磁盘格式到用户空间的事情:没有内核 API获取该信息。如果需要,只需打开原始二进制卷并从那里读取数据。

但是,有个大问题就是每个文件系统都不一样,所以你需要特殊的代码来管理每个分区类型。幸运的是,有人已经完成了艰苦的工作,并且您有 blkidutil-linux 的一部分在大多数 Linux 发行版中可用。如果你需要它,你可以直接调用程序,或者link到库libblkid做这些辛苦工作。

当然,要使用blkid/libblkid,您需要对块设备具有读取权限,即root权限。如果您认为读取标签不需要 root 访问权限,来自 udev 的人也有同样的想法,这就是为什么有一个 udev 规则在文件系统首次检测到时复制标签(运行 blkid当然)。这是您已经知道的ID_FS_LABEL_ENC