Linux-文件系统

前言

  • 文件系统是操作系统用于明确存储设备或分区上的文件的使用方法和数据结构;即在存储设备上组织使用文件的方法。操作系统中负责管理和存储文件信息的软件结构称为文件管理系统,简称文件系统。从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进 行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的 存取,安全控制,日志,压缩,加密等。
  • 文件系统种类很多,比如ext2、ext3、ext4、xfs、nfs等等。而操作系统为了对用户提供一个统一的接口,于是在用户层与文件系统层引入了中间层,这个中间层就称为虚拟文件系统(Virtual File System,VFS)

文件系统的基本组成

Linux文件系统会为每个文件分配两个数据结构:

  • 索引节点,也就是 inode,用来记录文件的元信息,比如 inode 编号、文件大小、访问权限、创建时间、修改时间、数据在磁盘的位置等等。索引节点是文件的唯一标识,它们之间一一对应,也同样都会被存储在硬盘中,所以索引节点同样占用磁盘空间
  • 目录项,也就是 dentry,用来记录文件的名字、索引节点指针以及与其他目录项的层级关联关系。多个目录项关联起来,就会形成目录结构,但它与索引节点不同的是,目录项是由内核维护的一个数据结构,不存放于磁盘,而是缓存在内存

由于索引节点唯一标识一个文件,而目录项记录着文件的名字,所以目录项和索引节点的关系是多对一,也就是说,一个文件可以有多个别名。

借鉴网上的关系图,很清晰,不用自己画了。
目录项和索引节点关系图

磁盘在执行文件系统格式化时,会被分成三个存储区域:

  1. 超级块:用来存储文件系统的详细信息,比如块个数、块大小、空闲块等等。
  2. 索引节点区:用来存储索引节点。
  3. 数据块区:用来存储文件或目录数据。

另外,既然目录项是内存缓存,那为了加速文件的访问,通常也会把索引节点加载到内存中。

当然我们不可能把超级块和索引节点区全部加载到内存,这样内存肯定撑不住,所以只有当需要使用的时候,才将其加载进内存,它们加载进内存的时机是不同的:

  • 超级块:当文件系统挂载时进入内存。
  • 索引节点区:当文件被访问时进入内存。

软链接和硬链接

综上所述:

  • 硬链接:多个不同的目录项中记录的inode是同一个。所以删除任意一个目录项,文件都不会真正被删除。当所有目录项被删除后,该文件才回被真正删除。
  • 软链接:可以理解为快捷方式,链接和原文件的inode是不同的。按我的理解是软链接文件只是记录了创建时需要被链接文件的文件名和目录路径。所以原文件被删或者被移动,链接就找不到了。

一些概念上的区别

  1. 目录和文件的区别
  • 目录也是文件,也是用inode做唯一标识的,但是目录文件存储的是inode、子目录、文件列表。
  • 普通文件存储的就是文件数据。
  1. 目录和目录项的区别
  • 目录是个文件,持久化存储在磁盘。
  • 目录项是内核一个数据结构,缓存在内存。而且目录项不只是表示目录,也可以表示文件。

如果查询目录频繁从磁盘读,效率会很低,所以内核会把已经读过的目录用目录项这个数据结构缓存在内存,下次再次读到相同的目录时,只需从内存读就可以,大大提高了文件系统的效率。

文件系统从磁盘读写数据的过程

文件系统对磁盘读写的最小单位是逻辑扇区,扇区的大小一般只有 512B 大小,很明显,如果每次读写都以这么小为单位,那这读写的效率会非常低。

所以,文件系统把多个逻辑扇区组成了一个逻辑块(簇),每次读写的最小单位就是逻辑块(数据块),Linux 中的逻辑块大小默认为 4KB,也就是一次性读写 8 个扇区,这将大大提高了磁盘的读写的效率。

注意:文件系统的逻辑块虽然提高了读写性能,但是可能会造成空间浪费。比如一个文件大小只有1KB,但是文件系统是按照逻辑块去写数据的,所以1KB的文件也会占用一个逻辑块4KB的大小,实际上是浪费了3KB的空间。

当文件系统需要读取或写入数据时:

  1. 将文件数据分割成多个逻辑块进行处理,每个逻辑块都有一个对应的逻辑块地址(Logical Block Address,LBA),用于标识该逻辑块在文件系统中的位置。
  2. 文件系统的IO管理器通过磁盘维护的磁盘分区表或映射表等数据结构来把逻辑块地址(Logical Block Address,LBA)转换为磁盘物理块地址(Logical Disk Block Address,LDBA),从而使得文件系统可以定位和访问实际存储数据的位置。
  3. 文件系统的IO管理器查询到这些映射表,将逻辑块地址转换为相应的磁盘物理块地址后,通过磁盘控制器再将这些逻辑块翻译成扇区地址,然后从扇区中读取数据,再通过磁盘控制器将这些扇区数据重组写入到内存中去。
物理扇区组成物理块,物理块对应逻辑块,逻辑块与文件相对应。
文件系统的IO管理器负责管理文件系统与磁盘之间的数据读写操作。

文件系统从磁盘读写数据的过程

怎么查看Linux逻辑块的大小

  1. stat / | grep "IO Block"
  2. blockdev --getbsz /dev/sda2

文件系统分类

  1. 磁盘的文件系统:直接把数据存储在磁盘中,比如 Ext 2/3/4、XFS 等都是这类文件系统。
  2. 内存的文件系统:这类文件系统的数据不是存储在硬盘的,而是占用内存空间,我们经常用到的 /proc 和 /sys 文件系统都属于这一类,读写这类文件,实际上是读写内核中相关的数据。
  3. 网络的文件系统:用来访问其他计算机主机数据的文件系统,比如 NFS、SMB 等等。

虚拟文件系统

虚拟文件系统(Virtual File System,VFS)

VFS 定义了一组所有文件系统都支持的数据结构和标准接口,这样程序员不需要了解这么多种的文件系统的工作原理,只需要了解 VFS 提供的统一接口即可。

借用网上的图,用户空间、系统调用、虚拟文件系统、缓存、文件系统以及存储之间的关系如下图:
虚拟文件系统

到这里,按我的理解,数据从应用程序到磁盘的过程大概是:

  1. 应用程序的进程通过路径名和文件名打开文件,操作系统会对应分配一个文件描述符。
  2. 进程通过系统调用进入内核空间,同时会把文件描述符也传过来,然后虚拟文件系统会根据文件描述符找到对应文件的元信息。
  3. 虚拟文件系统通过这些元信息再去调用文件系统。
  4. 最后文件系统按照上面讲的读写过程去读写磁盘数据。

这只是粗略的过程,详细的可以再深入了解下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值