如何从 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获取该信息。如果需要,只需打开原始二进制卷并从那里读取数据。
但是,有个大问题就是每个文件系统都不一样,所以你需要特殊的代码来管理每个分区类型。幸运的是,有人已经完成了艰苦的工作,并且您有 blkid
,util-linux
的一部分在大多数 Linux 发行版中可用。如果你需要它,你可以直接调用程序,或者link到库libblkid
做这些辛苦工作。
当然,要使用blkid
/libblkid
,您需要对块设备具有读取权限,即root权限。如果您认为读取标签不需要 root 访问权限,来自 udev
的人也有同样的想法,这就是为什么有一个 udev 规则在文件系统首次检测到时复制标签(运行 blkid
当然)。这是您已经知道的ID_FS_LABEL_ENC
。
如何使用 /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获取该信息。如果需要,只需打开原始二进制卷并从那里读取数据。
但是,有个大问题就是每个文件系统都不一样,所以你需要特殊的代码来管理每个分区类型。幸运的是,有人已经完成了艰苦的工作,并且您有 blkid
,util-linux
的一部分在大多数 Linux 发行版中可用。如果你需要它,你可以直接调用程序,或者link到库libblkid
做这些辛苦工作。
当然,要使用blkid
/libblkid
,您需要对块设备具有读取权限,即root权限。如果您认为读取标签不需要 root 访问权限,来自 udev
的人也有同样的想法,这就是为什么有一个 udev 规则在文件系统首次检测到时复制标签(运行 blkid
当然)。这是您已经知道的ID_FS_LABEL_ENC
。