Linux--文件系统

目录

0前言

 1.关于物理磁盘

1.1见一下物理磁盘

1.2 了解磁盘的存储结构

1.3对磁盘的逻辑结构进行抽象

 2.文件系统

2.1搭建文件系统的宏观认识(了解分区,分组,inode)

2.2文件系统的细节问题 


0前言

        在我们的计算机中是存在非常多的文件的,但只有少量的文件是被打开的,那没被打开的文件被存放在哪里呢?答案是:磁盘中,解下我们要先了解磁盘的知识,然后再引入文件系统(如何管理磁盘文件的),最后我们才能解释清楚一个重要的概念inode(索引节点),

为下一章软硬链接做铺垫。


 1.关于物理磁盘


1.1见一下物理磁盘

我们都知道计算机只认识二进制:二进制不就是0和1吗,那么什么是0和1呢?

        0和1在计算机中分别代表“关闭”和“打开”的状态;在计算机内部,所有的数据、文本、图像、音频、视频等各种类型的信息都被转换为二进制码进行处理;在数字逻辑中,0和1可以用来表示逻辑值,如“假”和“真”,或者表示电路的关闭和打开状态。在内存和存储器中,所有的数据都以二进制形式存储,包括变量、数组、数据结构等。上面的0,1都是被规定出来的,但0,1在物理层面会有不同的表现。

普通磁盘:

企业级磁盘(服务器):


1.2 了解磁盘的存储结构

