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

news/2024/11/20 6:19:25/

img

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

本篇导航

  • 0. 磁盘物理结构介绍
  • 1. 磁盘逻辑结构
  • 2. 文件系统划分
  • 3. 如何理解文件目录
  • 4. 对文件的增删查改
  • 5. 软链接与硬链接
    • 5.1 软链接
      • 5.2.1 软链接应用场景
    • 5.2 硬链接
      • 5.2.1 硬连接的应用场景
      • 5.2.1 硬连接的应用场景

在这里插入图片描述

0. 磁盘物理结构介绍

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

image-20231129224123667

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

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

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

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

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

也就是 Cylinder Header Sector CHS寻址法.

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

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


http://www.ppmy.cn/news/1260358.html

相关文章

【android开发-18】android中运行时申请权限详解

1,android权限机制 在Android中,权限机制是一种保护用户隐私和数据安全的重要机制。它允许应用程序在访问敏感或危险的数据或资源时获取特定的权限。以下是Android中权限机制的详细解释: 1,权限类别:Android将权限分…

【Java面试——JVM和调优】

JVM虚拟机和调优相关。 5.1 类加载机制 类加载的生命周期? 其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些…

【滤波第三期】卡尔曼滤波的原理和C代码

卡尔曼滤波(Kalman Filter)是一种递归的、自适应的滤波算法,广泛应用于估计系统状态和观测过程中的噪声。它最初在1960年被提出,被认为是控制理论和信号处理领域中最重要的发展之一。卡尔曼滤波器在许多领域,包括导航、…

【数据结构】——二叉树简答题模板

目录 一、树和二叉树的概念(一)二叉树的定义和性质(二)树和二叉树的区别 二、完全二叉树和满二叉树三、二叉树的遍历(一)由序列确定二叉树(二)不同遍历序列的关系 四、二叉树的性质&…

html css样式选择器介绍

目录 一、单标签选择器二、多标签选择器三、类选择器四、标签结合类选择器五、多个标签结合类选择器六、子标签选择器七、所有子标签选择器八、相邻选择器九、多种选择器混合使用十、超链接样式选择器 一、单标签选择器 下面的 css 会将所有 h1 标签里的文字设置为红色 <!…

天池SQL训练营(三)-复杂查询方法-视图、子查询、函数等

-天池龙珠计划SQL训练营 SQL训练营页面地址&#xff1a;https://tianchi.aliyun.com/specials/promotion/aicampsql 3.1 视图 我们先来看一个查询语句&#xff08;仅做示例&#xff0c;未提供相关数据&#xff09; SELECT stu_name FROM view_students_info;单从表面上看起来…

Xilinx FPGA平台DDR3设计详解(三):DDR3 介绍

本文介绍一下常用的存储芯片DDR3&#xff0c;包括DDR3的芯片型号识别、DDR3芯片命名、DDR3的基本结构等知识&#xff0c;为后续掌握FPGA DDR3的读写控制打下坚实基础。 一、DDR3芯片型​号 电路板上的镁光DDR3芯片上没有具体的型号名。 ​如果想知道具体的DDR3芯片型号&#…

从零构建属于自己的GPT系列3:模型训练2(训练函数解读、模型训练函数解读、代码逐行解读)

&#x1f6a9;&#x1f6a9;&#x1f6a9;Hugging Face 实战系列 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在PyCharm中进行 本篇文章配套的代码资源已经上传 从零构建属于自己的GPT系列1&#xff1a;数据预处理 从零构建属于自己的GPT系列2&#xff1a;模型训…