操作系统如何知道分区正在使用什么文件系统?换言之,FAT16/32、NTFS、ext2/3等如何区分?
7 回答
如果您在 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);
}
但是,这仅在文件系统被正在运行的操作系统“识别”和“可挂载”时才有效。
几乎每个文件系统都有一些头信息,称为“超级块”。超级块包含幻数或有关文件系统类型的其他信息。
MBR 分区表还存储了一个 8 位的值,表示分区类型。
首先,分区表中有一个指定分区类型的字节。其次,每个分区都有不同的标题和结构,因此通过一些分析可以非常精确地确定它。
处理设置文件系统或挂载它们的操作系统工具将使用各种启发式方法来尝试检测文件系统,例如查找它们具有的功能。例如,当“挂载”工具没有被告知要挂载的分区的文件系统类型时,它会按照“手册”页面的描述进行操作:
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)时,会使用类似的工具来检测文件系统。
在 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