Linux文件系统 超详细的都为你整理到这里了,要想知道文件系统是什么,以及文件系统的内部是怎么样的,看这一篇就够了

大家好呀,我是残念,希望在你看完之后,能对你有所帮助,有什么不足请指正!共同学习交流哦!
本文由:残念ing原创优快云首发,如需要转载请通知
个人主页:残念ing-优快云博客,欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
📣系列专栏:[残念ing 的【Linux】系列专栏——优快云博客]

前言:
在这里插入图片描述

我们都知道要找到一个文件,就要知道这个文件的路径,就好像我们平时去取快递,我们都会收到一个类似于11-1-1001的取件码,我们可以通过这个取件码,到对应位置找到我们的快递,找文件其实也是一样的,路径就是为了定位文件。但是我们知道文件系统是怎么把没有被打开的文件,在磁盘上管理的吗?

学习目标:

  1. 认识磁盘结构
  2. 抽象理解分区 格式化
  3. 学习ext*系列的文件系统,inode号和inode
  4. 理解什么叫做文件,什么叫做目录,如何解释之前的很多问题
  5. 做一个小实验
  6. 深刻理解软硬链接

1. 认识磁盘结构

1.1 理解硬件

磁盘、服务器、机柜、机房
机械磁盘是计算机中唯一的一个机械设备
磁盘——外设
特点:慢 容量大,价格便宜
我们都知道计算机只认二进制,但是不同的硬件对二进制的表达是不同的
磁盘我们可以把它理解成是由上亿个小磁铁构成,然后规定N为1S为0,这样根据NS的交换,跟计算机进行交互。
在这里插入图片描述
服务器
在这里插入图片描述
机柜
在这里插入图片描述
机房
特点:建设的成本比较高
在这里插入图片描述

1.2 磁盘的物理结构

在这里插入图片描述
磁头:笔 磁盘:纸

1.3 磁盘的存储结构

在这里插入图片描述
在这里插入图片描述

磁头在缓动的本质是:定位磁道(柱面)
磁盘盘片旋转的本质:定位扇区

扇区:是磁盘存储数据的基本单位(512字节),读写时都是以块来进行的,所以是块设备。
在这里插入图片描述

如何定位一个扇区呢?

  1. 可以先定位磁头(header)
  2. 确定磁头要访问哪一个柱面(磁道)(cylinder)
  3. 定位一个扇面(sector)
  4. CHS定位
    我们知道文件=内容+属性,这些都是数据,无非就是占据哪几个扇区的问题,能定位一个扇区,就能定位多个扇区。

在这里插入图片描述

总结

磁铁数:每个盘片都有上下两面,分别对应1个磁铁,共两个磁头
磁道数:磁盘是从盘片外面往内圆编号0磁道、1磁道…靠近主轴的同心圆用于停靠磁头,不存储数据。
柱面数:磁道构成柱面,数量上等同于磁道个数
扇区数:每个磁道都被分成很多扇形区域,梅道的扇区数量相同
圆盘数:就是盘片的数量
磁盘容量=磁头数×磁道(柱面数)× 每道扇区数×每扇区字行数
要注意的细节:传动臂上的磁头是共进退的

在这里插入图片描述

1.4 磁盘的逻辑结构

1.4.1 理解过程

在这里插入图片描述
磁带上面可以存储数据,我们可以把磁带“拉直”,形成线性结构

那么磁盘本质上虽然是硬质的,但是逻辑上我们可以把磁盘想象成为卷在一起的磁带,那么磁盘的逻辑存储结构我们也可以类似于:

这样每一个扇区,就有了一个线性地址(其实就是数组下标),这种地址叫做LBA

在这里插入图片描述

1.4.2 真实过程

一个细节:传动臂上的磁头是共进退的

柱面是一个逻辑上的概念,其实就是每一面上,相同半径的逻辑上构成柱面。所以,磁盘物理上分了很多面,但是在我们看来,逻辑上,整体是由“柱面”卷起来了的
在这里插入图片描述
所以,磁盘的真实情况是:
磁盘
某一盘面的某一个磁道展开:
在这里插入图片描述
即:就是一维数组

