Virtual File System了解

虚拟文件系统(以下简称vfs)是置于具体文件系统之上的抽象层,指定内核和具体文件系统的接口。允许client以统一方式访问不同的具体文件系统。比如可以通过VFS透明访问本地硬盘和网络设备就像在同一个设备访问一样。

superblock

每个挂载的文件系统都由vfs superblock表示,其包含

  • Device: 储存文件系统所在的设备
  • Inode pointers: mounted inode指针指向文件系统的第一个inode,convered inode指针指向文件系统挂载的目录。root文件系统没有convered
  • Blocksize: 文件系统的块大小(单位bytes)
  • Superblock Operations: 指向文件系统的一组用于读写inode和superblock的routine
  • File System Type: 文件系统类型,指向文件系统数据结构
  • File System Specific: 指向文件系统所必需的信息

Inode

每个文件目录都是一个vfs inode表示。存在于内核内存中,并保存在vfs inode缓存

inode在访问后加入缓存,那么在下次访问同样的目录时就会更快

  • device: 保存该文件的设备的设备标识符
  • inode number: inode序号,唯一存在于文件系统。
  • mode: 描述访问权限
  • user ids: 所有者id
  • times: 创建、修改、写入此时
  • block size: 文件块大小(单位byte)
  • inode operations: 指向执行inode的操作
  • count: 系统组件正在使用inode的数量。也就意味着如果是0的话,可以被丢弃或者重用。
  • lock: 锁住inode
  • dirty: inode是否被写入。

注册文件系统

  1. 文件系统可以在构建Linux内核时启动,也可以通过构建成模块。

    模块既可以在需要时加载也可以通过isnmod手动加载

  2. 注册到vfs,通过文件系统类型表示。文件系统类型包含

    • superblock read routine:

      在装载文件系统的一个实例时,VFS会调用该例程

    • file system name:

      文件系统名

    • device needed:

      是否需要设备来支持。比如对于/proc文件系统就不需要块设备

挂载文件系统

mount -t fuse -o ro /dev/sda1 /mnt/data

从上面的命令中可以看出,挂载需要三个关键信息

  • 文件系统名字
  • 包含文件系统的设备
  • 新文件系统在已经存在文件系统的拓扑挂载点

那么对于vfs来讲需要做的有

  1. 找到文件系统

    这是通过查找已知文件系统获取到目标文件系统的数据结构,而后读取superblock

  2. 挂载物理设备

    找到挂载点目录的vfs inode,检查是否有其他文件系统挂载到同一个挂载点,接着vfs必须分配一个vfs superblock,并将装载信息传递给该文件系统的superblock read routine,而该routine需要从物理设备读取信息填充vfs superblock

寻找文件

解析目录名,寻找名称中每个中间目录的vfs inode。具体的查找通过目录具体文件系统的vfs inode检查是否存在

目录缓存

目录缓存是为了加速常用目录

在真正文件系统查找目录时,其详细信息添加到目录缓存。在下次查找同一个目录时,就会从目录缓存中找到

只有较短的目录项会被缓存(最多15字符),因为较短的往往也是最常用的

目录缓存由一个散列表组成,其中每个条目指向一个具有相同散列值的目录缓存条目列表。散列函数使用保存文件系统的设备的设备号和目录名来计算散列表的偏移量或索引。

为了保持缓存的有效性并及时更新,VFS保存了最近最少使用(LRU)目录缓存项的列表。

在第一次查找目录项时,即第一次将目录项放入缓存时,将其添加到第一级LRU链表的末尾。在再次访问该目录项时,它被提升到第二个LRU缓存链表的后面。

inode缓存

与目录缓存类似,inode缓存也是为了加速对挂载文件系统的访问

inode缓存也是一个散列表,哈希值根据其inode编号和包含该文件系统的底层物理设备的设备标识符计算得出。

在访问中,如果可以在缓存中找到该inode,则将其计数加一,表明有另一个使用者。否则将找到一个空闲的vfs inode,并调用具体文件系统的routine,填充该inode

Ref

  1. https://en.wikipedia.org/wiki/Virtual_file_system
  2. http://www.science.unitn.it/~fiorella/guidelinux/tlk/node102.html#SECTION001120000000000000000

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/71938.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Node.js 中间件是怎样工作的?

express自带路由功能,可以侦听指定路径的请求,除此之外,express最大的优点就是【中间件】概念的灵活运用,使得各个模块得以解耦,像搭积木一样串起来就可以实现复杂的后端逻辑。除此之外,还可以利用别人写好…

Redisson—独立节点模式和集群管理工具

一、集群管理工具 Redisson集群管理工具提供了通过程序化的方式,像redis-trib.rb脚本一样方便地管理Redis集群的工具。 1、 创建集群 以下范例展示了如何创建三主三从的Redis集群。 ClusterNodes clusterNodes ClusterNodes.create() .master("127.0.0.1:…

(其他) 剑指 Offer 46. 把数字翻译成字符串 ——【Leetcode每日一题】

❓ 剑指 Offer 46. 把数字翻译成字符串 难度:中等 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。…

springcloud3 注册中心以及cloud启动原理总结(含面试)

一 Springcloud微服务面试题 1.1 为何使用注册中心 1)问题描述 在多个单体微服务之间,可以直接通过http请求进行通信,但是存在以下问题: 1.调用服务提供者时需要写ip和端口,如果出现ip和端口进行了修改,没有及时告…

