虚拟文件系统VFS-片段一
文件系统类型
基于磁盘的文件系统
如FAT、EXT4
虚拟文件系统
如proc
网络文件系统
顾名思义,网络文件系统还将网络通信封装起来,这意味可以直接通过通信访问另一台设备的文件系统。
man fs # 查看文件系统,其实这里只是内存中使用的inode,底层介质上的inode内容会更少
文件系统基本概念
文件描述符
对于一个用户进程来说,一个文件由一个fd整数进行标识。两个用户进程,可以使用相同的fd整数,但是不会指向相同的文件,这是由于(struct file)唯一标识文件。task_strcut包含了一个成员,其中包含了所有打开的文件。
inode
内核处理文件的关键就是inode,inode中包括文件(目录)的元数据(访问权限、上次修改日期)、指向文件数据的指针等,但是并不包括文件名。假如访问/usr/bin/cat,查找从inode开始,表示根目录/,该目录由一个inode进行标记,其中数据段存的是根目录下的各个目录项,每个目录项由两个元素组成
- inode的编号
- 文件或目录的名称
系统中所有的inode都有一个编号,唯一标识一个inode,文件名和inode之间的关系通过编号建立。不通过名字标识inode的原因是,这样复用率高,更加高效。
每个修改过的inode会被记录在超级块列表中,被称为脏inode,内核会定期扫描列表,将修改写回底层硬件。
链接
链接可以认为是一种目录项,用于建立两种文件系统对象之间的联系,有两种类型的连接,符号链接与硬链接。
每个符号链接都由一个特定的inode进行标识,其中数据端包含了一个字符串,标识目标文件的路径。
硬链接作为一个inode,是使用一个现存的inode编号,此时同时绑定在这个编号上的文件,会无法区分文件是原来的,还是后来建立的。那么此时假如要删除硬链接会删去inode以及相关信息,这样会导致另一个文件也无法访问。
解决方案是增加一个计数器,但内核仍然无法区分删除的是硬链接还是原文件,但是可以保证一个文件删除之后,计数器减1,从而不会导致另一个文件因为硬链接释放inode和相关文件信息而无法进行访问,计数器减为0时才删除inode。
思考:为什么要设计硬链接和符号链接?
接口
每一个文件都要通过open\openat打开,成功之后内核会返回一个整数表示fd,这个fd时大于2的,这是因为0表示标准输入 、1表示标准输出、2表示标准错误输出。
使用fd作为通信手段的方式包括:
- 字符和块设备(/dev,真正的文件)
- 进程之间的管道
- 所有网络协议的套接字
- 用于交互输入和输出的终端
超级块
超级块中包含文件系统的关键信息(长度,大小、inode数量和空闲数量等),以及读、写、操作inode的函数指针,内核建立了一个链表,维护所有活动文件系统的超级块实例。
虚拟文件系统(VFS)
虚拟文件的系统(内核)的出现是为了解决底层文件系统无法向上提供统一调用的问题,所以通过VFS做的抽象层提供统一接口(系统调用)进行访问,而不用关心底层的细节。VFS提供了一种机制统一不同的文件系统的inode操作。目前来说,ubuntu已经有EXT4文件系统。在此情况下,内核可以支持多种文件系统包括FAT、NFS、proc等实现。VFS能够管理文件、目录以及文件对象。
df -Th # 查看磁盘文件系统
VFS主要由两部分组成
文件(inode操作、文件操作作用于文件的数据内容)
VFS 层定义了通用
inode结构,有些文件系统如FAT是没有inode结构的,VFS运行时,会自动加载inode相关信息。以及通用的inode操作集合,称为inode_operations,它包括了对inode进行操作的函数指针,如打开、读取、写入、释放等每个inode都有一个i_list成员,存储VFSinode。文件操作集合结构为
struct file_operations包括read\write\aio_read\aio_write\mmap\open\poll\writev\readv\pen\等系统调用,值得一提select/poll系统调用都是poll实现的。文件系统(读取超级块)
VFS支持的底层文件系统通过一种内核特殊对象连接到VFS,该对象提供了一种读取超级块的方法。
VFS 定义了一系列的数据结构和操作,如
struct super_block(超级块,描述整个文件系统)。VFS有目录项缓存机制,能够达到快速访问此前查找操作的结果。该目录项由结构struct dentry建立。所有的dentry实例保存在一个散列表中,由一个hashtable实现,使用d_hash解决散列冲突问题。
VFS文件系统注册
VFS提供了两种操作mount和umount装载\未装载文件系统,每个装载的文件系统都会 有一个vfsmount结构。
mount # 查看文件系统装载情况
虚拟文件系统VFS-片段一的更多相关文章
- 虚拟文件系统(VFS)
原文链接:http://www.orlion.ga/1008/ linux在不同的文件系统之上做了一个抽象层,使得文件.目录.读写访问等概念都成为抽象层概念,这个抽象层被称为虚拟文件系统(VFS). ...
- 使用 /proc 文件系统来访问 linux操作系统 内核的内容 && 虚拟文件系统vfs及proc详解
http://blog.163.com/he_junwei/blog/static/19793764620152743325659/ http://www.01yun.com/other/201304 ...
- 虚拟文件系统VFS
Linux的文件系统是由虚拟文件系统作为媒介搭建起来的,虚拟文件系统VFS(Virtual File System)是Linux内核层实现的一种架构,为用户空间提供统一的文件操作接口.它在内核内部为不 ...
- Linux虚拟文件系统VFS解决
参考<Linux内核设计与实现> 虚拟文件系统(VFS)它是linux核心和详细I/O一个普通的访问接口之间的包装设备,通过这层界面,linux内核能够以同一的方式訪问各种I/O设备. 虚 ...
- linux文件系统体系结构 和 虚拟文件系统(VFS)
图 1. Linux 文件系统组件的体系结构 用户空间包含一些应用程序(例如,文件系统的使用者)和 GNU C 库(glibc),它们为文件系统调用(打开.读取.写和关闭)提供用户接口.系统调用接口的 ...
- linux的虚拟文件系统VFS
虚拟文件系统(virtual file system),别名虚拟文件系统开关,是linux中的一个软件层,向用户空间提供文件系统操作接口. VFS包含的系统调用包括open(2).stat(2).re ...
- linux虚拟文件系统vfs
linux可以挂载不同的文件系统(EXT2,FAT,NTFS),用同一的样式呈现给用户,读写操作用起来都一样,这是怎样做到的呢? linux内核在各种不同的文件系统格式上做了一个抽象层,使得文件.目录 ...
- Linux虚拟文件系统(VFS)学习
虚拟文件系统(Virtual Filesystem)也可称之为虚拟文件系统转换(Virtual Filesystem Switch),是一个内核软件层,用来处理与Unix标准文件系统相关的全部系统调用 ...
- (转)虚拟文件系统(VFS)浅析
http://www.cnblogs.com/zsw-1993/p/5048144.html 在我看来, "虚拟"二字主要有两层含义: 1, 在同一个目录结构中, 可以挂载着若干种 ...
- Linux虚拟文件系统–VFS简介
http://www.embeddedlinux.org.cn/emb-linux/file-system/201712/20-7907.html 导读 Linux中可以支持多种文件系统,而且支持各种 ...
随机推荐
- NAT类型发现
一.前言 之前一篇文章中,提出了一个判断NAT类型的方案.该方案是自己研究设计的,比较粗糙.近期研读了关于STUN的一些协议标准,其中RFC3489中就包含了判断NAT类型的标准方案. 与自己设计的方 ...
- 移动web布局方法
继续更新移动端的一个布局,这也是经典中的经典,当初只知道个rem和vwvh适配,其实这里面还有很多的门道不只是一个适配这么简单 一.前置 1.背景缩放 我们都知道做移动端,给的图都是二倍图,你拿来用直 ...
- bing生成的汉服美女。。
- Java -jar 启动程序参数说明
Springboot环境下的启动参数说明 # Java启动命令语法: java [options] -jar file.jar [arguments] java -jar [options] file ...
- Idea 2020.1 编译SpringBoot项目Kotlin报错
导读 今天公司有个项目莫名其妙的运行不起来,提示Kotlin版本兼容问题,网上找到解决方案后,整理下来. 错误信息 Error:Kotlin: Module was compiled with an ...
- 作业错题集锦(pta英文数据结构)
A graph with 30 vertices and 40 edges must have at most twenty one connected component(s). 要计算最大连通分量 ...
- 测试人必会 K8S 操作之 Dashboard
在云计算和微服务架构的时代,Kubernetes (K8S) 已成为管理容器化应用的标准.然而,对于许多新手来说,K8S 的操作和管理常常显得复杂而神秘.特别是,当你第一次接触 K8S Dashboa ...
- 【java深入学习第1章】深入探究 MyBatis-Spring 中 SqlSession 的原理与应用
前言 在使用 MyBatis 进行持久层开发时,通常会与 Spring 框架集成,以便更好地管理事务和依赖注入.在 MyBatis-Spring 集成中,SqlSession 是一个非常重要的概念.本 ...
- oeasy教您玩转vim - 74 - # 功能键Fn映射map进阶
映射map 回忆上次缩写的细节 上次了解到了:map映射 可以定义映射 :map ; : 查询映射 :map :map ; 还可以取消映射 :unmap 可以映射到指定的模式 :map 所有模式 ...
- char字符_C
字符的表示 字符类型由单引号' '包围,字符串由双引号" "包围. //正确的写法 char a = '1'; char b = '$'; char c = 'X'; char ...