Linux —— 基础IO(3)

简介: Linux —— 基础IO(3)

九、理解文件系统及inode

       如果一个文件没有被打开,它肯定是存放在磁盘中的,刚刚是对内存文件进行了分析,接下来我们来谈谈磁盘文件。

1.磁盘的概念

我们所创建的大量文件,在没有被打开时都是在磁盘上存放的,以下是磁盘的基本结构图:

1ecd1b2606ed46e9956a89f231c9802c.png

       如下图所示,磁盘主要是通过机械臂上的磁头来读取磁盘上的数据,磁盘由一个或者多个圆盘组成,它们围绕着一根中心主轴旋转,磁盘被组织成磁道,磁道是单个盘片上的同心圆,所有盘面上半径相同的磁道构成了柱面,每一个磁道又按512个字节为单位划分为等分,叫做扇区, 向磁盘读取和写入数据时,要以扇区为单位。

1ecd1b2606ed46e9956a89f231c9802c.png

2.磁盘的分区与格式化

1.磁盘的分区

       磁盘由一个或者多个圆盘组成,我们可以把它想象成小时候都接触过的磁带,把磁盘展开成一条直线。(线性结构)磁盘是相当大的,如果对整个磁盘进行管理成本很高,那么就需要对磁盘进行分区操作。

1ecd1b2606ed46e9956a89f231c9802c.png

2.磁盘的格式化

1ecd1b2606ed46e9956a89f231c9802c.png

1ecd1b2606ed46e9956a89f231c9802c.png        在Linux ext系列文件系统中,上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被划分为一个个的block。一个block的大小是由格式化的时候确定的,并且不可以更改。

Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。

超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了

GDT,Group Descriptor Table:块组描述符,描述块组属性信息;Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用

inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。i节点表:存放文件属性 如 文件大小,所有者,最近修改时间等

数据区(Data block):存放文件内容

1ecd1b2606ed46e9956a89f231c9802c.png

       补充一点,以上我们是对文件进行了说明,我们知道一切皆文件,那么目录也是文件,只不过我们感官上觉的目录和文件有些区别;

       目录既然也是文件,如何结合以上所讲来解释创建一个目录呢?

当我们创建一个目录后,它也是有inode编号的,在block中存放的是文件的文件名,因为文件名也是字符串,字符串也就是数据,再通过文件的inode编号进行映射,就能访问到文件了。

总结:

1ecd1b2606ed46e9956a89f231c9802c.png

创建一个新文件主要有一下4个操作:

1. 存储属性

       内核先找到一个空闲的i节点(这里是263466)。内核把文件信息记录到其中。

2. 存储数据

       该文件需要存储在三个磁盘块,内核找到了三个空闲块:300,500,800。将内核缓冲区的第一块数据复制到300,下一块复制到500,以此类推。

3. 记录分配情况

       文件内容按顺序300,500,800存放。内核在inode上的磁盘分布区记录了上述块列表。

4. 添加文件名到目录

       新的文件名 test 。linux如何在当前的目录中记录这个文件?内核将入口(263466, test )添加到目录文件。文件名和inode之间的对应关系将文件名和文件的内容及属性连接起来。

3. 查看inode信息

1.stat命令

stat命令用来显示文件或文件系统的详细信息,stat命令的输出信息要比ls命令的输出信息要更详细。

1ecd1b2606ed46e9956a89f231c9802c.png

2020062310470442.png

简单的介绍一下stat命令显示出来的文件其他信息:

- File:显示文件名

- Size:显示文件大小

- Blocks:文件使用的数据块总数

- IO Block:IO块大小

- regular file:文件类型(常规文件)

- Device:设备编号

- Inode:Inode号

- Links:链接数

- Access:文件的权限

- Gid、Uid:文件所有权的Gid和Uid(拥有者和所属组)

2. ls -al -i

查看文件的inode编号

1ecd1b2606ed46e9956a89f231c9802c.png

4.Linux下的三个时间

  1. Access Time:简写为atime,表示文件的访问时间。当文件内容被访问时,更新这个时间(短时内访问不会更新)
  2. Modify Time:简写为mtime,表示文件内容的修改时间,当文件的数据内容被修改时,更新这个时间。
  3. Change Time:简写为ctime,表示文件的状态时间,当文件的状态被修改时,更新这个时间,例如文件的链接数,大小,权限,Blocks数。

1ecd1b2606ed46e9956a89f231c9802c.png

十、软硬链接

1.软连接

