【Linux】-- 理解文件系统

目录

背景理解 

磁盘级文件

磁盘物理结构

磁盘存储结构

磁盘文件系统

软硬链接

软连接

特性

应用

硬连接

特性

应用

软硬链接的区别


背景理解 

        在语言级、系统级,文件操作函数中。在Linux下的一切皆文件中,我们所操作的皆是被打开的文件(被我们所打开、默认打开stdin等)。其本质上是:一个文件被加载到系统当中,操作系统就把该文件管理起来了。也就是存储内存当中,是进程和文件的关系。(已经被打开,已经纳入操作系统内部,已经由操作系统为了管理所创建的数据结构场景)。文件是大量的,总有未被打开的文件:打开的文件在内存当中,没有被打开的文件在外设当中。位置不一样,管理方式不一样,操作不一样,绝对不能混为一谈。

        现在服务器的主流存储方式为:SSD(固态硬盘)、磁盘(机械硬盘)等。但是由于SSD贵于磁盘,虽然快于磁盘的多,但是服务器主流还是使用的磁盘,因为性价比高,便宜容量还大。所以:对于应用级开发学习磁盘即可。

磁盘级文件

        首先,操作系统作为管理者,硬盘级文件没有被打开,就是由系统在磁盘上统一管理的。而磁盘是很慢的(CPU纳秒级、内存微秒级、外设毫秒级/秒级)。慢是很需要处理的,

        外设:冯诺依曼体系中承担输入输出的设备。

        核心:如何在磁盘上高效的存取。操作系统对其的操作,比如常说的将数据预存,预读,预加载。

需要学习的侧重点:(如何进行对磁盘文件进行分门别类的存储,用来支持更好的存取)

  • 单文件角度:文件在哪、文件多大、文件的其他属性是什么。
  • 多文件角度:一共有多少个文件、各自属性在哪里、如何快速查找、空出的可存储文件空间的余量、如何快速的查找到指定文件。

磁盘物理结构

  • 内存:掉电易失存储介质
  • 磁盘:永久性存储介质

        磁盘是一个外设 + 计算机中唯一的机械设备。磁盘结构:磁盘盘片、磁头、伺服系统、音圈马达……

        盘面是多层的,一层盘片两面皆可用,其一面的性质相当于光盘。

        但是其本质上,并不是光面的,而是由一系列的同心圆构成的,只有在同心圆之上才有所谓的类似磁铁南北极的两态状态的二进制,让我们去写。

磁盘存储结构

物理上的磁盘存储方式,CHS寻址

  • 在哪一个磁道柱面(Cylinder))上
  • 在哪一个上(对应哪一个磁头(Head))。
  • 在哪一个扇面(Sector)上。

        普通的磁盘,虽然扇区的分割是由圆形发射而出的射线分割的,但是根据密度的分布,短的密度紧密、长的密度稀疏。所以每一段的扇区是512KB。(根据发展,扇区大小可能是不同的,扇区的大小可能比512KB大)

        根据磁盘的物理结构,由于柱面、磁道、扇区可以将磁盘的抽象(虚拟、逻辑)结构:

        磁盘的盘面结构(圆形结构)-> 磁带的线性结构。我们可以将磁盘盘面根据磁带的原理拉伸成一个数组,磁盘的扇区是存储数据的基本单位。

磁盘文件系统

(前面说提的所有理论都是为了更加理解磁盘文件系统)

        Linux在磁盘上存储文件的时候,将内容和属性是分开存储的。扇区是存储数据的基本单位。但是操作系统(文件系统)和磁盘进行IO的基本单位是4KB。因为如果使用原本的扇区基本单位:

  1. 扇区的单位太小了,使用有可能会导致多次IO,进而导致效率降低。
  2. 如果操作系统使用和磁盘结构的基本单位一样的大小,万一磁盘基本大小改变了,操作系统的源代码就需要更改,这样会导致软件和硬件耦合度过高。所以不适用磁盘结构大小也是为了解耦合。

假设磁盘的大小为500G:

        操作系统就需要对500G的磁盘进行管理,但是500G的数据量是巨大的,如果整体管理就是低效的。操作系统采取的是分治的方式,对磁盘的管理 -> 对一个小分区的管理。

        将500G分成几个大分区后,再次分割。

