【问题标题】:Determine what filesystem a partition is of确定分区属于哪个文件系统
【发布时间】:2010-09-27 16:25:23
【问题描述】:

操作系统如何知道一个分区正在使用什么文件系统?也就是说,FAT16/32、NTFS、ext2/3等如何区分?

【问题讨论】:

    标签: operating-system filesystems


    【解决方案1】:

    如果您在 Windows 上使用 Win32 API,则可以调用 GetVolumeInformation (http://msdn.microsoft.com/en-us/library/aa364993.aspx) 来确定给定安装卷上存在的文件系统类型。

    例如,如果您尝试检测 D: 上存在的文件系统,那么您可以调用:

    WCHAR FSType[512];    
    
    if (GetVolumeInformationW(L"D:\\", NULL, 0, NULL, NULL, NULL, FSType, ARRAYSIZE(FSType))) {
        wprintf(L"FS type = %s\n", FSType);    
    }
    

    这只有在文件系统被正在运行的操作系统“识别”和“可挂载”的情况下才有效。

    【讨论】:

      【解决方案2】:

      有多种方法,具体取决于硬件类型。

      硬盘有一个主引导记录,后跟一个分区表PT 包含此驱动器上的分区列表。该列表中的每个条目都包含(除其他外)一个数字 System ID 字段,用于指定分区文件系统。

      软盘和大多数 U 盘没有 PT。在这里,您必须查看分区本身。 第一个分区扇区(称为Boot Sector)通常包含一个系统 ID与 PT 中的系统 ID 格式完全不同。此外,扇区内的 ID 位置可能因文件而异系统。

      【讨论】:

      • 其实也不知道。有一些猜测的方法。但没有操作系统广泛使用它。大多数时候,它被告知。通常,引导管理器会使用它也被告知要使用的信息来安装分区。然后启动内核。这将使用它被告知使用的 FS 挂载分区(在 linux /etc/fstab 中)
      • @gcb:如果告诉操作系统使用哪个FS,/etc/fstab中的信息是从哪里来的?它是由某个程序编写的,该程序从我提到的结构中读取信息。
      • 呃...实际上,虽然上面可能是真的(编写 /etc/fstab 内容的程序),但 /etc/fstab 实际上被设计为由用户手动创建。换句话说,“程序”将遵循某些启发式方法来确定每个分区是什么文件系统,但它并不总是成功,在这种情况下,如果用户需要更正 /etc/fstab 中的数据,则由用户决定能够。说到启发式,请看我的回答。
      • 我记得在过去的 Linux 2.2 时代我是手写我的 /etc/fstab,但现代 Linux 发行版倾向于识别分区并为你编写 fstab
      【解决方案3】:

      每个文件系统都有一些头信息,称为“超级块”。超级块包含幻数或有关文件系统类型的其他信息。

      MBR 分区表还存储了一个 8 位的值,表示分区类型。

      【讨论】:

        【解决方案4】:

        首先,分区表中有一个指定分区类型的字节。其次,每个分区都有不同的标题和结构,因此通过一些分析可以非常精确地确定。

        【讨论】:

          【解决方案5】:

          假设您有一个MBR,那么有关 4 个主分区的详细信息位于 0x01BE。描述分区的十六个字节之一是类型标识符。

          0x06 的 id 是 fat16,0x0B 是 FAT32,0x07 是 NTFS,0x82 是 Linux 分区。

          除此之外,文件系统在分区内的特定位置具有可以检测到的结构。

          【讨论】:

            【解决方案6】:

            处理设置文件系统或挂载它们的操作系统工具将使用各种启发式方法来尝试检测文件系统,例如查找它们具有的功能。例如,当“挂载”工具没有被告知要挂载的分区的文件系统类型时,它会按照“手册”页面的描述进行操作:

            If no -t option is given, or if the auto type is  specified,  mount  will
            try to guess the desired type.  Mount uses the blkid library for guessing
            the filesystem type; if that does not turn up anything that looks  familiar,
            mount  will try to read the file /etc/filesystems, or, if that does
            not exist, /proc/filesystems.  All of the filesystem types  listed  there
            will  be  tried, except for those that are labeled "nodev" (e.g., devpts,
            proc and nfs).  If /etc/filesystems ends in a line with a single *  only,
            mount will read /proc/filesystems afterwards.
            

            blkid 库和“disktype”工具将,如果你给它一个磁盘块设备(如 /dev/sda)或分区块设备(如 /dev/sda1),使用启发式和有根据的猜测来确定什么住在那个设备上。非常有用的工具,尤其是在没有磁盘只有虚拟分区的xen环境中,不能只查询主引导记录。

            在设置新的基于 Linux 的系统(如 Ubuntu)时,会使用类似的工具来检测文件系统。

            【讨论】:

            • 请再次阅读问题。就是“操作系统怎么知道”
            【解决方案7】:

            在 linux 上,当您挂载文件系统时,您可以传递 -t ext3/ext3 等 - 如果您查看 /etc/fstab(或等效项),每个驱动器可能都列出了其 fs 类型。

            然后自动执行它,有超级块/等效(认为 Windows 类型将其称为其他东西)...

            看这个:

            超级块

            每个文件系统都是不同的,它们 具有 ext2、ext3 等类型。进一步 每个文件系统的大小为 5 GB, 10 GB 和挂载状态等状态。 简而言之,每个文件系统都有一个 超级块,其中包含信息 关于文件系统如:

            * File system type
            * Size
            * Status
            * Information about other metadata structures
            

            取自:

            http://www.cyberciti.biz/tips/understanding-unixlinux-filesystem-superblock.html

            【讨论】:

              猜你喜欢
              • 2023-03-05
              • 1970-01-01
              • 1970-01-01
              • 2013-05-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-08-06
              • 2010-09-30
              相关资源
              最近更新 更多