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

Linux 如果模块未加载,则确定块设备的文件系统,linux,linux-kernel,filesystems,kernel-module,Linux,Linux Kernel,Filesystems,Kernel Module,我想知道这件事已经有一段时间了。当使用Linux并通过USB插入USB记忆棒或外部存储设备时,如果内存中当前未加载正确的模块,内核如何确定该设备上的文件系统 假设外部存储设备是ext4格式的。在插入设备时,ext4模块尚未加载到内存中。现在,内核通常试图通过调用相应模块的appropiate函数来探测不同的文件系统。但是,只有当模块在探测时出现时,这才有效。在内存中尚未加载正确的文件系统模块的情况下,内核如何处理装载设备 对我来说,这似乎是一种鸡蛋问题,因为确定正确模块所需的*_fill_超级函

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

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

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


内核如何处理这个问题?我非常感谢对发生这种逻辑的代码的任何解释,甚至是引用。

简而言之:除非某个用户空间配置文件知道有一个文件系统,
mount
将无法在未加载驱动程序的情况下自动检测该文件系统

。。通常,内核试图通过调用相应模块的appropiate
*\u fill\u super
函数来探测不同的文件系统

事实并非如此。接受文件系统名称作为参数,该参数对于除重新装载以外的所有情况都是必需的,这超出了当前问题的范围。此外,在执行系统调用时,文件系统驱动程序预计已加载

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

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

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

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

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

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



使用
mount
工具选择文件系统的算法在“If no-t option is given…”一段中描述。它的答案描述了类似的事情。

“对我来说,这似乎是一种鸡蛋问题”-嗯,不是真的,如果内核没有模块,模块在USB设备中,这将是一个鸡蛋问题:谢谢解释,这就是我要找的。