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

news2024/11/27 20:56:35

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.coloradmin.cn/o/1291378.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++11(二)】lambda表达式以及function包装器

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C   🔝🔝 C11 1. 前言2. lambda表达式的提出3. lambda表达…

mixamo根动画导入UE5问题:滑铲

最近想做一个跑酷游戏,从mixamo下载滑铲动作后,出了很多动画的问题。花了两周时间,终于是把所有的问题基本上都解决了。 常见问题: 1.【动画序列】人物不移动。 2.【动画序列】人物移动朝向错误。 3.【蒙太奇】人物移动后会被拉回…

c语言五子棋

下面是一个简单的C语言五子棋实现示例&#xff1a; #include <stdio.h>#include <stdlib.h>#define BOARD_SIZE 15char board[BOARD_SIZE][BOARD_SIZE];void init_board() { int i, j; for (i 0; i < BOARD_SIZE; i) { for (j 0; j < BOARD_…

AIGC:使用变分自编码器VAE实现MINIST手写数字生成

1 变分自编码器介绍 变分自编码器&#xff08;Variational Autoencoders&#xff0c;VAE&#xff09;是一种生成模型&#xff0c;用于学习数据的分布并生成与输入数据相似的新样本。它是一种自编码器&#xff08;Autoencoder&#xff09;的扩展&#xff0c;自编码器是一种用于…

vue中shift+alt+f格式化防止格式掉其它内容

好处就是使得提交记录干净&#xff0c;否则修改一两行代码&#xff0c;习惯性按了一下格式化快捷键&#xff0c;遍地飘红&#xff0c;下次找修改就费时间 1.点击设置图标-设置 2.点击这个转成配置文件 {"extensions.ignoreRecommendations": true,"[vue]":…

C# WPF上位机开发(会员管理软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 好多同学都认为上位机只是纯软件开发&#xff0c;不涉及到硬件设备&#xff0c;比如听听音乐、看看电影、写写小的应用等等。如果是消费电子&#…

DAPP开发【06】nodejs安装与npm路径更换

windows系统在执行用户命令时顺序 windows系统在执行用户命令时&#xff0c;若用户未给出文件的绝对路径&#xff0c; 则 &#xff08;1&#xff09;首先在当前目录下寻找相应的可执行文件、批处理文件等&#xff1b; &#xff08;2&#xff09;若找不到&#xff0c;再依次在系…

深入理解 new 操作符:创建对象的秘密武器(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

【开源】基于Vue.js的就医保险管理系统

文末获取源码&#xff0c;项目编号&#xff1a; S 085 。 \color{red}{文末获取源码&#xff0c;项目编号&#xff1a;S085。} 文末获取源码&#xff0c;项目编号&#xff1a;S085。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 科室档案模块2.2 医生档案模块2.3 预…

pycharm中debug,py文件

1、先把需要的实参传入 2、在合适位置打上断点 3、在小三角旁边右键调用调试 4.步进/步出查看 5.选择单步执行&#xff0c;走的更慢

使用函数计算,数禾如何实现高效的数据处理?

作者&#xff5c;邱鑫鑫&#xff0c;王彬&#xff0c;牟柏旭 公司背景和业务 数禾科技以大数据和技术为驱动&#xff0c;为金融机构提供高效的智能零售金融解决方案&#xff0c;服务银行、信托、消费金融公司、保险、小贷公司等持牌金融机构&#xff0c;业务涵盖消费信贷、小…

用窗函数法设计fir

FIR滤波器的设计可以通过窗函数法进行。窗函数法是一种通过在一定长度的数据窗口内&#xff0c;对数据进行加窗处理&#xff0c;然后再根据窗内数据的特征进行滤波器设计的方法。 以下是一个基本的步骤&#xff1a; 确定所需的滤波器参数&#xff0c;例如滤波器的阶数、过渡带…

[足式机器人]Part2 Dr. CAN学习笔记-数学基础Ch0-4线性时不变系统中的冲激响应与卷积

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-数学基础Ch0-4线性时不变系统中的冲激响应与卷积 1. LIT System&#xff1a;Linear Time Invariant2. 卷积 Convolution3. 单位冲激 Unit Impulse——Dirac Delta 线性时不变系统 &#xff1a; L…

封装校验规则(以及复选框和整体校验)-----Vue3+ts项目

登录校验页面 <script setup lang"ts"> import { ref } from vue import { mobileRules, passwordRules } from /utils/rules const mobile ref() const password ref() </script><!-- 表单 --><van-form autocomplete"off">&l…

Day52力扣打卡

打卡记录 Collapsing Strings&#xff08;Trie树&#xff09; 链接 #include <iostream> #include <algorithm> using namespace std; const int N 2e6 10; int son[N][26], idx, cnt1[N], cnt2[N]; int main() {auto insert [&](string& str, int* c…

换种方式开发软件

前 言 作为程序员&#xff0c;经常苦于项目交付&#xff0c;疲于应对各种需求&#xff0c;一路狂奔&#xff0c;很难有时间停下来思考与抽象&#xff0c;聊起来都是“累”&#xff1b;作为产品经理&#xff0c;最痛苦的莫过于梦醒之后无路可走&#xff0c;心里的苦只有自己知道…

如何统计12.5米高程覆盖率?

无论是卫星影像还是高程DEM数据&#xff0c;覆盖率都是大家非常关心的一个重要参数。 我们曾基于WGS84坐标进行过简单的覆盖率计算&#xff0c;而且面积还包括了海洋区域。 因此&#xff0c;最后得出了一个非常不靠谱&#xff0c;看起来也很不漂亮的数据&#xff1a;12%。 为…

python3安装lifelines

目录 一、环境 二、安装lifelines 出现问题 三、测试导入 一、环境&#xff1a; jupyter notebook中新建ipynb文件 二、安装lifelines pip install --upgrade --no-deps githttps://github.com/CamDavidsonPilon/lifelines.git出现问题&#xff1a; 缺少模块autograd、f…

视频相似度对比 python opencv sift flann

提取SIFT特征的代码&#xff0c;返回关键点kp及特征描述符des def SIFT(frame):# 创建SIFT特征提取器sift cv2.xfeatures2d.SIFT_create()# 提取SIFT特征kp, des sift.detectAndCompute(frame, None)return kp, des 这行代码是使用SIFT&#xff08;Scale-Invariant Feature…

【LeetCode:1466. 重新规划路线 | DFS + 图 + 树】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…