如果未加载模块,则确定块设备的文件系统

Determining filesystem for block device if module not loaded

我想这个问题已经有一段时间了。使用 Linux 并插入例如U 盘或通过 USB 的外部存储设备,如果内存中当前未加载正确的模块,内核如何确定该设备上的文件系统?

假设外部存储设备为ext4格式。在插入设备时,ext4 模块还没有加载到内存中。现在,通常内核会尝试通过调用相应模块的适当 *_fill_super 函数来探测不同的文件系统。但这只有在探测时甚至存在模块的情况下才有效。在正确的文件系统模块尚未加载到内存中的情况下,内核如何处理挂载设备?

对我来说,这似乎是一种先有鸡还是先有蛋的问题,因为确定正确模块所需的 *_fill_super 函数位于模块本身。所以内核想要探测设备上的文件系统,但为此它需要加载适当的模块。但当时并没有加载,所以内核既不知道设备上有什么文件系统,也不知道首先要加载什么文件系统模块。

内核如何处理这个问题?感谢您提供任何解释,甚至是对发生此逻辑的代码的引用。

简而言之:除非某些 用户 space 配置文件知道文件系统,否则 mount 将无法自动检测此文件系统,如果它的驱动程序未加载。

.. usually the kernel tries to probe the different filesystems by calling the appropiate *_fill_super function of the respective module.

这不完全正确。 mount system call 接受文件系统名称作为参数,并且此参数对于所有情况都是 必需的 除了重新安装,这超出了当前问题的范围。此外,在执行 mount 系统调用时,文件系统驱动程序预计 已经加载

也就是说,内核本身从不“探测”文件系统,内核只是尝试用户请求的文件系统space。

实际上是用户spacetool mount进行了探测

在探测之前,mount 工具可能会尝试通过检查 /etc/fstab、使用 blkid 或其他机制来 推断出 文件系统。

在所有推导机制都失败后,mount 工具根据 /etc/filesystems 文件 探测 文件系统。此文件可能包含 预定义(静态)文件系统列表。

在尝试 /etc/filesystems 中的每一行都失败后(或者如果文件不存在),mount 工具 probes 中列出的文件系统/proc/filesystems。此文件由内核提供,包含所有 已注册(为其加载驱动程序)的文件系统。

尝试 /proc/filesystems 中的每一行都失败后,mount 工具报告错误。


mount 工具选择文件系统的算法在 man mount under the paragraph "If no -t option is given ..". The question 中有描述,它的答案也描述了类似的事情。