柱面
整个磁盘所有盘面的同一个磁道,即柱面展开:
在这里插入图片描述

柱面上的每个磁道,扇区个数是一样的
即:二维数组

磁盘

在这里插入图片描述
整个磁盘不就是多张二维的扇区数组表
所以,寻址一个扇区:先找到是哪个柱面(cylinder),在确定柱面内部是哪一个磁道(其实就是磁头位置,header),再确定扇区(sector),所以就有了我们之前说的CHS。
我们知道C/C++的数组,在我们看来,其实全部是一维数组组成的:
在这里插入图片描述
所以,每个扇区都有一个下标,我们叫做LBA(logical Block Address)地址,其实就是线性地址,那么要怎么计算得到这个LBA地址呢?

CHS转换LBA

  1. 磁头数×每磁道扇区数=单个柱面的扇区总数
  2. LBA=柱面号C ×单个柱面的扇区总数+磁头号H×每磁道扇区数+扇区号S-1
  3. 即:LBA=柱面号C×(磁头数×每个磁道扇区数)+磁头号H×每磁道扇区数+扇区号S-1
  4. 扇区号通常是从1开始的,而LBA中,地址是从0开始的
  5. 柱面和磁道都是0开始编号的
  6. 总柱面,磁道个数,扇区总数等信息,在磁盘内部会自动维护,上层开机的时候,会获取到这些参数。

LBA转成CHS

  1. 柱面号C=LBA/(磁头数×每个磁道扇区数)【就是单个柱面的扇区总数】
  2. 磁头号H=(LBA%(磁头数×每个磁道扇区数))/ 每个磁道扇区数
  3. 扇区号S=(LBA%每个磁道扇区数)+1
    /:整除

所以:从此以后,在磁盘使用者看来,根本就不关心CHS地址,而是直接使用LBA地址,磁盘内部自己转换,所以:从现在开始,磁盘就是一个元素为扇区的一维数组,数组的下标就是每一个扇区的LBA地址,OS使用磁盘,就可以用一个数组来访问磁盘扇区了。

2. 抽象理解分区 格式化

OS和磁盘在进行IO的时候,以扇区为基本单位(512字节)单次IO的数据一般都会很少的,一般选用4KB数据块也就是8个扇区。
磁盘可以认为是以块为单位的一维数组
在这里插入图片描述
当我们把一个块区域(4KB)管理好了,根据这块区域,就可以来管理其他区块了

3. 学习ext*系列的文件系统,inode号和inode

在这里插入图片描述

· Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。政府管理各区的例子

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

· GDT,Group Descriptor Table:块组描述符,描述块组属性信息,有兴趣的同学可以在了解一下

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

· inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。(0为空闲,1为占用)

· i节点表:存放文件属性 如 文件大小,所有者,最近修改时间等

· 数据区:存放文件内容

我们早知道文件=内容+属性,而属性呢也是数据,它是以数据结构的方式构建出来的(inode),一个文件有一个inode,而这个inode就是属性数据的集合(属性集)。
在这里插入图片描述
一个inode的大小一般都是128字节,磁盘和OS在进行交互时是以4KB(一个块)进行的,所以里面就有4KB/128字节。

在这里插入图片描述
补充:在Linux中,文件名不在inode中保存
一个分区一个操作系统,不同的分区可以有不同的系统

在这里插入图片描述
在Linux下,文件属性和文件内容是分开存储的!!!

删除本质是设置inode,block无效了。当文件误删除后,尽量不要进行操作,因为如果你进行操作,可能会使,无效的inode。block被利用起来。导致最终找不到误删的文件了。

4. 理解什么叫做文件,什么叫做目录,如何解释之前的很多问题(准确理解文件系统)

格式化:写入空的文件系统
inode号的个数和block个数都是固定的,且存在inode用完,但是block还有余的情况

