【Linux篇】第十篇——基础IO(系统文件IO+文件描述符+重定向+文件系统+软硬链接)(三)

简介: 【Linux篇】第十篇——基础IO(系统文件IO+文件描述符+重定向+文件系统+软硬链接)

文件系统


我们知道文件可以分为磁盘文件和内存文件,内存文件前面已经说过,现在说说磁盘文件

初始inode


概念:inode是在Linux操作系统中的一种数据结构,其本质是结构体,它包含了与文件系统中各个文件相关的一些重要信息。在Linux中创建文件系统时,同时回创建大量的inode。

磁盘文件由两部分构成,分别是文件内容和文件属性。文件内容就是文件当中存储的数据,文件属性就是文件的一些基本信息,例如文件名,文件大小以及文件创建时间等信息都是文件属性,问问价属性又被称为元信息。

在命令行输入ls -l,即可显示当前目录下各文件的属性信息。

image.png

其中各列信息所对应的信息如下所示:

image.png

在LINUX操作系统中,文件的元信息和内容是分离存储的,其中保存元信息的结构称为inode,因为系统当中可能存在大量的文件,所以我们需要给每个文件的属性集起一个唯一的编号,即inode号。也就是说,inode是一个文件的属性集合,Linux中几乎每个文件都有一个inode,为了区分系统当中大量的inode,我们为每个inode设置了编号


在命令行输入ls -i即可显示各个文件的inode编号

image.png

无论是文件内容还是文件属性,都是存储在磁盘当中的。

磁盘的概念


磁盘是一种永久性存储介质,在计算机中,磁盘几乎是唯一的机械设备,与磁盘相对应的就是内存,内存是掉电易失存储介质,目前所有的普通文件都是在磁盘中存储的。

磁盘在冯诺依曼体系结构中既可以充当输入设备,又可以充当输出设备

image.png

磁盘的寻优方案

对磁盘进行读写操作时,一般有以下几个步骤:

1.确定读写信息在磁盘的哪个盘面

2.确定读写信息在磁盘的哪个柱面

3.确定读写信息在磁盘的哪个扇区

通过以上步骤,可以确定信息在磁盘中的读写位置。

磁盘的分区与格式化介绍


线性存储介质

理解文件系统,首先我们必须将磁盘想象成一个线性的存储介质,想想磁带,当磁带被卷起来时,其就像磁盘一样是圆形的,但当我们把磁带拉直后,其就是线性的。

磁盘分区

磁盘通常被称为块设备,一般以扇区为单位,一个扇区的大小通常为512字节。我们若以大小为512G的磁盘为例,该磁盘就可以被分为十亿多个扇区。

image.png

计算机为了更好的管理磁盘,于是对磁盘进行了分区。磁盘分区就是使用分区编辑器在磁盘上划分几个逻辑部分, 盘片一旦划分成数个分区,不同的目录与文件就可以存储进不同的分区,分区越多,就可以将文件性质分的越细,按照更为细节的性质,存储在不同的地方以管理文件,例如在Windows下磁盘一般被分为C盘和D盘两个区域。


在Linux操作系统下,我们也可以通过以下命令查看我们磁盘的分区信息。

image.png

磁盘格式化

当磁盘完成分区后,我们还需要对磁盘进行格式化。磁盘格式化就是对磁盘中的分区进行初始化的一种操作1,这种操作通常会导致现有的磁盘或分区中所有的文件被清除。

简单来说,磁盘格式化就是对分区后的各个区域写入对应的管理信息。

image.png

其中,写入的管理信息是什么是由文件系统决定的,不同的文件系统格式化时写入的管理信息是不同的,常见的文件系统有EXT2,EXT3,XFS等。

EXT2文件系统的存储方案

计算机为了更好的管理磁盘,会对磁盘进行分区。而对于每一个分区来说,分区的头部会包括一个启动块(Boot Block),对于该分区的其余区域,EXT2文件系统会根据分区的大小将其划分为一个个的块组(Block Group).

image.png