Boot Block(不重要了解):一个分区有一个,启动块,开机的属性信息等,每个分区可能存在一份,主要是为了备份,有时候计算机有可能无法成功启动。windows说要不要恢复,也就是可能其中的一个分区的启动块出问题了,恢复也就是找其他分区的启动块,将数据备份一份过去。

 Linux在磁盘上存储文件的时候,将内容和属性是分开存储的:

Data block:会根据分区的大小划分为数个Block Group,如:多个4KB(扇区*8)大小的集合。保存的都是特定文件的内容

Inode Table:inode是一个大小为128字节的空间,保存的是对应特定文件的属性,该块组内,所有文件的inode空间的集合,需要标识唯一性,每一个inode块,都要有一个inode编号。一般而言一个文件,一个inode,一个inode编号。

        相对应的,文件的属性与内容是分开管理的,并且一个块组内的为文件个数也是很多的,因此对于文件的属性与内容我们也需要进行管理。此处的管理方式是位图。

Block Bitmap:假设有10000+个blocks,就会有10000+个比特位,比特位和特定的blocks是一一对应的。其中bitmap中比特位1,代表该blocks被占用,表示可用。

Inode Bitmap:假设有10000+个inode,就会有10000+个比特位,比特位和特定的inode是一一对应的。其中bitmap中比特位为1,代表该inode被占用,表示可用。

GDT(Group Descriptor Table):块组(Block group)描述符,这个块组有多大,已经使用了多少。有多少个inode,使用了多少个,还有多少。有多少个block,使用了多少个,还有多少。……

        通过将整个磁盘划分为:大分区  ->  小分区  ->  Boot Block + n个块组  ->  块组  ->  6个区域。通过此方式,将快组分割成如此,并且写入相关的管理数据  ->  每一个块组都这么干  ->  整个分区就被写入了文件系统信息(格式化)。

  1. 多个block属于一个同一个文件
  2. 找到文件,只需要找到文件对应的inode编号,就能找到文件的inode属性集合。
  • 一个文件"只"对应一个inode属性节点,inode编号。
  • 一个文件不是只能有一个block。

对于数据量小的文件:

        inode是一个结构体,其中的成员是对应特定文件的属性,一般而言一个文件,一个inode,一个inode编号。而inode需将文件所占的空间标识。

对于数据量大的文件:

        当文件的大小过大时,inode中指向数据的数组终究是有限的。这个时候其实变化不在inode中而是在data block中,不是所有的data block,只能存文件数据。其,其实也可以存其他块的块号。

inode编号与文件名:

        找到文件:inode编号(在分区内有效)  ->  分区特定的Block group  ->  inode  ->  属性  ->  内容。

        本质上系统通过找文件是使用inode标号,并不是如我们所编写的一样使用文件名查找文件,因为在Linux中,inode属性里其实并没有文件名的说法,因为inode编号依托于目录结构:

  • 一个目录下,可以有很多个文件,但是这些文件不可同名。
  • Linux下一切皆文件 -> 目录也是文件 -> 目录有自己的inode(目录的创建时间、所属组、权限……)与data block。

目录的data block:

        文件的名字并不在其文件的inode里存储,而我们的使用以及查找结果,都是文件名,正式因为目录data block的存在:

data block存储的是:文件名与inode编号的映射关系。由于文件名与inode编号(因为处于一个black group)都具有唯一性,所以互为Key值。

融会贯通的理解:

回想对于目录的权限操作:

  • 进入文件需要x(可执行)权限。
  • 创建文件需要w(可写)权限。

        因为,需要将文件名与inode编号的映射关系写入到目录的data block中。

  • 显示文件名与属性需要r(可读)权限。

        因为,需要显示文件名,但是文件名存储在目录中,需要文件名就需要在目录中查找;显示文件属性,就需要查找到文件,就需要依托于目录中文件名与inode编号的映射关系

  • 正是因为,查找inode编号是依托于目录结构,所以Linux下查找文件需要绝对路径相对路径