关于inode
一套inode是以分区为单位,inode在分配的时候,只需要确定每个组的起始inode就可以了

关于block
在一个分区中块号也是统一编号的,

group 0 问题:
1 我们是如何分配一个inode?
2 我们是如何分配一个block?
在这里插入图片描述

知道inode号了

1 如何查找一个文件
首先根据inode号,先确定在哪个组区间,然后用inode号减去Struts_inode,根据结果(inodebitmap)去inode表中对应位置找到对应的属性,然后加载到内存里,根据属性中的映射关系,找到块号,这样内容也找到了
在这里插入图片描述

2 如何删除一个文件
删除的前提就是先找到,然后将inodebitmap置为0,将blockbitmitmap置为0 ,在groupDescriptorTable中记录使用的资源就应该减减(更新属性)
在这里插入图片描述

3 如何修改一个文件
修改的前提也是查找,先找到这个文件,然后如果要改属性,根据inodeBitmap就将该文件,从inodeTable里面的拿出来加载到内存,进行修改,修改后再将其放回。(该内容也是一样的,只是内容要加载到内核级缓冲区,改完后再将其写回到磁盘)
在这里插入图片描述

4 如何新增一个文件
在groupDescriptorTable中找到并且查看没有被分配的inode和datablock,分配给新增文件,并且在inode和block表中将对应位置置1,将文件属性和内容加载到inodeTable和Datablock中。

这些操作全部都属于内存级操作

4.1 inode和block是怎么映射的?

在这里插入图片描述

思考 1:
我们每次访问是都是拿着文件名,但是linux下文件名是不在inode中保存的。如何拿到inode的?

思考 2
目录文件是什么?

首先我们先来解决目录文件这个问题。

目录文件其实和普通文件是一样的,它的底层也是inode+datablock(属性+内容),在datablock中也是有相应的数据块的,这些数据块中,存放的就是文件名和文件与inode的映射关系。
在这里插入图片描述
根据上面就可以知道,我们可以拿着文件名,到相应的目录下,在目录文件中根据其内容,找到文件名和inode的映射关系,然后就可以得到我们想要的inode了。
在这里插入图片描述
根据上面所说的,我们认识到了找到文件名,首先要打开当前目录,但是当前目录也是文件,这些文件拼接起来就是一个路径,这就要引发一个问题

为什么,任何一个文件,都要有路径呢?

因为:文件有了路径,才可以根据路径逆向解析路径,最终依次得到每一个inode,

补充:这些路径都是进程给的
在这里插入图片描述

补充一个知识点:
当我们在同一目录下找不同文件,linux系统,会根据缓存的路径结构来查找(这个缓存的路径结构,是在上一次查找是就存在了的,它存在一个叫struct denty(内核数据结构,纯内存的)中的)

5 做个小实验

dd if=/dev/zero of=./disk.iso bs=1M count=5 //制作一个大的磁盘块,当做一个分区
在这里插入图片描述

mkfs.ext4 disk.iso //格式化写入文件系统
在这里插入图片描述

sudo mkdir /mnt/mydisk //建立空目录
在这里插入图片描述

df -h //查看可以使用的分区
在这里插入图片描述
在这里插入图片描述

sudo mount -t ext4 ./disk.iso /mnt/mydisk/ //将分区挂载到指定的
在这里插入图片描述

sudo umount /mnt/mydisk //卸载分区`
在这里插入图片描述

6 软硬链接

软链接本质上是一个独立文件

在这里插入图片描述

硬链接本质上是一组文件名和已经存在的文件的映射关系
在这里插入图片描述

6.1 理解软硬链接

  1. 软链接有独立的inode,软链接内容上,保存的是目标文件的路径,Windows

  2. 硬链接不是独立的文件,没有独立的inode,硬链接本质就是一组文件名和已经存在的文件的映射关系

6.2 为什么要有软硬链接

软链接:快捷方法

硬链接
在这里插入图片描述

Linux文件备份可以通过建立硬链接来实现
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

补充:Linux中不可以对目录进行硬链接

评论 46
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值