文件系统篇——篇一:文件系统与虚拟文件系统概念简介

说明
  本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。
  QQ 群 号:513683159 【相互学习】
内容来源
  《循序渐进Linux:基础知识、服务器搭建、系统管理、性能调优、集群应用》
  《深入解析Linux内核源代码》

下一篇:文件系统篇——篇二:文件系统结构体与函数详解注释

一、文件系统

1、文件系统是什么?

  基于操作系统用来管理和组织保存在磁盘上的 数据与元数据系统软件
    ①磁盘:计算机存储硬件载体。如:固态硬盘等。
    ②数据(Data):信息的表现形式和载体,可以是符号、文字、图像、视频等。
    ③元数据(Meta Data):描述数据的数据。
      为数据说明其元素或属性(名称、大小、数据类型等)或其结构(长度、字段、数据列)或其相关数据(位于何处、如何联系、拥有者)等。
    ④文件:存放在磁盘上的信息集合。
    ⑤目录(文件夹):文件关系的信息集合。

2、文件系统的作用?

  1️⃣解决设备上有效存储文件数据问题(数据完整性、写入与读出数据的一致性、数据读写简单化和安全性):对数据存储布局、空间管理、文件命名和安全控制等方面管理。
  2️⃣解决设备上有效存储文件系统元数据问题:文件的权限、大小、修改日期、属主、存储位置等。
  综上所述:文件系统是操作系统与磁盘设备之间交互的桥梁,外在表现为操作系统可对磁盘上的数据(文件和目录)进行管理。
  一些更具体的功能描述:
    ①管理和调度文件存储空间。
    ②提供文件的逻辑结构、物理结构和存储方法。
    ③实现文件从标识到实际地址的映射。
    ④实现文件的控制操作和存取操作。
    ⑤实现文件信息的共享并提供可靠的文件保密和保护措施。

3、文件系统的好处?

  1️⃣对数据管理操作变得简单。
  2️⃣磁盘分区管理灵活。
  3️⃣支持数据容错机制,数据安全得到保障。

4、文件系统使用步骤

  1️⃣存储介质:常见有:光盘、软盘、磁盘、硬盘、网络存储等。
  2️⃣磁盘分区(针对硬盘设备):使用分区工具对磁盘进行划分。
  3️⃣创建文件系统:在磁盘上创建文件系统。如:mkfs [-v] [-t fstype] Device
  4️⃣挂载设备:将文件系统与存储设备关联起来。如:mount -t

5、文件系统种类?

一般分为三大类:
  1️⃣磁盘文件系统:在非易失介质上存储文件的方法,如:
    Linux:Exit2、Exit3、Reiser等。
    Unix:sysv、UFS、MINIX、VERITAS VxFS等。
    微软:MS-DOS、VFAT、NTFS等。
    其他:CD-ROM、DVD、HPFS、HFS、AFFS、ADFS、JFS、XFS等。
  2️⃣虚拟文件系统:一种使用户应用程序与用户通信的方法,如:proc、sysfs等。
  3️⃣网络文件系统:允许通过网络访问另一台计算机上数据的方法,如:NFS、Coda、AFS、CIFS、NCP等。

文件系统类型 特点
Minix Linux最早支持的文件系统。主要缺点是最大64MB的磁盘分区和最长14个字符的文件名称的限制
Ext 第1个Linux专用的文件系统,支持2GB磁盘分区,255字符的文件名称,但性能有问题
Xiafs 在Minix基础上发展起来,克服了Minix的主要缺点。但很快被更完善的文件系统取代
Ext2 当前实际上的Linux标准文件系统。性能强大,易扩充,可移植。
Ext3 日志文件系统。在Ext2的基础上增加日志功能
System V UNIX早期支持的文件系统,也有与Minix同样的限制
NFS 网络文件系统。使得用户可以像访问本地文件一样访问远程主机上的文件
ISO 9660 光盘使用的文件系统
/proc 一个反映内核运行情况的虚的文件系统,并不实际存在于磁盘上
Msdos DOS的文件系统,系统力图使它表现得像UNIX
UMSDOS 该文件系统允许Msdos文件系统可以当作Linux固有的文件系统一样使用
Vfat fat 文件系统的扩展,支持长文件名
Ntfs Windows NT的文件系统
Hpfs OS/2的文件系统

