资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

不知道Linux文件系统是怎么工作的?详解来了

来源:公司资讯 | 2021.08.19

和 CPU、内存相同,磁盘和文件体系的办理,也是操作体系最核心的功能。

磁盘为体系供给了最基本的持久化存储。
文件体系则在磁盘的基础上,供给了一个用来办理文件的树状结构。
那么,磁盘和文件体系是怎么作业的呢?又有哪些目标能够衡量它们的功能呢?

索引节点和目录项
文件体系,本身是对存储设备上的文件,进行安排办理的机制。安排方法不同,就会构成不同的文件体系。

咱们要记住最重要的一点,在 Linux 中一切皆文件。不只普通的文件和目录,就连块设备、 套接字、管道等,也都要经过一致的文件体系来办理。

为了方便办理,Linux 文件体系为每个文件都分配两个数据结构,索引节点(index node)和目录项(directory entry)。它们首要用来记载文件的元信息和目录结构。

索引节点,简称为 inode,用来记载文件的元数据,比方 inode 编号、文件巨细、拜访 权限、修正日期、数据的位置等。索引节点和文件一一对应,它跟文件内容相同,都会 被持久化存储到磁盘中。所以记住,索引节点同样占用磁盘空间。
目录项,简称为 dentry,用来记载文件的名字、索引节点指针以及与其他目录项的相关 联系。多个相关的目录项,就构成了文件体系的目录结构。不过,不同于索引节点,目录项是由内核保护的一个内存数据结构,所以一般也被叫做目录项缓存。
换句话说,索引节点是每个文件的唯一标志,而目录项保护的正是文件体系的树状结构。目录项和索引节点的联系是多对一,你能够简单了解为,一个文件能够有多个别号。

举个比方,经过硬链接为文件创建的别号,就会对应不同的目录项,不过这些目录项本质上仍是链接同一个文件,所以,它们的索引节点相同。

索引节点和目录项纪录了文件的元数据,以及文件间的目录联系,那么具体来说,文件数据到底是怎么存储的呢?是不是直接写到磁盘中就好了呢?

实际上,磁盘读写的最小单位是扇区,然而扇区只要 512B 巨细,假如每次都读写这么小的单位,功率必定很低。所以,文件体系又把接连的扇区组成了逻辑块,然后每次都以逻 辑块为最小单元,来办理数据。常见的逻辑块巨细为 4KB,也便是由接连的 8 个扇区组成。

为了协助咱们了解目录项、索引节点以及文件数据的联系,画了一张示意图。咱们能够对照着这张图,来回忆刚刚讲过的内容,把知识和细节串联起来。



不过,这里有两点需要咱们注意:

榜首,目录项本身便是一个内存缓存,而索引节点则是存储在磁盘中的数据。在前面的 Buffer 和 Cache 原理中,我从前提到过,为了协调慢速磁盘与快速 CPU 的功能差异,文 件内容会缓存到页缓存 Cache 中。那么,咱们也应该想到,这些索引节点天然也会缓存到内存中,加快文件的拜访。

第二,磁盘在履行文件体系格式化时,会被分红三个存储区域,超级块、索引节点区和数

据块区。其间,

超级块,存储整个文件体系的状态。

索引节点区,用来存储索引节点。

数据块区,则用来存储文件数据。

虚拟文件体系
目录项、索引节点、逻辑块以及超级块,构成了 Linux 文件体系的四大基本要素。不过, 为了支撑各种不同的文件体系,Linux 内核在用户进程和文件体系的中心,又引入了一个笼统层,也便是虚拟文件体系 VFS(Virtual File System)。

VFS 定义了一组一切文件体系都支撑的数据结构和规范接口。这样,用户进程和内核中的其他子体系,只需要跟 VFS 供给的一致接口进行交互就能够了,而不需要再关心底层各种文件体系的完结细节。

这里,下图是 Linux 文件体系的架构图,帮咱们更好地了解体系调用、VFS、缓存、文 件体系以及块存储之间的联系。



经过这张图,能够看到,在 VFS 的下方,Linux 支撑各种各样的文件体系,如 Ext4、 XFS、NFS 等等。依照存储位置的不同,这些文件体系能够分为三类。

榜首类是依据磁盘的文件体系,也便是把数据直接存储在计算机本地挂载的磁盘中。常见的 Ext4、XFS、OverlayFS 等,都是这类文件体系。

第二类是依据内存的文件体系,也便是咱们常说的虚拟文件体系。这类文件体系,不需要任何磁盘分配存储空间,但会占用内存。咱们经常用到的 /proc 文件体系,其实便是 一种最常见的虚拟文件体系。此外,/sys 文件体系也归于这一类,首要向用户空间导出层次化的内核目标。

第三类是网络文件体系,也便是用来拜访其他计算机数据的文件体系,比方 NFS、 SMB、iSCSI 等。

