【Linux】在磁盘中如何找到文件 -- 磁盘的物理结构与逻辑结构

img

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法…感兴趣就关注我吧!你定不会失望。


在这里插入图片描述

0. 磁盘物理结构介绍

在老式的电脑中,或服务器后台上使用的并不是如今的高速磁盘SSD,而是机械硬盘.

image-20231129224123667

他有磁头,盘片,磁头臂等机械结构组成… 其中每一个盘面上都有一个磁头,磁头和盘面上有很小的间隙,方便高速读取.所以磁盘封装的时候需要进行无尘处理,一旦落入灰尘就会火花带闪电…

磁盘是一个永久性存储截至.其存储原理为,磁头是带电的,磁盘上有无数个磁点,一个点的正负性可以代表一个0或者1,磁头通过充放电,就可对磁盘写入01,进而将数据存储.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

磁盘进行读取的时候,是通过访问扇区.确定一个扇区需要经历以下二个步骤:

  • 确定是哪一个盘面(确定使用哪一个磁头)
  • 确定是哪一个柱面(磁道)

也就是 Cylinder Header Sector CHS寻址法.

那么CPU是如何与磁盘进行连接读取数据的呢?

扫描二维码关注公众号,回复: 17279103 查看本文章

d33b4587dcc6de08b7c6640224315e3

CPU通过读取这几个寄存器的信息.

  • 控制寄存器:控制IO方向
  • 数据寄存器:将什么数据 写入/读取 磁盘
  • 地址寄存器:从什么地址写入/读取
  • 状态寄存器:是否完成了该任务

1. 磁盘逻辑结构

image-20231130082123222

这一条磁带实际上可以看成一个下标从0开始的数组.其为一个线性的结构.而磁盘每一个盘面可以看成若干个磁带拼接在一起.

其为一个基于扇区的数组.也就是我们可以通过给定一个数组编号,来确定是哪一个扇区.通过扇区确定在哪一个盘面.在哪一个磁道,进而确定在该磁道上的第几个扇区.这是 LBA逻辑地址HCS地址可以进行互相转换.

2. 文件系统划分

那么操作系统是如何去管理这个文件的呢?

我们通常会将我们的磁盘进行分区.例如将一个800GB的磁盘分为,200GB,300GB,100GB,200GB大小的分区.

WINDOWS下我们是这样分区的,分为磁盘C D E F…

image-20231130083734785

其本质还是一块物理磁盘,仅仅是加了一段描述符规定从哪到哪是属于哪个逻辑磁盘

struct partion{
    
    
  int start;
  int end;
};
partion num[4];

以下我们以200GB为例子,这200GB会被系统分为 若干个BLOCK+一个BOOT BLOCK

而一个BLOCK又被划分为了 SUPER BLOCK,GROUP DESCRIPTOR TABLE,BLOCK BITMAP,INODE BITMAP,INODE TABLE,DATA BLOCKS.

c76e7d76b82da85ef9139d43f0344f5

我们利用分治的思想,就将管理一个大磁盘,划分为了如何管理一个小块。

那么每一个区块是什么意思呢?

Inode Table:存储了一个文件的所有属性包括在磁盘的物理地址

此为一个Inode的信息,而InodeTable存储了若干个Inode 注意这里不存储文件名!!

struct Inode{
    
    
  	  所有者
      所属组
      权限
      大小
      ACM修改之间
      在磁盘上的物理地址[15]
};

Inode BitMap:通过Bit位的方法,存储了InodeTable中哪一个位置的Inode没有被使用

Data Blocks:存储了文件内容,在磁盘中存储的最小单位为一个块,一个块的大小通常为4KB,而DataBlocks存储了若干个这样的块

文件是被存储在扇区上,一个扇区可以划分为很多很多个块.所以一个文件可能由多个块来存储.即使一个文件的大小为1KB,为了方便管理,也会分配一个块来存储.

而Inode中存储的磁盘物理地址数组大小通常为15,并不代表一个文件仅能占15个块,当文件刚好占15个块及以下时,这些块的地址会被直接填入该数组当中.当超过时,就会采用两级索引,三级索引的方法.

例如在第13个块当中存储一个不存储数据的块地址,由该块再次进行,映射到真实的物理地址,这是二级索引,

例如在第14个块当中存储一个不存储数据的块地址,由该块再次存储二级索引,再映射到真实物理地址,这是三级索引

Block BitMAP:通过Bit位的方法,存储了Data Blocks中哪一个位置的没有被使用

Group Descriptor Table:记录了整个块中资源数量(总共inode blocks的数量 已使用的inode,blocks数量)

SuperBlocks:记录了整个分区存储的存储规则(有多少个Block group,具体的BlockGroup结构是怎么样的)也存储了整个块中的资源数量,该块不会在每一个Block group中存在,会随机在几个Block Group中存在,防止意外损坏.

所以,我们在使用磁盘之前,一定需要对其进行格式化,选择不同的文件系统,进行预先载入信息.

3. 如何理解文件目录

​ 在Linux下,我们可以通过 ls -i 来查看文件所属的inode.

image-20231130094128462

可以看到,文件目录也有自己的Inode.所以 文件目录也是一个文件!