微信小程序开发---基本组件的使用

目录 一、scroll-view (1)作用 (2)用法 二、swiper和swiper-item (1)作用 (2)用法 三、text (1)作用 (2)使用 四、rich-tex…

【面试经典150题】H 指数

题目链接 给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义:h 代表“高引用次数” ,一名科研人员的 h 指数 是指他(她&#x…

C# 中什么是重写(子类改写父类方法)

方法重写是指在继承关系中,子类重新实现父类或基类的某个方法。这种方法允许子类根据需要修改或扩展父类或基类的方法功能。在面向对象编程中,方法重写是一种多态的表现形式,它使得子类可以根据不同的需求和场景提供不同的方法实现。 方法重…

智慧公厕是将数据、技术、业务深度融合的公共厕所敏捷化“操作系统”

文明社会的进步离不开公共设施的不断创新和提升。而在这些公共设施中,公共厕所一直是一个备受关注和改善的领域。近年来,随着智慧城市建设的推进,智慧公厕成为了城市管理的重要一环。智慧公厕不仅仅是为公众提供方便和舒适的便利设施&#xf…

如何使用Puppeteer进行金融数据抓取和预测

导语 Puppeteer是一个基于Node.js的库,可以用来控制Chrome或Chromium浏览器,实现网页操作、截图、PDF生成等功能。本文将介绍如何使用Puppeteer进行金融数据抓取和预测,以及如何使用亿牛云爬虫代理提高爬虫效果。 概述 金融数据抓取是指从…

Java HashMap源码学习

Java HashMap源码学习 基本使用 包含创建&#xff0c;添加&#xff0c;删除&#xff0c;迭代&#xff0c;打印 val map java.util.HashMap<Int, Int>() map.put(1, 2) map.put(2, 2) map.put(3, 2) map.remove(1) map.forEach {println("it.key${it.key}, it.va…

Cocos独立游戏开发框架中的日志模块:Bug无所遁形

引言 本系列是《8年主程手把手打造Cocos独立游戏开发框架》&#xff0c;欢迎大家关注分享收藏订阅。 在Cocos独立游戏开发框架中&#xff0c;一个强大的日志模块是不可或缺的组成部分。日志不仅仅是记录应用程序的运行状态&#xff0c;还可以用于故障排除、性能监测和安全审计…

26.篮球练习

题目 Description 小徐酷爱打篮球&#xff0c;在小学期的前两周半都在练习篮球。 今天&#xff0c;小徐想要练习如何突破。练习场地可由如下所示的网格图表示&#xff0c;图中的位置可用坐标表示。 其中A点(0,0)为小徐的起始位置&#xff0c;B点(n,m)为小徐想要到达的位置。…

高教社杯数模竞赛特辑论文篇-2018年D题:汽车总装线配置的优化模型研究

目录 摘 要 1. 问题的重述 1.1 装配要求 1.2 喷涂要求 1.3 需要解决的问题 2. 问

python中如何使用正则表达匹配\本身?(文末赠书)

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 将军向宠&#xff0c;性行淑均。 大家好&#xff0c;我是皮皮。 一、前言 前几天在Python钻石群【空】问了一个Python正则表达式的问题&#xff0c;一起…

PageHelper分页原理解析

大家好&#xff0c;我是Leo! 今天给大家带来的是关于PageHelper原理的解析&#xff0c;最近遇到一个SQL优化的问题&#xff0c;顺便研究了一下PageHelper的原理&#xff0c;毕竟也是比较常用&#xff0c;源码也比较好看的懂&#xff0c;如果感兴趣的小伙伴可以跟着过程去DEBUG源…

tcp字节传输(java)-自定义包头和数据识别

1、背景 tcp传输的时候会自动拆包&#xff0c;因此服务端接收的数据段可能跟客户端发送过来的数据段长度不一致&#xff0c;比如客户端一次发送10000个字节。但是服务端接收了两次才接收完整&#xff08;例如第一次接收6000字节&#xff0c;第二次接收4000字节&#xff09;。但…

vue3 watch watchEffect

watch & watchEffect 函数都是监听器, 用于监视数据的变化; watch 有惰性&#xff0c;watchEffect 无惰性&#xff1b;watch 需要指定具体的监视属性&#xff0c;watchEffect 不需要指定具体的监视属性和配置参数&#xff0c;会自动感知代码依赖&#xff1b;watch 能获取到…

【Web_接口测试_Python3_日期时间库】Arrow获取过去/当前未来时间日期、格式化时间日期、转换时间戳、获取不同时区时间日期等

## 简介 Arrow是一个 Python 库&#xff0c;它提供了一种明智且人性化的方法来创建、操作、格式化和转换日期、时间和时间戳。它实现并更新 datetime 类型&#xff0c;填补了功能上的空白&#xff0c;并提供了支持许多常见创建方案的智能模块 API。简而言之&#xff0c;它可以帮…

AI云服务平台大全:GPU租用 | App托管 | MLOps平台

我们搜集整理了国内外主要的深度学习云服务商&#xff0c;包括云GPU供应商、WebApp托管商和MLOps平台商。 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 1、云GPU供应商 只有一台笔记本电脑&#x1f4bb;不足以运行你的AI模型&#xff0c;忘记它吧&#xff0c;使用云 …

解密Spring Cloud Alibaba核心技术,实战案例书现世

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作者&#x1f3c6;&#xff0c;阿里云专家博主&#x1f3…