磁盘的存储结构主要包括以下几个方面:

  • 盘片:磁盘由多个盘片组成,这些盘片是圆形的坚硬表面,通过引入磁性变化来永久存储数据。盘片通常由一些硬质材料(如铝)制成,然后涂上薄薄的磁性层,即使驱动器断电,也能持久存储数据位。每个盘片有两面,每面都称为表面,都可以记录信息。
  • 磁道与扇区:每个盘片被划分为若干个磁道(半径不同的同心圆环),每个磁道又被划分为若干个扇区(磁道上的一个弧段)。扇区是磁盘的最小组成单元,通常是512字节。(读写数据的基本单位)在数据传输过程中,数据是按扇区进行存放和读取的。

  • 柱面:硬盘中,所有盘面中半径相同的磁道组成柱面。由于所有磁头都是连在同一个磁臂上的,因此所有磁头只能同时读写同一柱面的不同盘面。
  • 磁头:每个盘面对应一个磁头,磁头负责读写磁盘上的数据。磁头悬浮在磁盘表面,通过步进电机在不同柱面之间移动,以实现对不同柱面的读写操作。

        读写操作:当计算机需要读取或写入数据时,磁盘驱动器会接收到指令并将磁头移动到相应的磁道上。在读取数据时,磁头会感应到磁盘表面磁性材料上的磁场变化,并将其转换为电信号(即二进制数据)。这些电信号随后被解码为计算机可以理解的0和1。在写入数据时,磁盘驱动器会将计算机发送的二进制数据(0和1)转换为磁场信号,并通过磁头将这些信号写入磁盘的指定位置。(CHS定址法)(这些磁性材料具有稳定的磁化特性,即使在磁盘停止转动和电源关闭的情况下,也能保持其磁化状态不变。这意味着存储在磁盘上的数据可以长时间保持而不丢失。

        0和1的表示:在机械磁盘中,0和1是通过磁盘表面磁性材料的磁场方向来表示的。当磁性材料被磁化为一个特定的方向时,它表示一个二进制位(bit)的0或1。通过改变磁盘上磁性材料的磁场方向,磁盘可以存储大量的二进制数据。


1.3对磁盘的逻辑结构进行抽象

在这里我们走一遍OS对磁盘这样的设别进行管理和抽象。

假如我们有800G 的内存,我们假如每一个盘面200G,这样我们在OS中就可以拼凑出一段连续的内存。每个面上又有若干个扇区(sector)。 这样我么们就得到一个数组了,那我们就可以通过下标去访问每一个扇区了。接下来我们就只需要将下标转化为CHS就可以访问磁盘中对应的位置了。

假如每一个盘面有1000个扇区,同时它有十个磁道,那么每个磁道就有100个扇区。

  • 我们用index表示某个扇区的下标
  • 那么index/1000 就能获得该扇区位于哪个盘面了(H)。
  • index%1000=temp;[0,999](表示第一面1000个扇区中的某一个扇区)
  • temp/100=C(表示扇区对应的磁道)
  • temp%100=S (每个磁道有100个,那么%100就能得到对应的扇区了。

通过上面的操作我们就将OS中的线性地址转化为磁盘中的CHS地址了。(index->CHS)

那么,我们就可以知道了,文件=很多个sector的数组的下标!!!

        我们上面提到过,磁盘的基本读写单位是512字节,这是非常小的,效率比较低。

一般而言,OS未来和磁盘交互的时候,基本单位(规定出来的):4KB(8*sector)8个连续的扇区,后面我们会将这个称为数据块,每个块都有对应的块号。那么,我们就可以认为,文件=很多个数据块。那么,我们通过块读取,我们就可以一次读取8个 扇区的下标,然后通过这些下标再次去走上面(index->CHS)的逻辑,我们就可以以块进行读取数据了。

        对于OS而言,只需要知道块的起始标号和磁盘的大小,我们就可以活得磁盘内所有的数据了。我们将块的标号称为LBA 逻辑区块地址 (Logical Block Address, LBA)。

解下来解释分区的概念:整个800G就是一个LBA blacks[N]数组,如果我们整个只要将内存通过LBA标记起始位置和结束位置,此时我们就将内存分区了。

       


 2.文件系统


2.1搭建文件系统的宏观认识(了解分区,分组,inode)

        一个分区的内存大小还是非常大,因此我们会将一个分区再分成若干个组,只要能管理好一个组,那我们就可以以同样的方法将其它组也管理起来。

        我们都知道,文件=内容+属性(本质也是数据)。文件在磁盘中存储,本质是:文件的内容+文件的属性数据。Linux文件系统的特点:文件内容和文件属性是分开存储的。

        Linux ext2文件系统,下图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被划分为一个个的block。一个block的大小是由格式化的时候确定的,并且不可以更改。例如mke2fs的-b选项可以设定block大小为1024、2048或4096字节。而上图中启动块(Boot Block)的大小是确定的,磁盘空间被划分为的若干个组,文件系统以这些块组为单位来管理磁盘空间。

  • Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。
  • 数据区(Data blocks):只存放文件内容,在一个组中占比最大。
  • 块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用(比特位的位置,表示块号。比特位的内容,表示该块是否被占用。)
  • i节点表(inode Table):存放文件属性 如 文件大小,所有者,最近修改时间等。(一个文件对应一个inode表)。inode内部,不包含文件名!在内核层面,每一个文件都有inode number!我们通过inode号标识一个文件(使用命令 ll - li就可以看到文件的inode号)。在这个结构体中还会包含一个数组:int datablocks[N],这个数组会记录该文件包含了哪些数据块,这样我们就可以获得文件的内容和属性了。

  • inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。
  • 超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了(记录的是整个分区的使用情况)
  • GDT,Group Descriptor Table:块组描述符,描述块组属性信息及使用情况,是一个管理字段。

因此,一个文件的属性存在inode表中,内容存在Data blocks中。在每一个分区内部分组,然后写入文件的管理数据,这个过程我们就称为:格式化!!!格式化的本质就是写入文件系统。


2.2文件系统的细节问题 

       1. inode号:是以分区为单位分配的,每个区内inode号是不重复的(分区层面具有唯一性)。每个区中的每个组都有自己的start inode和end inode,我们通过inode便可以先知道它是属于哪个组的,之后便可以通过该的inode table和inode bitmap找到该inode的属性。

      2.  data blocks:数据块也是整体分配的,也有自己的start inode和end inode,据此,系统可以定位到文件的数据块,因此可以在任意的分区内找到它的数据块(inode一旦映射到某一组了,优先使用组内的数据块,一般不要跨组使用),进而读取或写入文件的数据。

      3.  int datablocks[15]:在Linux et2文件系统下,该数组的大小一般为15,那就意味着只能映射到data blocks中的15个数据块,那么一个文件就只能有15*4KB的内存?显然不是这样的。如果文件大小小于或等于一个数据块的大小(通常是4KB),那么它只会占用一个直接块(那么下标直接映射对应的块就好了)。如果文件大小超过一个数据块但小于或等于一个数据块加上一级间接块可以引用的数据块数量,那么它还会占用一个一级间接块(一级间接块存的是索引,又可以记录很多其它块的地址了),如果一级间接块还是满足不了需要的内存,那么我们就会使用更高级的间接块,知道满足需求为止)

        如果一个分组是10GB,但文件大小是20GB,但这影响吗,不影响,因为上面的映射关系是可以跨组访问的,但不建议这么做,因为一旦跨组访问了,意味所有的块不连续了,磁盘寻址效率也会大大降低。

        4.我们用的是文件名,为什么能直接拿到inode编号呢?

        我们从目录谈起,目录也是文件=文件属性+文件内容,目录的内容中放的是文件名和inode的映射关系。inode唯一,文件名也就唯一;查找文件的顺序,先文件名再寻对应的inode编号。这就解释了为什么去掉了目录的r权限,就不能访问目录中的内容了。没有r权限就没有文件名和inode的映射关系,就找不到这个文件。w权限:新建文件,最后一定要向当前所处目录内容中写入,文件名和inode的映射关系。

      5.如何理解一个文件的增删查改呢?

  1. 增加文件
    • 当在Linux系统中创建一个新文件时,系统会为该文件分配一个唯一的inode号码,并在inode中存储该文件的属性信息。
    • inode数量是有限的,因此当文件系统中的inode耗尽时,即使磁盘空间还有剩余,也无法再创建新文件。
  2. 删除文件
    • 删除文件时,系统实际上只是删除了文件名与inode号码之间的链接关系,并释放了inode号码和其所占用的磁盘空间。但文件的实际内容在磁盘上仍然存在,直到其占用的磁盘空间被其他文件覆盖。
    • 如果删除了一个目录,并且该目录下有子目录或文件,那么该目录下的所有子目录和文件都将被一并删除(除非使用了-r选项来递归删除)。
  3. 查询文件
    • 查询文件时,系统首先通过文件名找到对应的inode号码,然后读取inode中的信息以获取文件的实际内容位置。(找到指定的文件->文件所在的目录->根据文件名:inode->目标文件的inode,当我们目标文件的路径非常的复杂的时候,OS会做路径的逆向解析,但不是每次都做,OS会对常用的路径做缓存)
    • 使用如ls -i命令可以查看文件的inode号码。
  4. 修改文件
    • 修改文件时,系统会根据文件的inode号码找到对应的inode,并修改其中的文件属性信息(如修改时间戳、权限等)。
    • 如果修改的是文件的内容,那么系统实际上是在磁盘上找到文件内容所在的块,并直接修改这些块的内容。但inode中的文件字节数等属性信息会相应地更新。

        6.为了更好的理解分区,我们来手动创建一个分区

        在Linux中,dd命令本身并不直接用于创建文件系统分区,但它可以用来创建磁盘镜像或填充整个磁盘(或分区)以准备进行分区和文件系统创建。但是,你可以通过先使用dd来填充一个磁盘或磁盘映像,然后使用如fdiskpartedgparted等工具来创建分区。

        1.创建一个10M的磁盘映像

        文件大小确实为10M

        2.格式化一个文件系统

        3.挂载磁盘映像(将一个文件系统附加到某个目录上,从而可以像访问普通目录一样访问该文件系统。)

        4.在我们创建的disk.img分区中创建一个文件

结论:我们访问一个文件有更前置的动作,分区->写入文件系统(格式化)->挂载到指定目录下->进入该目录->在指定的分区中进行文件操作。一个文件在访问之前,都是先有目录的!我在哪个目录下,我就知道我在哪个分区下。

        目录通常是谁提供的呢?

        你或者你的进程早就提供了。目录是文件系统的一部分,但它们的创建和管理是由系统管理员和普通用户通过文件系统提供的工具(如mkdirmount等)来完成的。挂载点也是目录,但它们是专门用于将新文件系统附加到现有目录树上的。

下一章:软硬链接!!!

  • 35
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值