< Linux > 基础IO(文件系统 + 软硬链接) 您所在的位置:网站首页 linux软硬连接 < Linux > 基础IO(文件系统 + 软硬链接)

< Linux > 基础IO(文件系统 + 软硬链接)

2024-07-08 07:49| 来源: 网络整理| 查看: 265

目录

1、文件系统

        什么是磁盘

        磁盘的物理结构

        磁盘的存储结构

        磁盘的逻辑抽象结构

        inode

2、软硬链接

        软链接

        硬链接

        软硬连接的区别

        软硬链接的删除

3、文件的三个时间

1、文件系统

前面我们学习到的东西,全部都是在内存当中,但并不是所有的文件都被打开,大量的文件就在磁盘上静静的躺着,这批文件非常多,杂,乱,我们必须要对这些磁盘文件进行管理,我们把做这部分管理工作的操作系统模块称之为文件系统。现在我们把视角从内存迁移到磁盘上来看。

什么是磁盘

磁盘是计算机主要的存储介质,可以存储大量的二进制数据,并且断电后也能保持数据不丢失。早期计算机使用的磁盘是软磁盘(Floppy Disk,简称软盘),如今常用的磁盘是硬磁盘(Hard disk,简称硬盘)。

磁盘的物理结构

看如下磁盘的拆开图样式:

硬盘结构包括: 盘片、磁头、盘片主轴、控制电机、磁头控制器、数据转换器、接口、缓存等几个部份。. 所有的盘片 (一般硬盘里有多个盘片,盘片之间平行)都固定在一个主轴上。盘片的表面涂有磁性物质,这些磁性物质用来记录二进制数据。因为正反两面都可涂上磁性物质,故一个盘片可能会有两个盘面。在每个盘片的存储面上都有一个磁头,磁头与盘片之间的距离很小 (所以剧烈震动容易损坏),磁头连在一个磁头控制器上,统一控制各个磁头的运动。. 磁头沿盘片的半径方向动作,而盘片则按照指定方向高速旋转,这样磁头就可以到达盘片上的任意位置了。

磁盘的存储结构

看如下的图示:

扇区(sector):盘片被分成许多扇形的区域磁道(track):盘片上以盘片中心为圆心,不同半径的同心圆柱面(cylinder):硬盘中,不同盘片相同半径的磁道所组成的援助磁头(head):每个磁盘都有两个面,每个面都有一个磁头 

磁盘上存储的基本单位是扇区,一般是512字节,数据是在扇区上存储的。在读写磁盘的时候,磁头找的是某一个面(哪一个磁头)的某一个磁道(哪一个柱面——距离圆心的半径)的某一个扇区(磁道上的一段)。只要我们能够找到磁盘上的盘面,柱面(磁道),扇区,即CHS地址,我们就能找到磁盘上的任意一个存储单元。

磁盘的逻辑抽象结构

理解文件系统,首先我们必须将磁盘想象成一个线性的存储介质,想想磁带:

磁带被卷起来时,就像磁盘一样是圆形的,里面存储的是数据,当我们把磁带拉直后,其就是线性的。我们把盘片想象成为线性的结构,就可以把盘片当成是数组,定位有关sector(扇区),只要找到下标LBA(逻辑块地址)就可以了。因此对磁盘的管理,就转化成为了对数组空间的管理,如图:

因此内存中的数据想要往磁盘里写入,在内存中只需要知道有关地址叫LBA(逻辑块地址),然后将LBA地址映射转换为CHS地址,再将内存中的数据配合CHS写到磁盘里,即可完成磁盘的写入。

问:如何将LBA地址转化为CHS地址? 

现在假设磁盘有2片(4个面),一个面能存1000个数据,每个面有20个磁道,已知LBA地址是3234,那么写入的过程如下:

3234 / 1000 = 3 —— 在第3面(H是3)3234 % 1000 = 234234 / 20 = 11 —— 在第11个磁道(C是11)234 % 20 = 14 —— 在第14个扇区(S是14)

综上:

C:11H:3S:14

上述磁盘的每一个扇区的大小是512字节,但是有一个问题,OS表示每一次访问512字节很小,效率差,因此OS对进进行再一次抽象,以8个扇区为单位,整合为一个OS所认为的存储单元,所以大小就变成了4KB。OS在读写数据的时候,就会去这个存储单元中找。(IO的基本单位是4KB)

上述这样操作有两个好处:

