工作多年,Linux文件系统还不太了解?

1,404 阅读6分钟

这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

我们作为“码农”,每天都在接触编程,接触 linux 系统,那么常见的 Linux 目录和文件都有哪些,它们又有什么作用呢?

想必大家经常会忽略这点,作为工作多年的你而言也不例外,今天就带大家来一起了解一下吧~

1 初识目录结构

2 初识文件

2.1 文件类型

2.1.1 文件

第一个属性为 [-]。最常用的类型,包括:

  • 纯文本文件(ASCII);

  • 二进制文件(binary);

  • 数据格式的文件(data);

  • 各种压缩文件。

2.1.2 目录

第一个属性为 [d]

2.1.3 链接文件

第一个属性为 [l]

2.1.4 管道

第一个属性为 [p]

2.1.5 块设备

第一个属性为 [b] 。储数据以供系统存取的接口设备,简单而言就是硬盘。

ll /dev/vda1brw-rw---- 1 root disk 253, 1 11月 28 19:17 /dev/vda1

复制代码

2.1.6 字符设备文件

第一个属性为 [c] 。即串行端口的接口设备,例如键盘、鼠标等等。

2.1.7 套接字

第一个属性为 [s]。最常在 /var/run 目录中看到这种文件类型。

查看文件类型的方法:

#file, stat, ls

复制代码

讲到这里,可以有些疑问,到底文件是个什么东东?

2.2 文件是什么?

如上图所示,一般文件包括两部分:元数据和用户数据

  • **元数据:**文件的附属信息:文件大小,文件创建时间,文件拥有者,Inode 编号(文件的唯一标识)

  • **用户数据:**记录文件真实内容的地方。

为了有效管理文件,引入了文件系统。

2.3 文件系统

文件系统,本身是对存储设备上的文件,进行组织管理的机制。所以根据组织机制的不同,可以分为不同的文件系统。

文件系统系统包括 4 大要素:索引节点,目录项,逻辑块,超级块

2.3.1 索引节点

同上面讲的元数据部分,索引节点和文件是一一对应的,它和文件内容一样,是存储在磁盘中的。所以索引节点是占用磁盘空间的。所以它不会随着进程的消亡而消失。

2.3.2 目录项

简称 dentry,用来记录文件的名称,索引节点指针以及目录项之间的关联关系,会形成一棵树状结构。多个关联的目录项,就形成了目录结构。

它是由内存维护的一个内存数据结构,所以通常被称作“目录项缓冲”。

2.3.3 逻辑块

索引节点和目录项记录了文件的元数据,那么文件内容是怎么存储的?

实际上,磁盘上最小的读写单位是“扇区”,只有 512B 大小,也就是 0.5K,为了读写效率,系统会将连续的扇区组合一个”块“,一般一个“块”是 8 个扇区,也就是 4K,4096B。

从磁盘中读取内容是特别慢的,所以系统会将读取的内容存到“页缓冲”中。

2.3.4 超级块

一个超级块对应一个文件系统。超级块会保存文件系统的大小和状态、块设备的引用和元数据信息(比如空闲列表等等)

文件系统有多种,比如 Ext4, NFS 等,根据存储位置不一样,可以分为三类。

  • **基于磁盘的文件系统:**也就是数据直接存储在计算机本地挂载的磁盘中。常见的 Ext4, Ext3,XFS。

  • **基于内存的文件系统:**也就是虚拟文件系统。这类文件系统,不需要任何磁盘分配存储空间,但会占用内存。比如/proc 文件系统,/sys 文件系统。

  • **网络文件系统:**用来访问其他计算机数据的文件系统,比如 NFS,SMB。

每个文件系统是独立的,有自己的组织方法,操作方法。那么对于用户来说,不可能所有的文件系统都了解,那么怎么做到让用户透明的去处理文件呢?

2.4 VFS 虚拟文件系统

虚拟文件系统定义了一组所有文件系统都支持的数据结构和标准接口。用户进程和内核中的其他子系统,只需要跟 VFS 提供的统一接口交互就 OK,不需要关心底层文件系统实现细节。

磁盘的操作是非常慢的,所以为了协调磁盘的访问速度,内核提供了“索引节点缓存”,“目录项缓存”,“页缓冲”。

2.5 文件系统 I/O

根据文件读写方式的各种差异,导致 I/O 的分类多种多种。最常见的为以下 4 类:

2.5.1 缓冲 IO 和非缓冲 IO

第一种,根据是否利用标准库缓存,分为:

  • **缓冲 IO:**只利用标准库的缓冲来加速文件的访问。标准库内部会通过系统调用来访问文件。

  • **非缓冲 IO:**直接系统调用。

需要说明的是:“缓冲”指的是标准库的缓冲,而不是内核提供的高速缓冲区(也就是页缓冲)

  • 无缓存 IO 操作数据流向路径:数据——内核缓存区——磁盘

  • 标准 IO 操作数据流向路径:数据——流缓存区——内核缓存区——磁盘

2.5.2 直接 IO 和非直接 IO

是否跳过页缓冲。

要想实现直接 IO,可以在系统调用的时候,指定 O_DIRECT 标志。

直接 IO 和非直接 IO,本质上还是和文件系统打交道,如果跳过文件系统直接读写磁盘,就是我们通常说的裸 IO。

2.5.3 阻塞和非阻塞 IO

设置 O_NONBLOCK

  • **阻塞 IO:**是指应用程序执行 IO 操作,如果没有获得响应,则会阻塞当前线程,不会做其他任务。

  • **非阻塞 IO:**是指应用程序执行 IO 操作,不阻塞当前线程,可以继续执行其他任务,随后会轮询或者事件通知的形式,获取调用结果。

2.5.4 同步和非同步 IO

设置 O_SYNC 或者 O_DSYNC 标志,就代表同步 IO。设置 O_DSYNC,会等待数据写入磁盘才返回;设置 O_SYNC,则是在 O_DSYNC 的基础上,要求文件元数据也要返回磁盘后,才返回。

  • **同步 IO:**是指应用程序执行 IO 操作后,要一直等待 IO 完成后,才能获得 IO 响应。

  • **异步 IO:**是指用用程序执行 IO 操作后,不用等待完成或完成后的响应,而是继续执行就可以。等待 IO 完成,响应会用事件通知的形式,告诉应用程序。

- END -

作者:架构精进之路,十年研发风雨路,大厂架构师,CSDN 博客专家,专注架构技术沉淀学习及分享,职业与认知升级,坚持分享接地气儿的干货文章,期待与你一起成长。
关注并私信我回复“01”,送你一份程序员成长进阶大礼包,欢迎勾搭。

Thanks for reading!