虚拟文件系统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中可以支持多种文件系统,而且支持各种 ...
随机推荐
- 分享两个内置Google广告位的Typecho主题
前言 很多项目的开始都是因为情怀和热爱,"为爱发电"是一件很值得尊敬的事情,然而大量"为爱发电"的项目最后却不得不因"难以为继"而被迫停服. ...
- OOP课第三阶段总结
OOP课第三阶段总结 前言: 我想说的第一句是:"我感受到了设计上的极大缺陷",从一开始,我完全就忽略了引脚的存在.因为在第二阶段中,家电模拟大作业一.二在不需要考虑引脚的情况下也 ...
- PHP转Go系列 | GET 和 POST 请求的使用姿势
大家好,我是码农先森. 说到 HTTP 请求工具想必对我们做 Web 开发的程序员都不陌生,只要涉及到网络请求都必须使用.对于我们 PHP 程序员来说,最熟悉不过的就是 CURL 扩展,只要安装的这个 ...
- 【仿真】Carla简易安装 Window Ubuntu均适用 附ROS的简单连接 [0]
参考与前言 CARLA Documentation 官方文档 后续链接:[仿真]Carla介绍与使用 [1] 本篇创建于 2020/12/18,安装方式为压缩包安装,无需UE4等软件,但是前提是需要一 ...
- 钉钉应用开发-Python操作钉钉文档(excel版)
钉钉应用开发-Python操作钉钉文档 一: 服务端SDK下载 服务端SDK下载 - 钉钉开放平台 (dingtalk.com) pip3 install alibabacloud_dingtalk ...
- 洛谷P1176
#include<iostream> #include<utility> using namespace std; typedef long long ll; #define ...
- 0. 什么是C++
什么是C++ 是C语言的扩展,有如下的两个特性: 关注性能 与底层硬件紧密结合 对象生命周期精确控制 零成本抽象(Zero-overhead Abstraction) 引入大量利于工程实践的特性 三种 ...
- elementplus django drf 如何做到确认单据禁止删除
elementplus django drf 如何做到确认单据禁止删除 要在Django和Django Rest Framework(DRF)中实现禁止删除确认单据的功能,你可以通过以下步骤来 ...
- [rCore学习笔记 011]第1章作业题
编程题 第一题 在homework文件夹下创建homework-1-1,使用cargo创建工程: cargo new getFileName 在src下创建file_name.rs文件: // /ho ...
- [rCore学习笔记 00]总览
写在前面 本随笔是非常菜的菜鸡写的.如有问题请及时提出. 可以联系:1160712160@qq.com GitHhub:https://github.com/WindDevil (目前啥也没有 rCo ...