注意:启动块的大小是确定的,而快组的大小是油格式化确实的,并且不能更改。


其次,每个组块都有着相同的组成结构,每个组块都由超级快(Super Block),快组描述符表(Group Descriptor Table),块位图(Block Bitmap),inode位图(inode Bitmap),inode表(inode Table)以及数据表(Data Block)组成。

image.png

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

Group Descriptor Table: 块组描述符表,描述该分区当中块组的属性信息。

Block Bitmap: 块位图当中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。

inode Bitmap: inode位图当中记录着每个inode是否空闲可用。

inode Table: 存放文件属性,即每个文件的inode。

Data Blocks: 存放文件内容。

注意:

如何理解创建一个空文件?

  • 通过遍历inode位图的方式,找到一个空闲的inode
  • 在inode表中找到对应的inode,并将文件的属性信息填充进inode结构中
  • 将该文件的文件名和inode指针添加到目录文件的数据块中。

如何理解对文件写入信息?

  • 通过文件的inode编号找到对应的inode结构。
  • 通过inode结构找到存储该文件内容的数据块,并将数据写入数据块
  • 若不存在数据块或申请的数据块已被写满,则通过遍历块位图的方式找到一个空闲的块号,并在数据区当中找到对应的空闲块,再将数据写入数据块,最后还需要建立数据块和inode结构的对应关系。

如何理解删除一个文件?

  • 将该文件对应的inode在inode位图当中置为无效。
  • 将该文件申请过的数据块在块位图当中置为无效。

因为此操作并不会真正将文件对应的信息删除,而只是将其inode号和数据块号置为了无效,所以当我们删除文件后短时间内是可以恢复的。

为什么说是短时间内呢,因为该文件对应的inode号和数据块号已经被置为了无效,因此后续创建其他文件或是对其他文件进行写入操作申请inode号和数据块号时,可能会将该置为无效了的inode号和数据块号分配出去,此时删除文件的数据就会被覆盖,也就无法恢复文件了。

为什么拷贝文件的时候特别慢,而删除文件却特别块?

因为拷贝文件需要先创建文件,然后再对该文件进行写入操作,该过程需要先申请inode号并填入文件的属性信息,之后还需要再申请数据块号,最后才能进行文件内容的数据拷贝,而删除文件只需将对应文件的inode号和数据块号置为无效,无需真正的删除文件,所以拷贝慢,而删除文件时很快的。

如何理解目录?

  • 都说在Linux下一切皆文件,目录当然也可以被看作为文件.
  • 目录有自己的属性信息,目录的inode结构当中存储的就是目录的属性信息,比如目录的大小,目录的拥有者等。
  • 目录也有自己的内容,目录的数据块当中存储的就是该目录下的文件名以及对应文件的inode指针。

注意:每个文件的文件名并没有存储在自己的inode结构当中,而是存储在该文件所处目录文件的文件内容当中。因为计算机并不关注文件的文件名,计算机只关注文件的inode号,而文件名和文件的inode指针存储在其目录文件的文件内容当中后,目录通过文件名和文件的inode指针即可将文件名和文件内容及其属性连接起来。

软硬链接


软链接


概念:软链接通过名字引用另一个文件,具有独立的inode,是一个独立的文件。里面的数据块存储了源文件的路径信息。

通过以下命令创建了一个文件的软链接

ln -s myfile myfile_S

image.png

通过ls -i -l命令我们可以看到,软链接文件的inode号与源文件的inode号是不同的,并且软链接文件的大小要比源文件的大小小得多

image.png

软链接又叫做符号链接,软链接文件相对于源文件来说是一个独立的文件, 该文件有自己的inode号,但是该文件只包含源文件的路径名,所以软链接文件的大小要比源文件小得多。软链接就类似于Windows操作系统当中的快捷方式。

image.png

但是软链接只是源文件的一个标记,当删除了源文件后,链接文件不能独立存在,虽然仍保留文件名, 但缺不能执行或查看软链接的内容了

image.png

硬链接