提高IO效率不要让软件(OS)设计和硬件(磁盘)具有强相关性,换句话说,就是解耦合!

又因为磁盘(512GB)太大了,OS就会将其划分多个小区域,但是依旧很多,就再划分成多个小组,把每个小部分都做管理,分而治之,就管好了整个大空间,这就是分区的过程。

综上对如何管理文件,就变成了对一个小组数据的管理。

inode

inode初步解释:

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

其中,各列信息对应的文件属性如下:

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

在命令行当中输入ls -i,即可显示当前目录下各文件的inode编号。

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

Linux ext2文件系统:

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

注意:

启动块的大小是确定的,而块组的大小是由格式化的时候确定的,并且不可以更改。文件 = 内容 + 属性,二者都是数据,都要存储。Linux采用的是将内容和属性数据分开存储的方案,内容在block中(4KB),内容是可以无限增多的。属性数据在inode中(128字节),文件的属性是稳定的。

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

①、Boot Block:与开机有关,里面包括了各种开机信息,有分区表,以及软件的位置信息。②、Block Group:整个时文件系统所划分的不同的组,每个组的结构构成都相同。③、Date blocks:以块为单位,进行文件的保存(所占的空间最大,80%左右)。④、inode Table:以128字节为单位,进行inode属性的保存。inode属性里面有一个inode编号,一般而言,一个文件,一个inode,一个inode编号。

前面的1968979和1968977就是文件的inode编号。

⑤、Block Bitmap:这里按位记录着Date Block(数据块)哪个被占用,哪个没被占用,每个bit位为0表示没被占用,为1表示被占用。⑥、inode Bitmap:这里按位记录着inode的使用情况。每个bit位为0表示没被占用,为1表示被占用。⑦、Group Descriptor Table(GDT):对块组进行描述,包含了有多少inode,起始的inode编号,有多少个inode被使用,有多少block被使用,还剩多少等待信息。⑧、Super Block:就是我们文件系统的顶层数据结构,记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了。

问1:既然Super Block可以显示整个分区的信息,那么为什么还会在组里,而不是在组外面呢?

实际上,并不是每个组都有Super Block的,只是在一部分组中,有几个有,并且这些Super Block是完全相同的,它的主要目的是为了备份,如果放在外面,那么这个位置一旦出错,那么这整个区的信息就全部丢失了,而有了很多份备份,丢失了一份,还可以去从另一份中得到信息。

问2:一个inode(文件,属性)如何和属于自己的内容关联起来呢?

inode中有struct inode结构体,里面包括了文件所有的属性,和一个blocks[15]数组,其中的下标[0, 11]直接保存的就是该文件对应的blocks编号,下标[12, 15]指向一个datablock,但是这个datablock不保存有效数据,而保存文件所适用的其它块的编号。(相当于一个二级索引)

问3:文件名算文件的属性,但是inode里面,并不保存文件名,因为Linux下,底层实际都是通过inode编号标识文件的。因此,要找到文件,必须找到文件的inode编号,那么是谁帮我们找到inode编号呢?

首先,Linux下目录是文件,文件 = 内容 + 属性,所以一个目录也有自己的blocks和inode,目录的数据块blocks中放的就是文件名和inode编号的映射关系!因此Linux同一个目录下,不可以创建多个同名文件,文件名本身就是一个具有Key值的东西。

问4:当我们创建一个文件时,OS操作系统做了什么?

先查找inode Bitmap,找到一个比特位没有被使用,把此比特位由0置为1,在inode Table中找到对应的inode节点,向里面写入对应的属性,并且为它分配数据块,把数据写到数据块中,同时修改block Bitmap,并且建立inode和block的映射关系,最终返回该文件的inode。

创建一个文件的时候,一定是在一个目录下。

通过文件名(对应的inode编号)-> 找到自己所处的目录 -> 根据目录的inode,找到目录的data block -> 将文件名和inode编号的映射关系写入到目录的数据块中。

问5:删除一个文件,OS操作系统做了什么呢?

找到自己的目录的inode,再找到自己目录的blocks,然后根据文件名的唯一性,以及它与inode的映射关系,找到对应的inode编号,然后再根据inode编号找到它对应的Block group,然后将该文件所对应的inode Bitmap和block Bitmap由1置0,就完成了文件的删除。最后在文件所处的,目录中,把文件名和inode所对应的映射关系去掉,此时这个文件就被删掉了。所以平时拷贝文件所花费的时间很长,而删除东西几秒钟就完事了,原因在于删除只是把标记该文件对应的属性和数据块相关的位图由1置0即可。因此,Linux并没有真正的清除数据,只是将inode Bitmap和block Bitmap由1置0,就相当于删除了。此外,想要恢复整个删除的数据也很容易,只要知道了这个inode,通过一些工具,把这个inode对应的inode Bitmap和block Bitmap由0恢复成1即可。