#创建文件:

        通过我们传入的路径,找到对应的分区、块组,然后在该块组内通过对inode Bitmap的遍历,查找0的同时,使用计数器计算inode编号。以inode Bitmap中0说所对应的位置开辟inode,将属性存储,再根据文件内容,调整其中的black数组(如果没数据清空,有数据根据Black Bitmap分配Data black)。至此文件系统将空间分配,相关数据存储并给出了新建文件的inode编号。再根据该文件处于的目录名,找到目录的inode属性信息,再以属性信息找到目录对应的Data black将用户给予的文件名与文件系统给予的inode标号,存储构建映射。

        以目录的文件名,找到目录相关数据:Linux内核中会将常用的目录结构构建成一颗树,其内部帮我们构建了文件名与其目录的inode编号的映射关系。本质上:也就是只要你拿到了文件名它的inode,最后就能通过文件目录找到目录的inode,进而找到目录的data block将新建的文件名与其inode标号写进去。

#删除文件:

        删除文件,即通过传入文件名,以此找到对应的目录与目录的inode,以此在目录的data black中根据映射关系,找到文件名对应的inode标号,以此找到文件的inode,然后将该文件的inode Bitmap与black Bitmap进行置0。

这也正是:为什么拷贝(下载)文件的时候很慢,而删除文件的时候很快的原因。

        正是由于拷贝(下载)文件,需要对inode的分配,data block的分配。并覆盖式的一一写入数据。而删除文件只需将标识inode与data block是否有效的Bitmap置0即可。

        如同通行的路,开辟时需要慢慢建造填补,因为废弃等原因而放弃时只需要一个标识牌即可。需要再次使用时直接铺设就行。

#查找文件:

        根据文件名,在其处于的目录的data block中查找到映射的文件inode编号,以此找到文件的inode。

当重装操作系统的时候:

  1. 需要你对磁盘进行分区,就是电脑中的A、B、C……盘。
  2. 需要进行格式化,在磁盘写入文件系统,也就是从哪到哪是一个Block group块的区域的划分、块中的Data block区域划分、inode Table区域的划分、Bitmap区域的划分以及清0、……。(格式化也很简单,就是重写文件系统,清空数据本质上:将Super Bloack、Group Rescriptor Table、两个Bitmap的4个区域全部清0)

        由于inode是固定的,data block是固定的。所以有时可能出现,其中一个还有空间但是另一个没空间了。于是就会出现系统里还有空间,但是创建文件老是失败的问题。

软硬链接

        核心:有无独立的inode标号。

软连接

命令:ln -s myproc myproc-s


将myproc.s软连接到myproc上

特性

        软连接的myproc.s的inode编号与myproc.c的inode编号不同,即本质上:不是同一个文件。可以理解为:软连接的文件的内容,是指向的文件对应的路径。

应用

        由于可执行程序放在一个路径下,所以我们执行其,需要相对路径或绝对路径。

         我们可以通过使用软连接,相当于多了一个快捷方式。

          如同windows下的桌面的快捷方式:

硬连接

命令:ln test.c hello


将myproc.s硬连接到myproc上

特性

         硬连接的hello与test.c的inode编号相同,但是本质上:同一个文件。可以理解为:硬连接是在指定的目录下,建立了文件名和指定inode的映射关系。也就是建立文件名关联(建立引用)。

        在 ls -l 的命令中,有一个对硬链接的计数。

        如何知道多少个文件名是关联的:

        当我们删除一个文件的时候,并不是把这个文件的inode删除,而是将这个文件的inode与引用计数,当引用计数为0的时候,这个文件,才删除。

应用

        当我们创建一个目录的时候我们可以发现,关联数并不是1而是2。

        这是因为目录中有两个隐藏的文件,需要使用 ls -a 才能显示出来。 

         '.' 也是一个文件,是硬链接到目录test上的。同时也可以发现有一个 '..'

        所以以此,我们可以通过将一个目录的硬连接数-2就可以推算出该目录内有多少个目录。

软硬链接的区别

  1. 软链接是一个独立的文件,有独立的inode,而硬链接没有独立的inode。可以理解为:软连接的文件的内容,是指向的文件对应的路径。
  2. 硬链接相当于快捷方式,硬链接本质没有创建文件,只是建立了一个文件名和已有的inode的映射关系,并写入当前目录的Data block中存储。可以理解为:硬连接是在指定的目录下,建立了文件名和指定inode的映射关系。也就是建立文件名关联(建立引用)。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

川入

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值