概念:硬链接通过inode引用另外一个文件和指向的文件共享同一个inode,不是一个独立的文件。在linux中可以让多个文件名对应于同一个inode.

In myproc myproc _c

image.png

通过ls -i -l 命令我们可以看到,硬链接文件的inode号与源文件的inode号是相同的,并且硬链接文件的大小与源文件的大小也是相同的,特别注意,当创建了一个硬链接文件后,该硬链接文件和源文件的硬链接数变成了2

image.png

硬链接文件就是源文件的一个别名,一个文件有几个文件名,该文件的硬链接数就是几,这里inode号为655989的文件有两个,因此该文件的硬链接数为2。


与软链接不同的是,当硬链接的源文件被删除后,硬链接文件仍能正常执行,只是文件的链接数减少了一个,因为此时该文件的文件名少了一个。


总之,硬链接就是让多个不在或者同一个目录下的文件名,同时能够修改同一个文件,其中一个修改后,所有与其有硬链接的文件都一起修改了。

为什么刚创建的目录的硬链接数是2?

我们创建的一个普通文件,该普通文件的硬链接数是1,因为此时该文件只有一个文件名。那为什么我们创建一个目录后,该目录的硬链接数是2?

image.png

因为每个目录创建后,该目录下默认会有两个隐含文件.和..,它们分别代表当前目录和上级目录,因此这里创建的目录有两个名字,一个是dir另一个就是该目录下的.,所以刚创建的目录硬链接数是2。通过命令我们也可以看到dir和该目录下的.的inode号是一样的,也就是说明它们代表的实际上是一个文件。

image.png

软硬链接的区别


  • 软链接是一个独立的文件,有独立的inode,而硬链接没有独立的inode
  • 软链接相当于快捷方式,硬链接本质没有创建文件,只是建立了一个文件名和已有的inode的映射关系,并写入当前目录。


相关文章
|
4月前
|
存储 Unix Linux
Linux I/O 重定向与管道
【8月更文挑战第17天】重定向在Linux中改变命令I/O流向,默认有">"覆盖输出至文件及">>"追加输出至文件末尾,便于保存结果;使用"<"从文件读取输入而非键盘,高效处理数据。文件描述符如0(stdin)、1(stdout)、2(stderr)标识I/O资源,支持读写操作。管道以"|"连接命令,使前一命令输出成为后一命令输入,如排序用户或找出CPU占用最高的进程,构建复杂数据处理流程。
52 9
|
4月前
|
Unix 数据处理 Perl
|
4月前
|
存储 Unix Linux
Linux I/O 重定向与管道
【8月更文挑战第14天】输出重定向可将命令结果存入文件,如`>`覆盖写入或`>>`追加写入。输入重定向从文件读取数据,如`<`代替键盘输入。这些操作利用文件描述符(如0:stdin, 1:stdout, 2:stderr)管理I/O。管道`|`连接命令,使前一命令输出作为后一命令输入,便于数据处理,如排序用户`sort -t: -k3 -n /etc/passwd | head -3`或查找CPU占用高的进程`ps aux --sort=-%cpu | head -6`。
46 4
|
4月前
|
Unix Linux Shell
Linux I/O 重定向简介
Linux I/O 重定向简介
42 2
|
3月前
crash —— 获取系统的磁盘IO统计数据
crash —— 获取系统的磁盘IO统计数据
|
4月前
|
存储 Linux 数据处理
在Linux中,管道(pipe)和重定向(redirection)的是什么?
在Linux中,管道(pipe)和重定向(redirection)的是什么?
|
5月前
|
Linux 数据处理 C语言
【Linux】基础IO----系统文件IO & 文件描述符fd & 重定向(下)
【Linux】基础IO----系统文件IO & 文件描述符fd & 重定向(下)
81 0
|
5月前
|
Linux C语言 C++
【Linux】基础IO----系统文件IO & 文件描述符fd & 重定向(上)
【Linux】基础IO----系统文件IO & 文件描述符fd & 重定向(上)
57 0