这些文件体系,要先挂载到 VFS 目录树中的某个子目录(称为挂载点),然后才干拜访其间的文件。拿榜首类,也便是依据磁盘的文件体系为例,在装置体系时,要先挂载一个根 目录(/),在根目录下再把其他文件体系(比方其他的磁盘分区、/proc 文件体系、/sys 文件体系、NFS 等)挂载进来。

文件体系 I/O
把文件体系挂载到挂载点后,你就能经过挂载点,再去拜访它办理的文件了。VFS 供给了一组规范的文件拜访接口。这些接口以体系调用的方法,供给给应用程序运用。

就拿 cat 命令来说,它首要调用 open() ,打开一个文件;然后调用 read() ,读取文件的内容;最终再调用 write() ,把文件内容输出到控制台的规范输出中:

int open(const char *pathname, int flags, mode_t mode); 
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
文件读写方法的各种差异,导致 I/O 的分类多种多样。最常见的有,缓冲与非缓冲 I/O、 直接与非直接 I/O、堵塞与非堵塞 I/O、同步与异步 I/O 等。 接下来,咱们就详细看这四种分类。

榜首种,依据是否使用规范库缓存,能够把文件 I/O 分为缓冲 I/O 与非缓冲 I/O。

缓冲 I/O,是指使用规范库缓存来加快文件的拜访,而规范库内部再经过体系调度拜访文件。

非缓冲 I/O,是指直接经过体系调用来拜访文件,不再经过规范库缓存。

注意,这里所说的“缓冲”,是目规范库内部完结的缓存。比方说,你可能见到过,很多程序遇到换行时才真实输出,而换行前的内容,其实便是被规范库暂时缓存了起来。

无论缓冲 I/O 还对错缓冲 I/O,它们最终仍是要经过体系调用来拜访文件。咱们知道,体系调用后,还会经过页缓存,来削减磁盘的 I/O 操作。

第二,依据是否使用操作体系的页缓存,能够把文件 I/O 分为直接 I/O 与非直接 I/O。

直接 I/O,是指越过操作体系的页缓存,直接跟文件体系交互来拜访文件。

非直接 I/O 正好相反,文件读写时,先要经过体系的页缓存,然后再由内核或额外的体系调用,真实写入磁盘。

想要完结直接 I/O,需要你在体系调用中,指定 O_DIRECT 标志。假如没有设置过,默许 的对错直接 I/O。

不过要注意,直接 I/O、非直接 I/O,本质上仍是和文件体系交互。假如是在数据库等场景中,还会看到,越过文件体系读写磁盘的状况,也便是咱们一般所说的裸 I/O。

第三,依据应用程序是否堵塞本身运转,能够把文件 I/O 分为堵塞 I/O 和非堵塞 I/O

所谓堵塞 I/O,是指应用程序履行 I/O 操作后,假如没有取得呼应,就会堵塞当前线程,天然就不能履行其他任务。

所谓非堵塞 I/O,是指应用程序履行 I/O 操作后,不会堵塞当前的线程,能够持续履行其他的任务,随后再经过轮询或许事情告知的方法,获取调用的结果。

比方说,拜访管道或许网络套接字时,设置 O_NONBLOCK 标志,就表明用非堵塞方法拜访;而假如不做任何设置,默许的便是堵塞拜访。

第四,依据是否等待呼应结果,能够把文件 I/O 分为同步和异步 I/O

所谓同步 I/O,是指应用程序履行 I/O 操作后,要一向比及整个 I/O 完结后,才干取得 I/O 呼应。

所谓异步 I/O,是指应用程序履行 I/O 操作后,不必等待完结和完结后的呼应,而是持续履行就能够。比及这次 I/O 完结后,呼应会用事情告知的方法,告知应用程序。

例如,在操作文件时,假如设置了 O_SYNC 或许 O_DSYNC 标志,就代表同步 I/O。假如设置了 O_DSYNC,就要等文件数据写入磁盘后,才干返回;而 O_SYNC,则是在 O_DSYNC 基础上,要求文件元数据也要写入磁盘后,才干返回。

再比方,在拜访管道或许网络套接字时,设置了 O_ASYNC 选项后,相应的 I/O 便是异步I/O。这样,内核会再经过 SIGIO 或许 SIGPOLL,来告知进程文件是否可读写。

咱们可能发现了,这里的很多概念也经常出现在网络编程中。比方非堵塞 I/O,一般会跟 select/poll 配合,用在网络套接字的 I/O 中。

这下咱们也应该能够了解,“Linux 一切皆文件”的深刻含义。无论是普通文件和块设备、仍是网络套接字和管道等,它们都经过一致的 VFS 接口来拜访。

—— 灵通云微信公众号 ——

热门标签

上一条———————

下一条———————

十七年 建站经验

多一份参考,总有益处

联系灵通云,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

业务热线:400-688-6062 / 大客户专线   南通:15818561755