Linux跨文件系统的文件夹和文件映射关系
VFS(Virtual File System) Everything is a file 是Unix的设计理念,由其派生的Linux也如此。 Unix系统I/O模型最为显著的特征之一就是I/O通用性,也就是同一套系统调用open(), read(),write(),close()所执行的I/O操作,可以在所有文件类型上被执行。 文件系统有很多种实现。 Linux系统中通过VFS(Virtual File System),定义一系列通用接口。所有与文件交互程序都会按照接口进行操作。 每种文件系统都会提供VFS接口实现。 依赖倒置原则(DIP):高层的模块不依赖底层, 而依赖高层的抽象。 文件模型 主要由以下对象模型组成: Superblock object:存放文件系统信息。 inode object:存放具体文件一般信息, 文件控制信息,唯一标识一个文件。 file object:存放文件与进程间交互信息。 dentry object:存放dentry与文件相关信息,便于文件检索。 图片来在《Understanding The Linux Kernel》 可以看到在inode object和superblock object和实际的文件系统有直接关系的, 而file object和dentry object与文件系统是没有映射的,其中,dentry object起到了中间纽带的作用。 文件使用 每一个进程将打开的文件的描述符(file descriptor)保存在一个数组中, 当调用open()时,系统调用返回文件描述符,供后续read(),write()等使用, 这些系统调用获取file的数据结构后,通过VFS函数的调用,实现相关功能。 下图展示了相关数据结构之间的关系。 图片来自 https://myaut.github.io/dtrace-stap-book/kernel/fs.html 从上图可以看到, 进程通过task_struct中的files可以获得file object,包括文件打开方式f_mode,如O_RDONLY、O_RDWR, 文件偏移位置f_pos,如seek函数使用到, 文件相关的系统调用都可以通过file object对文件进行操作。 每一个文件可以通过inode object和dentry object进行标识, inode object包含一些文件本身的一些信息, 如权限信息,比如i_uid,i_gid, dentry object包含文件的目录结构信息,方便通过文件名进行查找。 虽然dentry和inode标识文件系统的文件, 但是系统在不同位置可以安装多个文件系统, 这个位置就是mountpoint, linux中通过vfsmount 结构的mnt_sb指向标识文件系统super_block, 通过mnt_root指向安装点, 就可以方便跨文件系统的文件管理。 文件映射 下面用调试工具看下跨文件系统映射关系 ...