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

问题描述

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

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

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

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

解决方法

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

.. 通常 内核 会尝试通过调用相应模块的适当 *_fill_super 函数来探测不同的文件系统。

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

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

实际上,执行探测的是用户空间 tool mount

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

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

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

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


mount 工具选择文件系统的算法在 man mount 中的“If no -t option is given ..”段落下进行了描述。 The question 及其答案描述了类似的事情。