了解如何在挂载之前确定文件系统类型

了解如何在挂载之前确定文件系统类型

是否有任何命令行工具可以在挂载块设备之前确定其文件系统类型?如何实现?

我认为这是可能的,因为我通常使用

$ mount /dev/sdXX /mnt

mount自动为您确定文件系统。如果存在该文件系统的驱动程序,现代 GUI 工具甚至无需挂载文件系统即可探测磁盘使用情况和其他信息。

这里的情况是

  • 分区类型和文件系统类型可能不匹配。
  • 大多数 Linux 文件系统使用分区类型“83”,它没有提供有关其包含的 fs 的太多信息。
  • 相应的驱动器可能不存在,缺少 xfsprogs、hfsprogs 等。

当自动挂载失败时,如果手头有任意分区或磁盘映像,则尝试每个 fs 类型候选直到找到正确的类型是不可行的。或者如果文件系统损坏了怎么办?您无法使用指定工具对其进行诊断,因为它的 fs 类型未知。

我认为超级块是大多数文件系统存储其标识符的地方。但不同的文件系统在不同的地方写入超级块。

开头的 XXX 字节原始数据转储是否足以确定 fs 类型? 是否有关于应在何处以及以何种格式存储此类信息的标准?

非常感谢您对这个问题的任何见解。

=-=

更新:

感谢 philag 的回答。因此通常的file方法实际上是最好的方法。

我的问题只是我遇到了一个奇怪的文件系统,其file输出相当没用。

深入研究file的文档(也许它还利用了系统调用)应该可以帮助我更好地理解这个问题。

答案1

第一个字节(不是字面上的,但通常在前 4KiB)包含一个签名,该签名经过精心设计以使其唯一。该file实用程序可以确定这些签名。自己看看:

$ # Create an example file we can write to. vdisk stands for your partition.
$ dd if=/dev/zero of=vdisk bs=1M count=40
$ mkfs.ext2 -qF vdisk
$ file vdisk
vdisk: Linux rev 1.0 ext2 filesystem data, UUID=cce25572-...-f4eba2957279
$ mkfs.xfs -fq vdisk
$ file vdisk
vdisk: SGI XFS filesystem data (blksz 4096, inosz 256, v2 dirs)
$ # How does file find out? Let's look inside the partition
$ hexdump vdisk -C  | head -n 1
00000000  58 46 53 42 00 00 10 00  00 00 00 00 00 00 28 00  |XFSB..........(.|

要获取可识别的文件系统的详细列表,请file查看magic/Magdir/filesystemsfile 源代码如果你只对内核支持的那些感兴趣,请检查include/linux/magic.h在你的内核源代码中。

如果您对块设备特殊感兴趣,该-s选项也很有用,因为-L它将遵循(取消引用)符号链接,而不是对链接本身进行操作。例如,如果使用逻辑卷和设备映射器,则如下所示:

file -Ls /dev/mapper/home

可能会有用。

相关内容