问6:为什么拷贝文件的时间耗费很长,而删除文件却很快?

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

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

[xzy@ecs-333953 date22]$ ln -s my.txt my.txt.soft

通过 ls -i -l 命令可以看到,软连接的inode号和源文件的inode号是不同的,并且软连接文件的大小比源文件的大小要小的多。

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

如下我使用mkdir -p指令在当前目录下创建嵌套的目录,并cd到d3目录:

我在d3目录下创建一个可执行程序,并退回到date22目录下

现在想在date22目录下执行d3目录下的mytest.c.exe可执行程序,按照以往的方法我们是这样的:

现在我们就可以给mytest.c.exe建立软链接,即可通过软连接(快捷方式)的形式执行此可执行程序:

综上,软连接就是一个快捷方式,上述my.exe是软连接,相当于是mytest.c.exe的快捷方式。

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

问:既然软连接是一个独立文件,inode是独立的,那么软连接的文件内容是什么呢?

软连接保存的内容就是指向的文件的所在路径!!!  硬链接

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

硬链接就是单纯的在Linux指定的目录下,给指定的文件新增文件名和inode编号的映射关系。

通过ls -i -l命令我们可以看到,硬链接文件的inode号与源文件的inode号是相同的,并且硬链接文件的大小与源文件的大小也是相同的,特别注意的是, 新创建的my.txt文件的硬链接数为1,可给my.txt文件建立硬链接后,其硬链接数变成了2。

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

我对可执行程序myfile建立硬链接,现在删除硬链接的源文件:

 

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

问1:什么是硬连接数?

硬连接数本质就是该文件inode属性中的计数器count,标识有几个文件名和我的inode建立了映射关系。简言之,就是有几个文件名指向我的inode(文件本身)

问2:硬链接有什么用呢?

看如下我重新创建了一个目录和文件:

为什么文件被创建出来,默认的硬连接数是1?

如果硬链接数是0,那么就应该是被关闭的文件了,所以至少应该从1开始。此外,普通文件的文件名,本身就和自己的inode具有映射关系,且只有1个,所以文件的默认硬连接数是1。

为什么目录被创建出来,默认的硬连接数是2呢?

我们cd进入创建的目录,会发现目录中自动创建两个文件 . 和 ..,仔细看这个inode编号,会发现 . 和mydir的inode编号是一样的,综上,自己本身的目录名mydir和自己本身的inode有一个映射关系,且任何一个目录里头都有一个 . ,它通过自己所处的目录和inode建立一个硬链接,所以目录的默认硬链接数是2。

仔细看上图,会发现mydir目录下的 .. 文件的inode和上级目录date22的inode是一样的,而mydir目录下的 . 文件和当前目录mydir的inode是一样的,综上,. 和 .. 分别对应当前路径和上级路径。

所以我们也可以根据系统的硬连接数,不进入文件,从而估算出文件的目录数(一个目录下相邻的子目录数 = 该目录的硬连接数 - 2)。因此,硬链接的一个作用就是进行路径切换。

软硬连接的区别

区别如下:

软连接是一个独立文件,有自己独立的inode和inode编号。硬链接不是一个独立文件,它和它的目标文件使用的是同一个inode。软连接相当于快捷方式,硬链接本质没有创建文件,只是建立了一个文件名和已有的inode的映射关系,并写入当前目录。 软硬链接的删除

建议用unlink来删除软硬连接的文件(unlink也可以删除普通文件,与rm没什么区别)

3、文件的三个时间

在Linux中,我们可以使用命令 stat 文件名来查看对应文件的信息:

这其中包含了文件的三个时间信息:

Access: 文件最后被访问的时间。Modify: 文件内容最后的修改时间。Change: 文件属性最后的修改时间。

当我们修改文件内容时,文件的大小一般会随之改变,所以Modify的改变会带动Change一起改变,但丢该文件属性一般不会影响文件内容,所以一般情况下Change的改变不会带动Modify的改变。此外,我们可以使用touch命令把这三个时间都更新到最新状态。(当一文件存在时使用touch命令,此时touch命令的作用变为更新文件信息)。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有