【问题标题】:How to programmatically discover the filesystem without mounting the device (like "fdisk -l")如何在不挂载设备的情况下以编程方式发现文件系统(如“fdisk -l”)
【发布时间】:2012-09-19 13:16:04
【问题描述】:

我需要在 linux 中找到一个系统调用,以发现我的应用程序中连接的 pendrive 的文件系统。我发现“fdisk -l”可以完成这项工作,但是我现在需要了解这是如何发生的。我无法发现阅读 fdisk 代码,唯一确定的是:

  1. 结构体 statfs 或 statvfs 未使用;
  2. fdisk 不需要挂载设备来查找文件系统;

Obs:我的应用程序是用 C++ 编写的,并且在嵌入式 linux 系统中运行。

【问题讨论】:

  • 此链接中的答案解释了包含您要查找的信息的结构:superuser.com/questions/328974/…
  • 请注意:您确实需要安装设备本身(我认为“安装”在您提到设备时是一个不正确的术语,但我在这里使用它就像您自己使用它一样)。您可能会问如何在不安装最终存储在设备上的文件系统的情况下执行此操作。
  • 您可以通过strace -fv fdisk -l 来查看它正在使用的系统调用。
  • fdisk -l 仅报告分配给分区的标签,正如@GermannArlington 提供的链接所指出的那样,该标签与分区上的实际文件系统完全不同并且不需要匹配。 mount 的手册页记录了 mount 如何尝试确定分区上实际存在的文件系统类型,但这并不简单。

标签: c++ system call


【解决方案1】:

命令 fdisk -l 显示由 系统 ID 字节表示的文件系统。该字节位于主引导记录 (MBR) 内的分区表中。 MBR 通常存储在第一个硬盘的第一个柱面上(尽管任何硬盘都可以有 MBR)。

假设运行您的程序的用户具有权限,我认为您可以简单地使用 open 和 read 系统调用从磁盘读取 MBR:

char buf[446];
int fd = open("/dev/hda", O_RDONLY);
read(fd, buf, 446);

查看MBR Format,然后读出分区表以获取系统 ID 字节。这是系统 ID 字节的list of types

我只知道 Linux 上的 fdisk 是如何工作的,上次我检查它不支持 GPT 或任何其他分区格式。所以这个答案只与经典的 MBR 格式有关。

【讨论】:

  • 系统 ID 字节不足以可靠地检测某些文件系统。例如,值 0x83 被多个不同的 Linux 文件系统使用。
  • @John Bartholomew 是正确的。但是 OP 要求像 fdisk -l 这样的结果,它也有这个缺点..
【解决方案2】:

您可以使用util-linux 中的libblkid 来执行此操作。源代码分发包含一个示例,其中列出了指定设备上的分区,包括文件系统类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 2019-08-05
    相关资源
    最近更新 更多