二、虚拟文件系统

1、VFS概述

  从上面可知文件系统的种类繁多,每种文件系统都有自己的特点和适用场景,故为支持各种文件系统,Linux内核在用户进程(C标准库)和文件系统之间引入抽象层,该层被称为:VFS = Virtual Filesystem Switch = 虚拟文件系统转换
  虚拟文件系统并不是真正的文件系统,而是提供一种通用结构模型,为各种文件系统提供通用统一的接口,包含所有文件系统的所有组件.
PS:实际就是file_operation数据类型,若想文件系统被Linux支持则使用该接口编写自己的操作函数)。
  该模型只存在于虚拟中,必须使用各种对象和函数指针与每种文件系统适配才能实现(所有的数据结构都是运行后与实际的文件系统结合才会建立,卸载时删除)。
  常使用的目录项对象被放在目录项高速缓存的磁盘高速缓存中,以加速从文件路径名到最后一个路径分量的索引节点的转换过程,即:加快查找路径
PS:
  上面可知文件系统是应用程序(用户进程)与文件系统之间的一层,起到的作用是应用程序调用某函数,该函数与实际的文件系统挂钩,故应用程序需通过VFS与实际的文件系统产生联系,根据情形实际的文件系统可能有多种情形,但对应用程序来说仅有一种VFS类型。
  某些情形下,一个文件操作可能由VFS本身执行,故某种意义上VFS可看成“通用”文件系统,如:
    当某进程关闭文件时无需涉及磁盘上相应文件,只需VFS释放文件对象即可。

2、VFS的作用

  ①对具体文件系统的数据结构进行抽象,以一种统一的数据结构进行管理。
  ②接受用户层的系统调用,例如write、open、stat、link等。
  ③支持多种具体文件系统之间相互访问。
  ④接受内核其他子系统的操作请求,特别是内存管理子系统。

3、VFS的四个对象

  文件:一种存放数据的信息集合体。
  目录:一种特殊的文件。
  具体的源码数据结构请查看:文件系统篇——篇二:文件系统结构体与函数详解注释
  下面所谓的对象其实指的就是源码中对应的结构体。

(1)超级块对象(superblock)

  1️⃣superblock对象存放已安装文件系统的有关描述信息,是一个全局的数据结构。
  2️⃣VFS超级块对象是各种具体文件系统安装时建立,卸载时删除,仅存在于内存中。
  3️⃣所有超级块对象(每个已安装文件系统都有一个超级块)以双向环形链表的形式链接在一起。

  链表中第一个元素和最后一个元素的地址分别存放在super_blocks变量的s_list域的nextprev域中.
  s_list 域的数据类型为 struct list_head, s_list域的数据类型为 struct list_head,包含指向链表中两个相邻超级块对象的指针。

  4️⃣对基于磁盘文件系统,通常为存在磁盘上的文件系统控制块。
  5️⃣每个文件系统都有一个超级块对象。

(2)索引节点对象(inode)

  1️⃣inode对象存放具体文件的一般信息。(不包含文件名)
    ①元数据(描述文件状态的数据),如:访问权限等。
    ②数据(实际保存内容的数据段或指向数据的指针)。
  2️⃣每个inode对象都唯一地标识文件系统中的文件,随文件的存在而存在。(文件名可随时更改,索引结点却是唯一的)。
  3️⃣对基于磁盘文件系统,inode对象通常为存在磁盘上的文件控制块(FCB),是一种静态结构,每次使用必须调入内存,填写VFS索引节点(动态节点)。
  4️⃣每个文件都有一个inode对象,每个inode对象都有一个索引节点号(i_ino)。
  5️⃣在同一个文件系统中,每个索引节点号(i_ino)都是唯一的,内核有时根据索引节点号的哈希值查找其inode结构。
  6️⃣inode对象代表的是物理意义的文件,记录的是物理上的属性,对于一个具体的文件系统,在磁盘上就有对应的映像,所以 一个inode对象可能对应多个dentry对象(也就是一个文件可能有不止一个文件名或路径名,因为可用link将文件连接成其他文件,所以inode对象中有一个队列i_dentry,凡是代表同一文件的所有目录项都通过其dentry对象中的d_alias挂入相应的i_dentry队列)。