其内容为该目录下的文件名与Inode的kv结构,所以我们平常使用的是文件名,系统可以为我们找到其对应的Inode,并进行进一步操作.

所以我们就可以理解了:

  • 为什么我们没有R权限无法获取当前目录下的文件内容 其本质为无法对data blocks进行读取

  • 为什么我们没有w权限无法在当前目录下创建文件 其本质为无法对data blocks进行写入 创建KV结构

  • 为什么我们没有x权限无法进入当前目录 其本质为无法执行进入当前目录这一操作

4. 对文件的增删查改

  • 新建一个文件时,系统要做什么?

    首先在当前目录下创建对应的KV结构,为其文件名分配对应的Inode.

    根据Inode来确定存储在哪一个分区,将对应的Inode BitMap置为1,表示该Inode已经被使用

    进入InodeTable修改其权限信息,为其分配磁盘块.

    进入Block BitMap修改使用情况

    进入DataBlock里修改文件内容

  • 删除一个文件时,系统要做什么?

    存储当前路径,然后从当前目录往根目录进行遍历,然后存储的路径往回遍历,即可拿到该文件的Inode.

    根据Inode来确定存储在哪一个分区.

    将对应的BitMap置为空即可,不需要手动删除DataBlock里的内容

  • 查找一个文件时,系统要做什么?

    存储当前路径,然后从当前目录往根目录进行遍历,然后存储的路径往回遍历,即可拿到该文件的Inode.

    根据Inode来确定存储在哪一个分区.

  • 修改一个文件时,系统要做什么

    存储当前路径,然后从当前目录往根目录进行遍历,然后存储的路径往回遍历,即可拿到该文件的Inode.

    根据Inode来确定存储在哪一个分区.

    依次查找InodeBitMap(确定文件是否存在),InodeTable(访问文件信息),BlocksBitMap(判断文件内容是否存在),DataBlocks(访问文件内容)

5. 软链接与硬链接

5.1 软链接

我们可以使用以下命令来创建软链接

ln -s src target

会创建一个target指向src的软链接.

例如:

我们在当前目录下创建了一个名为hello.txt的文件,其内容为hello.

在创建软连接时,src文件需要带上绝对路径,否则会出现无法访问的错误

执行

ln -s $PWD/hello.txt soft-hello

image-20231130100804302

我们查看一下其inode属性,其inode不同,则为不同的文件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那么我们访问一下这个软连接的内容

image-20231130101512355

其内容一致.那么这是一个对src文件的一个复制嘛?

我们执行一个循环脚本,一直往src也就是hello.txt文件里输入"hello"

while :; do echo "hello" >> hello.txt ; done	

等待若干秒后,hello.txt文件里已经有很多字符串,我们来查看下每个文件的大小

image-20231130103148601

这不是拷贝.可以理解为是一个"快捷方式",其文件内容为对应链接文件的路径.每次访问该文件时,实际在通过该文件内容中的路径访问src文件.

5.2.1 软链接应用场景

其应用场景和windows下的快捷方式差不多.

当我们把一个文件的可执行文件藏在很深的路径下时,我们可以在一个方便的地方常见指向这个文件的软链接,让其能够快捷的访问.

例如:

image-20231130104446745

在该路径下有一个myls的可执行程序 我想要在home中可以直接执行.

那么

ln -s $PWD/myls ~/mylsq

image-20231130105512383

此时不需要带上绝对路径即可执行.

5.2 硬链接

我们可以使用以下命令来创建硬链接

ln src target		

同样,我们创建一个hello.txt,当中有一段hello

ln hello.txt hard-link

image-20231130143806897

分别打印这两段内容,会发现两段中的内容是一样的.

image-20231130143900504

同样,我们再次执行上面的循环脚本看看会发生什么

image-20231130144031755

两个文件的内容都增加了.

所以,硬链接是对原文件的引用,类似于C++中的&.修改硬链接文件,会导致原文件被修改

权限后面的数字表示当前文件的硬链接数,类似于引用计数.

一个文件夹中的内容为文件名与inode的KV结构.硬链接的本质是多个文件名指向相同的inode

5.2.1 硬连接的应用场景

硬链接的应用场景较为少.

但其可以节省空间,因为其不占用额外的数据块,可以保护特定的数据,仅当该文件inode指向的所有文件被删除了,这个inode才会被删除.

在文件夹中的…与.分别代表的是上级目录,与当前目录.他们都是对目标文件夹创建的硬链接.所以我们可以自由的采用相对路径来访问文件.

image-20231130145233608

当前文件夹下的每个子文件夹都会对其硬链接.
结构.硬链接的本质是多个文件名指向相同的inode

5.2.1 硬连接的应用场景

硬链接的应用场景较为少.

但其可以节省空间,因为其不占用额外的数据块,可以保护特定的数据,仅当该文件inode指向的所有文件被删除了,这个inode才会被删除.

在文件夹中的…与.分别代表的是上级目录,与当前目录.他们都是对目标文件夹创建的硬链接.所以我们可以自由的采用相对路径来访问文件.

[外链图片转存中…(img-anLwkhlV-1701877678457)]

当前文件夹下的每个子文件夹都会对其硬链接.
image-20230905164632777

猜你喜欢

转载自blog.csdn.net/qq_62839589/article/details/134843933