我们可以通过以下命令创建一个文件的软连接。

[mlg@VM-20-8-centos lesson2]$ ln -s log.txt log_s //创建软连接
[mlg@VM-20-8-centos lesson2]$ unlink log_s //删除软连接

1ecd1b2606ed46e9956a89f231c9802c.png

创建这个软连接有什么用呢?

例如:你想要执行bin目录下的a.out程序

1ecd1b2606ed46e9956a89f231c9802c.png

这样子未免太麻烦,我们可以在lesson2的目录下直接创建软连接:

1ecd1b2606ed46e9956a89f231c9802c.png

       在Linux中有时候会存在执行路径特别深的程序,这时候我们就可通过软连接快速的找到;本质上就是充当索引的作用;并且两者的inode是不相同的,软连接是有独立的inode的,是个独立文件,可以跨文件系统;

1ecd1b2606ed46e9956a89f231c9802c.png

需要注意,当我们完成软链接后如果删除链接的目标,软链接文件不会独立存在,虽然仍保留文件名:

1ecd1b2606ed46e9956a89f231c9802c.png

2.硬链接

我们可以通过以下命令创建一个文件的硬连接。

[mlg@VM-20-8-centos lesson2]$ ln log1.txt hard

1ecd1b2606ed46e9956a89f231c9802c.png

       刚刚软连接我们将链接的目标删除后,是不能独立存在的;如果我们把硬链接的链接目标删除后会发生什么情况呢?

1ecd1b2606ed46e9956a89f231c9802c.png

       从上图可以看到,删除log.txt后,查看我们的硬链接文件,依旧能够看到内容。这里就相当于给log.txt重命名了。

我们发现硬链接的inode和源文件的inode是相同的,并且链接数是2,而软链接的链接数1;

这里的链接数表示的是硬链接数;

1ecd1b2606ed46e9956a89f231c9802c.png

硬链接的本质是根本就不是一个独立的文件,而是一个文件名和inode编号的映射关系,因为自己没有独立的inode。

硬链接的另一个场景:

我们创建一个目录后,硬链接数就是2,其原因就是一个inode对应了两个文件名(test.

1ecd1b2606ed46e9956a89f231c9802c.png



1ecd1b2606ed46e9956a89f231c9802c.png

目录
相关文章
|
23天前
|
缓存 安全 Linux
Linux 五种IO模型
Linux 五种IO模型
|
30天前
|
小程序 Linux 开发者
Linux之缓冲区与C库IO函数简单模拟
通过上述编程实例,可以对Linux系统中缓冲区和C库IO函数如何提高文件读写效率有了一个基本的了解。开发者需要根据应用程序的具体需求来选择合适的IO策略。
23 0
|
1月前
|
存储 IDE Linux
Linux源码阅读笔记14-IO体系结构与访问设备
Linux源码阅读笔记14-IO体系结构与访问设备
|
2月前
|
Linux 数据处理 C语言
【Linux】基础IO----系统文件IO & 文件描述符fd & 重定向(下)
【Linux】基础IO----系统文件IO & 文件描述符fd & 重定向(下)
48 0
|
2月前
|
Linux 编译器 C语言
【Linux】基础IO----理解缓冲区
【Linux】基础IO----理解缓冲区
37 0
【Linux】基础IO----理解缓冲区
|
2月前
|
缓存 网络协议 算法
【Linux系统编程】深入剖析:四大IO模型机制与应用(阻塞、非阻塞、多路复用、信号驱动IO 全解读)
在Linux环境下,主要存在四种IO模型,它们分别是阻塞IO(Blocking IO)、非阻塞IO(Non-blocking IO)、IO多路复用(I/O Multiplexing)和异步IO(Asynchronous IO)。下面我将逐一介绍这些模型的定义:
128 1
|
3月前
|
Linux 编译器 C语言
【Linux】基础IO_4
【Linux】基础IO_4
21 3
|
3月前
|
Linux C++
c++高级篇(三) ——Linux下IO多路复用之poll模型
c++高级篇(三) ——Linux下IO多路复用之poll模型
|
3月前
|
缓存 监控 网络协议
c++高级篇(二) ——Linux下IO多路复用之select模型
c++高级篇(二) ——Linux下IO多路复用之select模型
|
2月前
|
Linux C语言 C++
【Linux】基础IO----系统文件IO & 文件描述符fd & 重定向(上)
【Linux】基础IO----系统文件IO & 文件描述符fd & 重定向(上)
37 0