(3)目录项对象(dentry)

  1️⃣dentry对象存放目录项与对应文件进行链接的有关信息。
    ①该目录项数据所在的inode编号。
    ②文件或目录名。
    ③dentry对象中的d_inode指针指向对应文件的inode对象
  2️⃣ 一个有效的dentry对象必定有一个inode对象。(因为目录实际上也是文件,由d_inode指针指向)
  3️⃣当目录结点有父目录时,denrty对象就通过d_child挂入其父目录项中的d_subdirs队列中,同时又通过指针d_parent指向其父目录的dentry结构,而它的各个子目录的dentry对象则挂在其d_subdirs队列中。
  4️⃣每个磁盘文件系统都有自己特有方式将该类信息存放在磁盘上。
  5️⃣每个目录看作:若干子目录和文件组成的常规文件。
  (文件名和inode的关联就是通过该编号建立)
  6️⃣dentry对象代表的是逻辑意义的文件,描述的是逻辑上的属性,因此dentry对象是没有对应的映像。

(4)文件对象(file)

  1️⃣file对象存放打开文件与进程之间进行交互的有关信息。
  2️⃣仅当进程访问文件期间存在于内存中。
  3️⃣进程通过文件描述符(fd = file descriptors)而不是文件名来访问文件的。
    文件描述符实际是一个整数,每个进程最多同时使用NR_OPEN个,在fs.h中定义。
  4️⃣每个file对象总包含在下列的双向循环链表中
    ①“未使用”file对象的链表,该链表可做:
      1.文件对象的内存高速缓存。
      2.超级用户的备用存储器。
    ②“正在使用”file对象的链表。
      链表中每个元素至少由一个进程使用。
  5️⃣每个进程用files_struct结构来记录文件描述符的使用情况,称为用户打开文件表,是进程的私有数据。

(5)总结

  1️⃣数据结构间的关系
    超级块是对一个文件系统的描述。
    索引节点是对一个文件物理属性的描述。
    目录项是对一个文件逻辑属性的描述。
    文件对象是描述文件与进程之间的关系。
  2️⃣VFS与实际文件系统
    超级块可分为:VFS 与实际文件系统 两部分
    索引结点可分为:VFS 与实际文件系统 两部分
    目录项与文件对象就是虚拟的,存放在内存中。
   3️⃣不同对象处理文件的不同
  ①用户空间:操控文件描述符。
    文件描述符:一个文件由一个文件描述符标识,是由打开文件时由内核分配的一个整数,只在一个进程中有效,不同进程相同文件描述符并不指向同一文件,故基于文件描述符共享文件是不可能的。
  ②内核空间:操控inode。
    inode:一个文件由一个inode对应。

4、VFS系统调用

系统调用名 功能描述
mount( )/ umount( ) 安装/卸载文件系统
sysfs( ) 获取文件系统信息
statfs( )/ fstatfs( ) /ustat( ) 获取文件系统统计信息
chroot( ) 更改根目录
chdir( ) /fchdir( ) / getcwd( ) 更改当前目录
mkdir( ) /rmdir( ) 创建/删除目录
getdents() /readdir()/ link() unlink()/rename( ) 对目录项进行操作
readlink( ) /symlink( ) 对软链接进行操作
chown( ) /fchown( )/lchown( ) 更改文件所有者
chmod( )/ fchmod( ) /utime( ) 更改文件属性
stat( ) /fstat( ) /lstat( ) access( ) 读取文件状态
open() /close( ) /creat( ) /umask() 打开/关闭/创建文件
dup( ) / dup2( ) /fcntl( ) 对文件描述符进行操作
select( )/poll( ) 异步I/0通信
truncate( ) /ftruncate( ) 更改文件长度
lseek( ) /_llseek( ) 更改文件指针
read()/ write() /readv() /writev() 文件I/О操作sendfile( )
pread( )/ pwrite( ) 搜索并访问文件
mmap( ) /munmap( ) 文件内存映射
fdatasync( ) /fsync( ) /sync( )/ msync( ) 同步访问文件数据
flock( ) 处理文件锁
ioperm()、ioctl( )、pipe()、mknod() 设备文件和管道文件
socket( )、connect( )、bind( )、 protocols( ) 套接字系统调用并用于实现网络功能
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值