是否有任何命令行工具可以在挂载块设备之前确定其文件系统类型?如何实现?
我认为这是可能的,因为我通常使用
$ 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/filesystems
file
源代码如果你只对内核支持的那些感兴趣,请检查include/linux/magic.h
在你的内核源代码中。
如果您对块设备特殊感兴趣,该-s
选项也很有用,因为-L
它将遵循(取消引用)符号链接,而不是对链接本身进行操作。例如,如果使用逻辑卷和设备映射器,则如下所示:
file -Ls /dev/mapper/home
可能会有用。