我正在尝试关注this book以了解linux内核的工作原理。
我无法真正理解的是,我无法理解Linux如何检测文件系统类型,linux中支持的文件系统非常多,并且具有特殊性。
有人能指点我内核中的一段代码,它应该区分let和fat和ext4吗?
MBR不包含这些类型的信息,每种类型的超级块都不同。
发出mount /dev/whatever /media
时,无需添加文件系统类型。
答案 0 :(得分:17)
你无法找到它的原因是因为,在大多数情况下,它不在内核中 - 它位于mount
包中的用户空间util-linux
实用程序中。如果你没有给它一个文件系统类型,或者你给它一个“any”类型,mount
只是通过内核知道的所有文件系统的列表,并按顺序尝试每个文件系统。其中一个成功安装(如果没有,则返回错误)。
如何找出内核知道的文件系统类型?它会读取/proc/filesystems
文件,该文件遍历file_systems
中的fs/filesystems.c
链接列表。加载文件系统驱动程序时,它会在同一文件中调用register_filesystem
以将其自身添加到该列表中。例如,register_filesystem
中init_ext2_fs
中fs/ext2/super.c
的调用 - init_ext2_fs
是ext2模块的模块初始化函数。
当某人尝试使用错误的文件系统挂载设备时,某些文件系统会出现噪音并向内核调试日志打印错误,这就是为什么,当成功<时,您可能会看到有关“无效XFS文件系统”的错误/ em>安装ext4文件系统,如果mount
碰巧先尝试xfs。
答案 1 :(得分:7)
blkid -o value -s TYPE /dev/path/to/device
答案 2 :(得分:5)
来自mount手册页:
如果没有给出-t选项,或者指定了auto类型,mount将尝试猜测所需的类型。如果mount是使用blkid库编译的,那么猜测就是由这个库完成的。否则,mount通过探测超级块来猜测自己;如果没有看到任何看起来熟悉的东西,mount将尝试读取文件/ etc / filesystems,或者,如果不存在,/ proc / filesystems。除了那些标记为“nodev”的文件系统类型(例如,devpts,proc,nfs和nfs4)之外,将尝试列出那里列出的所有文件系统类型。如果/ etc / filesystems以只有一个*的行结束,那么mount将在之后读取/ proc / filesystems。
另外,我的ubuntu框有这个mount man页面(提到volume_id
库)
如果没有给出-t选项,或者指定了auto类型,mount将尝试猜测所需的类型。装载使用 用于猜测文件系统类型的blkid或volume_id库;如果那不会出现任何看起来的东西 熟悉的,mount会尝试读取文件/ etc / filesystems,或者,如果不存在,/ proc / filesystems。所有 列出的文件系统类型将被尝试,除了标记为“nodev”的那些(例如,devpts,proc 和nfs)。如果/ etc / filesystems以只有一个*的行结束,那么mount将在之后读取/ proc / filesystems。