了解文件系统类型在安装之前是如何确定的

Hua*_*Tao 6 mount filesystems

是否有任何命令行工具可以在安装块设备\xef\xbc\x9f 之前确定块设备上的文件系统类型,这是如何实现的?

\n\n

我相信这是可能的,因为我通常使用以下方式挂载外部磁盘

\n\n
$ mount /dev/sdXX /mnt\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

这里的场景是这样的

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

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

\n\n

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

\n\n

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

\n\n

非常感谢对此问题的任何见解。

\n\n

=-=

\n\n

更新:

\n\n

感谢philag的回答。\n所以通常的file方法实际上是最好的方法。

\n\n

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

\n\n

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

\n

phi*_*hag 6

第一个字节(不是字面上的,但通常在前 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..........(.|
Run Code Online (Sandbox Code Playgroud)

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

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

file -Ls /dev/mapper/home
Run Code Online (Sandbox Code Playgroud)

可能有用。