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

目录
相关文章
|
2月前
|
网络协议 安全 Linux
Linux C/C++之IO多路复用(select)
这篇文章主要介绍了TCP的三次握手和四次挥手过程,TCP与UDP的区别,以及如何使用select函数实现IO多路复用,包括服务器监听多个客户端连接和简单聊天室场景的应用示例。
95 0
|
2月前
|
存储 Linux C语言
Linux C/C++之IO多路复用(aio)
这篇文章介绍了Linux中IO多路复用技术epoll和异步IO技术aio的区别、执行过程、编程模型以及具体的编程实现方式。
91 1
Linux C/C++之IO多路复用(aio)
|
4月前
|
缓存 安全 Linux
Linux 五种IO模型
Linux 五种IO模型
|
2月前
|
Linux C++
Linux C/C++之IO多路复用(poll,epoll)
这篇文章详细介绍了Linux下C/C++编程中IO多路复用的两种机制:poll和epoll,包括它们的比较、编程模型、函数原型以及如何使用这些机制实现服务器端和客户端之间的多个连接。
28 0
Linux C/C++之IO多路复用(poll,epoll)
|
4月前
|
小程序 Linux 开发者
Linux之缓冲区与C库IO函数简单模拟
通过上述编程实例,可以对Linux系统中缓冲区和C库IO函数如何提高文件读写效率有了一个基本的了解。开发者需要根据应用程序的具体需求来选择合适的IO策略。
34 0
|
4月前
|
存储 IDE Linux
Linux源码阅读笔记14-IO体系结构与访问设备
Linux源码阅读笔记14-IO体系结构与访问设备
|
5月前
|
Linux 数据处理 C语言
【Linux】基础IO----系统文件IO & 文件描述符fd & 重定向(下)
【Linux】基础IO----系统文件IO & 文件描述符fd & 重定向(下)
78 0
|
5月前
|
Linux 编译器 C语言
【Linux】基础IO----理解缓冲区
【Linux】基础IO----理解缓冲区
73 0
【Linux】基础IO----理解缓冲区
|
5月前
|
缓存 网络协议 算法
【Linux系统编程】深入剖析:四大IO模型机制与应用(阻塞、非阻塞、多路复用、信号驱动IO 全解读)
在Linux环境下,主要存在四种IO模型,它们分别是阻塞IO(Blocking IO)、非阻塞IO(Non-blocking IO)、IO多路复用(I/O Multiplexing)和异步IO(Asynchronous IO)。下面我将逐一介绍这些模型的定义:
232 2
|
6月前
|
Linux 编译器 C语言
【Linux】基础IO_4
【Linux】基础IO_4
31 3