首页 > 其他分享 >虚拟文件系统VFS-片段一

虚拟文件系统VFS-片段一

时间:2024-07-28 14:55:18浏览次数:8  
标签:文件 片段 VFS 文件系统 内核 inode 链接

文件系统类型

  • 基于磁盘的文件系统

    如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主要由两部分组成

  1. 文件(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实现的。

  2. 文件系统(读取超级块)

    VFS支持的底层文件系统通过一种内核特殊对象连接到VFS,该对象提供了一种读取超级块的方法。

    VFS 定义了一系列的数据结构和操作,如 struct super_block(超级块,描述整个文件系统)。VFS有目录项缓存机制,能够达到快速访问此前查找操作的结果。该目录项由结构struct dentry建立。所有的dentry实例保存在一个散列表中,由一个hashtable实现,使用d_hash解决散列冲突问题。

VFS文件系统注册

VFS提供了两种操作mount和umount装载\未装载文件系统,每个装载的文件系统都会 有一个vfsmount结构。

mount # 查看文件系统装载情况

标签:文件,片段,VFS,文件系统,内核,inode,链接
From: https://www.cnblogs.com/solicit/p/18328230

相关文章

  • Linux文件系统相关知识:存储设备、文件系统、分区、挂载、块设备、部分相关简单指令。
    1.存储设备是什么?怎么理解分区和格式化?存储设备:指物理硬件设备,‌用于存储数据。‌这包括硬盘驱动器(‌HDD)‌、‌固态驱动器(‌SSD)‌、‌USB闪存驱动器、‌RAID阵列等。‌这些设备提供了实际的存储空间,‌可以用来存储操作系统、‌应用程序、‌文件、‌数据等。‌存储设备的容量......
  • STM32 串行FLASH W25Q64 移植文件系统FatFs ——(2)
    引言简述本篇文章目标:介绍如何将FatFs文件系统移植到STM32平台上的W25Q64串行FLASH。回顾上篇内容:软件模拟SPI驱动的实现。一、FatFs文件系统简介文件系统相对庞大且复杂,需要根据具体应用的文件系统格式进行编写。通常,文件系统与底层驱动分离,便于移植。因此,在实际工程应......
  • C++文件系统操作6 - 跨平台实现文件和文件夹的拷贝
    1.关键词2.fileutil.h3.fileutil.cpp4.filesystem_win.h5.filesystem_win.cpp6.filesystem_unix.cpp7.源码地址1.关键词C++文件系统操作拷贝文件拷贝文件夹跨平台2.fileutil.h#pragmaonce#include<string>#include<cstdio>#include<cstdint>#i......
  • 探索Perl的文件系统抽象层:驾驭文件操作的无形之手
    探索Perl的文件系统抽象层:驾驭文件操作的无形之手在Perl编程中,文件系统抽象层(FileSystemAbstractionLayer,简称FSAL)是一种允许开发者以统一的方式处理不同文件系统特性的机制。FSAL隐藏了底层文件系统的具体实现细节,提供了一套标准化的接口来访问和管理文件系统中的资源......
  • .url 文件通常是指Windows操作系统中的一种快捷方式文件,用于创建指向网络资源或本地文
    .url文件通常是指Windows操作系统中的一种快捷方式文件,用于创建指向网络资源或本地文件系统路径的链接。这种文件类型实际上是文本文件,其内容格式类似于INI文件,包含了一个URL或者本地文件路径。主要特点和用途:创建快捷方式:.url 文件允许用户创建指向特定网页、FTP站点或本......
  • C++文件系统操作5 - 跨平台列出指定目录下的所有文件和文件夹
    1.关键词2.fileutil.h3.fileutil.cpp4.filesystem_win.h5.filesystem_win.cpp6.filesystem_unix.cpp7.源码地址1.关键词C++文件系统操作列出指定目录下的所有文件列出指定目录下的所有文件夹跨平台2.fileutil.h#pragmaonce#include<string>#includ......
  • 文件系统介绍 --- ubifs
    UBIFS(UnsortedBlockImageFileSystem)无序区块镜像文件系统是用于固态存储设备上,UBIFS在设计与性能上均较YAFFS2、JFFS2更适合MLC(Multi-LevelCell)NANDFLASH。例如:UBIFS支持凑数(write-back),其写入的数据会被缓存起来,直到有必要写入时才写到flash,这样大大降低分散小区......
  • 构建Ubuntu22.04根文件系统
    一、官网下载ubuntu-basehttp://cdimage.ubuntu.com/ubuntu-base/releases/本文章使用的是:buntu-base-22.04.5-base-arm64.tar.gz解压:mkdirubuntu_rootfssudotar-zxvfubuntu-base-22.04.5-base-arm64.tar.gz-Cubuntu22.04sudoapt-getinstallqemu-user-staticsudo......
  • cpu proc sys文件系统下的含义
    proc文件系统(/proc/sys/kernel/)sched_child_runs_first/proc/sys/kernel/sched_child_runs_first是Linux内核中的一个配置文件,它用于控制调度器如何处理新创建的进程(即子进程)与它们的父进程之间的关系。功能说明:sched_child_runs_first:这个文件的值决定了当一个新进程(子进......
  • 文件系统(十):一文看懂 UBI 文件系统
    liwen012024.07.21前言UBI(UnsortedBlockImages)文件系统是一种用于裸flash的文件系统管理层。它是专为管理原始闪存设备而设计,特别适用于嵌入式系统。与YAFFS2和 JFFS2 不同的是,它可以提供整个flash空间的磨损平衡,并且有良好的扩展性,适用于大容量的 nandflash ......