文件系统的分类:
- 磁盘文件系统
- 内存虚拟文件系
- 统网络文件系统
通用的模型VFS对上(用户)解决了各种不同文件系统的统计接口问题,同时对下(具体的文件系统)兼容各种新的文件系统,让linux变得更加强大灵活
VFS的架构图
实现思路:
- 定义一个最小的通用模型
- 定义一个强大的模型,实现都可以选择性的实现(ext2->VFS)
下面是通过inode查找一个文件的过程(实际的实现过程中会有缓存来加速文件查找)
链接
- 软链接:有一个目录项,指向独立INODE,INODE不存文件数据,存指向真实文件的路径,可以在不同分区
- 硬链接:有一个目录项,没有独立INODE,指向原始INODE,并且原始INODE的引用计数加1 ,不能在不同分区
编程接口
- 文件描述符(系统提供)
- 流操作(C库)
万物皆文件
- 字符和块设备文件
- 管道文件
- 用于所有网络协议的套接字(网络设备例外)
- 终端
VFS的主要数据结构
INODE操作:用来操作文件元数据和文件管理,创建文件,删除文件,重命名文件,创建链接
文件操作:用来操作数据的,如读写文件,操作文件位置,创建内存映射
struct inode {
umode_t i_mode; //访问权限
unsigned short i_opflags;
kuid_t i_uid; //文件的创建用户UID
kgid_t i_gid; //文件的创建用户GID
unsigned int i_flags;
#ifdef CONFIG_FS_POSIX_ACL
struct posix_acl *i_acl;
struct posix_acl *i_default_acl;
#endif
const struct inode_operations *i_op; //指向文件内容相关操作集合(C++对象方法指针)
struct super_block *i_sb; //文件所在的分区的超级块
struct address_space *i_mapping; //文件内存映射
#ifdef CONFIG_SECURITY
void *i_security;
#endif
/* Stat data, not accessed from path walking */
unsigned long i_ino; //INDOD的编号
/*
* Filesystems may only read i_nlink directly. They shall use the
* following functions for modification:
*
* (set|clear|inc|drop)_nlink
* inode_(inc|dec)_link_count
*/
union {
const unsigned int i_nlink; //文件的硬链接数
unsigned int __i_nlink;
};
dev_t i_rdev; //指向存储的真实设备(用dev_t代表)
loff_t i_size; //文件大小(以字节为单位)
struct timespec i_atime; //访问时间
struct timespec i_mtime; //修改时间
struct timespec i_ctime; //创建时间
spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */
unsigned short i_bytes;
unsigned int i_blkbits;
blkcnt_t i_blocks; //文件大小(以块为单位,块的对应的字节数由文件系统格式化时指定)
#ifdef __NEED_I_SIZE_ORDERED
seqcount_t i_size_seqcount;
#endif
/* Misc */
unsigned long i_state;
struct mutex i_mutex;
unsigned long dirtied_when; /* jiffies of first dirtying */
unsigned long dirtied_time_when;
struct hlist_node i_hash; //全局inode_hashtable的链接元素
struct list_head i_wb_list; /* backing dev IO list */
struct list_head i_lru; /* inode LRU list */
struct list_head i_sb_list;
union {
struct hlist_head i_dentry; //包含的目录项(如果这个inode代表的是一个目录)
struct rcu_head i_rcu;
};
u64 i_version;
atomic_t i_count; //同时引用的进程数
atomic_t i_dio_count;
atomic_t i_writecount;
#ifdef CONFIG_IMA
atomic_t i_readcount; /* struct files open RO */
#endif
const struct file_operations *i_fop; /* former ->i_op->default_file_ops */ //指向文件管理相关操作集合(C++对象方法指针)
struct file_lock_context *i_flctx;
struct address_space i_data;
struct list_head i_devices; //用于特定设备同时对应多个inode文件时(chroot时)
union {
struct pipe_inode_info *i_pipe; //用于指向管道数据结构
struct block_device *i_bdev; //用于指向块设备专用数据结构
struct cdev *i_cdev; //用于指向字符设备专用数据结构
};
__u32 i_generation;