当前位置: 首页 > news >正文

磁盘的分区与文件系统的认识

磁盘的认识

了解磁盘的结构:

1、盘片
硬盘首先会有多个盘片构成,类似很多个独立的光盘合并在一起,每个盘片都有2个面,每个盘片都有一个对应的磁头,我们的磁头横移和盘面的旋转就可以读写到盘面的每一个位置,而我们的磁盘数据实际上就是在盘面上保存的。

2、扇区和磁道
每个盘片会分成若干个相同同心圆的磁道,磁道从外围开始编号,从0开始,每个磁道又会划分成若干个扇区,扇区是硬盘的最小存储单元,一般是存储512字节。

3、磁头和柱面

磁头用于读取盘面中磁道内的扇区中存储的数据。一个盘片有上下2个盘面对应2个磁头(盘面数 = 磁头数)。柱面是所有盘面中相同磁道的柱面,形成的是一个立体的柱体形状,磁盘的柱面数和磁道数是相等的。

 

 CHS定位法

早期可以通过柱面号(Cylinder)、磁头号(Head)和扇区号(Sector)来精确定位硬盘驱动器上的数据。柱面号用来指示在哪个柱面上进行读写操作,磁头号用来指示在哪个磁头对应的磁面上进行读写操作,而扇区号用来指示在某个磁头的某个磁道上的哪个扇区进行读写操作。

现代硬盘驱动器采用的是LBA(Logical Block Addressing,逻辑块寻址)定位方式,通过逻辑块号来寻址数据。

对磁盘结构的逻辑抽象

我们知道磁盘的盘面中存放数据的单元其实就是若干个扇区,而我们将这旋转着的一圈圈扇区都排成一排,此时的结构就像一个顺序表数组了:

以下是数据管理硬件的逻辑: 

如上所示,可以将每一个扇区就是最小单元,此时就可以对扇区进行软件层的数据结构处理,将每个扇区都编号,因此对每个扇区的访问就是对编号的访问。而一般磁盘有十面,而每个盘面的扇区一致,所以就可以将编号数除以每个盘面的扇区数得到的就是对应的盘面,而进而再将除下的数据再除以每个盘面的扇区数就是对应磁面的对应扇区。因此就是可以形成一一映射的关系,进而可以实现软硬件交互。

|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

我们操作系统下的文件系统其实并不是以扇区为单位进行编号的,因为我们知道一个扇区基本上就是512字节,其实并不大,如果这样访问(IO)起来的话就会比较频繁。实际上文件系统大多数是以8个扇区为一个单元,也就是512byte*8=4kb。因此就是对这4kb的内存块编号。

而这每一个内存块的地址就是LBA(逻辑块地址)

 

 磁盘的区域划分

我们磁盘一般都是以GB为单位,甚至大一点的都是TB为单位。所以说我们对磁盘的管理会采用分区的方式,毕竟将每一区域的空间管理好,然后其他的区域直接套用该种管理方法就行了。就拿我们大多数的电脑来说,其实像C盘D盘就是一块磁盘分成的两个区。

其实将磁盘分成一个个区以后还是不够的,空间还是非常大的,所以我们还将对应的区划分成一个个组,因此,我们对分区的管理就可以转换成分组的管理。

假设我们磁盘有500GB的大小,分成5个区,然后每个区分成50个组:

以上就是对磁盘空间的抽象划分。所以具体我们就是对组的管理,而对这分区的100GB稍微具体化就是如下:

 BootBlock:启动块,一般会在编号为0的磁头所对应的盘面,的第一块扇区。负责计算机的启动。 

而其他部分就是我们的块组,而块组对应着以上的五六个小部分,其实其中存的就是文件的数据(内容+属性)信息和文件管理的数据信息。而我们最开始的块组就是需要先将管理数据写入到块组当中,管理数据其实就是管理块组中的空间使用信息以及文件对应的块空间等等,而这一操作其实就是格式化

分组后的细分

首先我们要认识一下文件的inode编号。

我们使用 ll -i 指令得到的信息中,最前面的一段数字码(1580394和1580395)就是文件的inode信息:一般都是一个文件对应着一个inode编号,每个文件都有其对应的inode编号,在整个分区具有唯一性,Linux中识别一个文件与文件名没有关系,只和inode编号有关而且磁盘中保存文件的属性数据是通过inode来保存的1所以说inode就相当于是一个结构体一样:

struct inode//大小固定sizeof(inode)=128字节
{//拥有者、所属组、ACM时间、大小权限、inode编号...}

inodeTable

inode表,就相当于是一个存放上面struct inode结构体的数组,而该数组的下标对应的就是inode编号。

Data blocks

数据区,将该组的空间划分成一个个文件块单元(每个文件块4KB大小),存放的就是整个块组里所有文件的内容数据。简略的抽象图如下:

而我们想要将inode对应文件所存储的信心对应起来该怎么做呢???我们的struct inode中还会为我们维持一个数组就个inode所对应文件的内存块,4KB不够则采用一对多的形式映射。

struct inode//大小固定sizeof(inode)=128字节
{//拥有者、所属组、ACM时间、大小权限、inode编号...int blocks[n]//n一般是15}

1.我们的文件和数据块的映射也才15个,共15*4KB,那么如果文件不仅仅只有60KB呢???

其实我们的15个块并不是直接映射的,13号和14号下标会通过间接映射的方式,例如:13号块大小是4KB,会保存更多的块列表,也就是会指向其他的块儿编号,所以此时就会形成二次1映射,而14号块也同理,此时就会形成三级映射,此时的结构就有点像多叉树。 


2.如果该组的空间还不够,或者数据块已经用光了呢??? 

此时会进行跨组访问,将文件信息存到其他组的块儿中,此时只需要记录其他组的组好和对应的块号就可以。

inode Bitmap

我们知道bitmap就是表示位图,而位图最大的特点就是节省空间以及表示“是和否”的问题。

所以对于inode Bitmap标识的就是inode编号的使用情况,如果编号为n的比特位被使用了,那么就可以将编号为n对应的比特位设置为1,没使用的话就是原初始值0。

Block Bitmap

有inode bitmap表示这inode的使用情况,那么同理block bitmap标识的就是数据块Data blocks的使用情况。同样也是采用0和1来表示。


所以知道磁盘的空间的使用与否其实就是取决于数据块位图的标识符是为0还是为1,因此我们如果先要删除文件其实就是将位图为1改为0,此时并不需要将内存数据块的数据清空。如果需要使用该块,则会采用覆盖的形式进行。

Group Descriptor Table

简称GDT:块组描述符,描述块组属性信息。存放的一般是该块组的其实inode编号(inode编号在整个区是唯一的),组中inode总数,inode的使用数量,组中块组总数,块组使用数量……

Super Block

超级块(Super Block):存放文件系统本身的结构信息。Super Block并不是每个块组都存在,只在个别的块组中前面会存在Super Block(保存多份就是为了防止出错后整个分区故障,故障后可以借助其他的Super Block拷贝修复)。

记录的信息主要是整个分区的相关把信息:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载(确定分区根目录)的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个(分区)文件系统结构就被破坏了。

文件系统

我们的用户都是通过文件名进行访问的,而系统中只认识inode编号,所以说此时我们的文件名就会和inode编号构成映射关系。而我们的目录文件也不例外,也有自己的inode编号,但是目录的数据块内容并不是和普通文件一样存放的是一些代码或音频等信息,而目录文件中一般会创建有其他文件,所以目录文件的数据块中存放的是该目录下的文件与inode编号的映射关系。

我们的文件名一般相当于是键值对key-val中的key结构,所以说我们同一个目录下不能存放同名文件。而且我们Linux中文件名并不属于文件属性,文件名是用户创建的,而操作系统会为我们分配文件inode编号与文件名映射。

所以说对于文件的查找我们其实都是从根目录中开始查找的,然后通过inode编号与数据块映射,找到数据块信息,然后层层剥离,最终找到目标文件,就相当于是从多叉树的根节点开始找某个节点。

对于我们进程打开一个文件是通过该进程的CWD工作目录和打开的文件名来确定当前文件所在位置,而根据最起始的路径确定磁盘分区,然后通过文件inode确定具体的分组以及对应的数据块,然后将数据块的内容刷新出来就行。

软硬链接

软链接和硬链接是像unix操作系统中用于创建文件链接的两种方式。

软链接

软链接也被称为符号链接或者软连接。它是一个特殊类型的文件,其中包含了指向另一个文件或目录的路径。软链接类似于Windows中的快捷方式。它可以跨越文件系统边界和目录边界,指向其他文件或目录。软链接的删除不会影响原始文件,但是如果原始文件被删除,软链接就会失效

就像我们电脑上下载好的软件其实就是以一个文件夹的形式下载好,其中会有配置文件、日志文件、可执行文件……而我们的可执行程序(也就是双击进入的软件)就是在可执行文件中,此时需要进入可执行文件再双击可执行程序才可以运行该进程。所以我们就会在外层桌面文件中建立软链接的形式直接创建快捷方式。

软链接的创建使用ln -s命令:

ln -s <原始文件路径> <链接文件名>

    

 创建好的软链接与原来的文件inode是不一样的,因此软链接是独立的文件。但是当我们向test文件还是test.soft.link链接文件的其中一方写入数据的话,最终在另一方中也是会被写入(硬链接也一样):

硬链接

硬链接是指两个或多个文件共享相同的iNode,它们指向同一份数据块。它是文件系统内部的文件系统链接,没有独立的文件实体。硬链接只能在同一个文件系统中创建,不能跨越文件系统边界。当原始文件被删除时,硬链接仍然可以继续访问原始文件的内容。因为硬链接中会指向同一个inode而此时会通过引用计数的方式来将inode和文件名构成一对多的映射关系

硬链接的创建使用ln命令:

ln <原始文件路径> <链接文件名>

 我们知道文件inode和文件名是会构成一对多的映射关系的,采用引用计数的方式,而且对于一个inode有没有与文件名映射,以及映射数目也会存在struct inode的结构体当中:

struct inode//大小固定sizeof(inode)=128字节
{//拥有者、所属组、ACM时间、大小权限、inode编号...int blocks[n]//n一般是15int ref_count;//引用计数
}

而且我们ll指令显示出的文件属性也是会将映射的数目情况展示出来:

删除文件应用计数--;创建硬链接,引用计数++; 而且对于目录文件都会有两个默认文件...

所以在创建目录文件时一般引用计数就为2:


软链接和硬链接的使用目的和特性不同。软链接通常用于创建快捷方式或跨越目录的链接,而硬链接则通常用于创建多个文件名指向同一个文件的链接。另外,软链接可以指向目录,而硬链接只能指向文件。 其实硬链接不能指向目录的原因就是因为如果指向某个目录的话,那么在查找文件时就会造成死循环(因为此时目录文件inode相同)但是也有例外,ll -a 目录文件时就会有...文件,也是硬链接的。 

相关文章:

磁盘的分区与文件系统的认识

磁盘的认识 了解磁盘的结构&#xff1a; 1、盘片 硬盘首先会有多个盘片构成&#xff0c;类似很多个独立的光盘合并在一起&#xff0c;每个盘片都有2个面&#xff0c;每个盘片都有一个对应的磁头&#xff0c;我们的磁头横移和盘面的旋转就可以读写到盘面的每一个位置&#xff0c…...

韩国访问学者如何申请?

作为访问学者&#xff0c;前往韩国学术机构进行研究是一项令人期待的经历。首先&#xff0c;申请者需要查找目标学术机构的官方网站&#xff0c;下面知识人网小编带大家了解其访问学者计划的具体要求和申请流程。 通常&#xff0c;申请程序包括填写在线申请表格&#xff0c;提交…...

MybatisPlus框架入门级理解

MybatisPlus 快速入门入门案例常见注解常用配置 核心功能条件构造器自定义SQLService接口 快速入门 入门案例 使用MybatisPlus的基本步骤&#xff1a; 1.引入MybatisPlus的起步依赖 MybatisPlus官方提供了starter&#xff0c;其中集成了Mybatis和MybatisPlus的所有功能&#…...

ELK 分离式日志(1)

目录 一.ELK组件 ElasticSearch&#xff1a; Kiabana&#xff1a; Logstash&#xff1a; 可以添加的其它组件&#xff1a; ELK 的工作原理&#xff1a; 二.部署ELK 节点都设置Java环境: 每台都可以部署 Elasticsearch 软件&#xff1a; 修改elasticsearch主配置文件&…...

<蓝桥杯软件赛>零基础备赛20周--第15周--快速幂+素数

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周。 在QQ群上交流答疑&am…...

Opencv小项目——手势数字刷TIKTOK

​ 写在前面&#xff1a; 很久没更新了&#xff0c;之前的实习的记录也算是烂尾了&#xff0c;但是好在自己的实习记录还是有的&#xff0c;最近也忙碌了很多&#xff0c;终于放假了&#xff0c;今天下午正好没事&#xff0c;闲来无事就随便做个小玩意吧。 思来想去&#xff…...

【优化技术专题】「性能优化系列」针对Java对象压缩及序列化技术的探索之路

针对Java对象压缩及序列化技术的探索之路 序列化和反序列化为何需要有序列化呢&#xff1f;Java实现序列化的方式二进制格式 指定语言层级二进制格式 跨语言层级JSON 格式化类JSON格式化&#xff1a;XML文件格式化 序列化的分类在速度的对比上一般有如下规律&#xff1a;Java…...

Spring+SprinMVC+MyBatis配置方式简易模板

SpringSprinMVCMyBatis配置方式简易模板代码Demo GitHub访问 ssm-tpl-cfg 一、SQL数据准备 创建数据库test&#xff0c;执行下方SQL创建表ssm-tpl-cfg /*Navicat Premium Data TransferSource Server : 127.0.0.1Source Server Type : MySQLSource Server Versio…...

Windows ssh登录eNSP交换机

目录 1. Cloud IO配置1.1 创建UDP端口1.2 创建本地连接1.3 端口映射设置 2. 交换机配置2.1 配置vlanif2.2 配置vty2.3 配置ssh用户2.4 配置aaa2.5 使用Xshell工具登录2.6 用户和密码2.7 登录成功 3. 使用cmd 登录报错提示3.1 手动指定加密算法&#xff0c;提示密码长度无效3.2 …...

SwiftUI 纯手工打造 100% 可定制的导航栏

功能需求 何曾几时,我们是否也厌倦了 SwiftUI 界面中刻板守旧的导航栏外观,而想要自己动手充分展示灵动炸裂的创造力呢? 如上图所示:我们在 SwiftUI 中通过纯手工打造了一款 100 在本篇博文中,您将学到以下内容 功能需求1. 导航栏基本结构2. 如何感知当前发生用户拖拽行为…...

npm install 太慢?解决方法

在使用npm进行包管理时&#xff0c;有时会遇到安装速度缓慢的问题。这可能是由于网络原因或npm官方镜像服务器的繁忙导致的。下面介绍几种常见的解决方法&#xff1a; 使用淘宝镜像 淘宝镜像是一个提供npm包镜像的国内源&#xff0c;其速度较快且稳定。您可以通过以下命令将npm…...

DevOps系列文章之 GitLab CI/CD

CICD是什么? 由于目前公司使用的gitlab&#xff0c;大部分项目使用的CICD是gitlab的CICD&#xff0c;少部分用的是jenkins&#xff0c;使用了gitlab-ci一段时间后感觉还不错&#xff0c;因此总结一下 介绍gitlab的CICD之前&#xff0c;可以先了解CICD是什么 我们的开发模式…...

【CompletableFuture任务编排】游戏服务器线程模型及其线程之间的交互(以排行榜线程和玩家线程的交互为例子)

需求&#xff1a; 1.我们希望玩家的业务在玩家线程执行&#xff0c;无需回调&#xff0c;因此是多线程处理。 2.匹配线程负责匹配逻辑&#xff0c;是单独一个线程。 3.排行榜线程负责玩家的上榜等。 4.从排行榜线程获取到排行榜列表后&#xff0c;需要给玩家发奖修改玩家数…...

什么是浏览器指纹?详解浏览器指纹识别技术,教你防止浏览器指纹识别

在数字时代&#xff0c;我们的在线活动几乎总是留下痕迹。其中&#xff0c;浏览器指纹就像我们的数字身份证&#xff0c;让网站能够识别和追踪用户。对于跨境电商行业来说&#xff0c;了解这种追踪技术尤其重要&#xff0c;因为它可能影响账号的管理和安全。本文将详细介绍浏览…...

canvas绘制六芒星

查看专栏目录 canvas实例应用100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…...

全网最详细!!Python 爬虫快速入门

1. 背景 最近在工作中有需要使用到爬虫的地方&#xff0c;需要根据 Gitlab Python 实现一套定时爬取数据的工具&#xff0c;所以借此机会&#xff0c;针对 Python 爬虫方面的知识进行了学习&#xff0c;也算 Python 爬虫入门了。 需要了解的知识点&#xff1a; Python 基础语…...

gitgud.io+Sapphire注册账号教程

gitgud.io是一个仓库&#xff0c;地址 https://gitgud.io/&#xff0c;点进去之后会看到注册页面。 意思是需要通过注册这个Sapphire账户来登录。点击右边的Sapphire&#xff0c;就跳转到Sapphire的登陆页面&#xff0c;点击创建新账号&#xff0c;就进入注册页面。&#xff0…...

【动态规划】【广度优先搜索】【状态压缩】847 访问所有节点的最短路径

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 广度优先搜索 状态压缩 LeetCode847 访问所有节点的最短路径 存在一个由 n 个节点组成的无向连通图&#xff0c;图中的节点按从 0 到 n - 1 编号。 给你一个数组 graph 表示这个图。其中&#xff0c;graph[i] 是一个列…...

python基础小知识:引用和赋值的区别

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 1.引用 python中&#xff0c;赋值操作会产生相同对象的多个引用&#xff0c; 如果在原位置修改这个可变对象时&#xff0c;可能会影响程序其他位置对这个对象的…...

欧科云链与《警察技术》联合发布技术专题.pdf

欧科云链受《警察技术》邀请&#xff0c;于第201期期刊正式刊登“区块链生态安全与虚拟货币犯罪治理”技术专题。欧科云链作为该技术专题主要作者&#xff0c;直接参与本次期刊2篇文章撰写&#xff0c;同时为多篇文章提供欧科云链的最新数据和研究成果。 《警察技术》期刊创办于…...

【QT+QGIS跨平台编译】之一:【sqlite+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、sqlite3介绍二、文件下载三、文件分析四、pro文件五、编译实践 一、sqlite3介绍 SQLite是一款轻型的数据库&#xff0c;是遵守ACID的关系型数据库管理系统&#xff0c;它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的&…...

websocket实现聊天室(vue2 + node)

通过websocket实现简单的聊天室功能 需求分析如图&#xff1a; 搭建的项目结构如图&#xff1a; 前端步骤&#xff1a; vue create socket_demo (创建项目)views下面建立Home , Login组件路由里面配置路径Home组件内部开启websocket连接 前端相关组件代码&#xff1a; Login…...

RabbitMQ-消息延迟

一、死信交换机 1、描述 一个队列接收到的消息有过期时间&#xff0c;消息过期之后&#xff0c;如果配置有死信队列&#xff0c;消息就会进去死信队列。 2、图解 3、过程 当生产者将消息发送到exchange1&#xff0c;然后交换机将消息路由到队列queue1&#xff0c;但是队列que…...

【Oracle】如何给物化视图分区

文章目录 【Oracle】如何给物化视图分区给物化视图进行分区的例 【声明】文章仅供学习交流&#xff0c;观点代表个人&#xff0c;与任何公司无关。 编辑|SQL和数据库技术(ID:SQLplusDB) 收集Oracle数据库内存相关的信息 【Oracle】ORA-32017和ORA-00384错误处理 【Oracle】设置…...

10个常考的前端手写题,你全都会吗?

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 今天来分享一下10个常见的JavaScript手写功能。 目录 1.实现new 2.call、apply、…...

vue组件间通信

Vue组件之间通信方式有哪些 一、父子组件通讯 1、props&#xff0c;emit 父组件可以通过props给子组件传递变量。子组件可以通过emit派发自定义事件&#xff0c;使父组件可以获得事件函数传递过来的形参。 2、$parent、$children、ref 父组件可以通过 c h i l d r e n 获取…...

编程框架概述:MVC, MVP, MVVM, Flux/Redux, 和 Clean Architecture

前言 在软件开发中&#xff0c;选择合适的编程框架和架构模式对于构建可维护和可扩展的应用程序至关重要。初学者在面对多种架构选项时可能会感到困惑。本文将详细介绍五种流行的编程框架&#xff1a;MVC、MVP、MVVM、Flux/Redux和Clean Architecture。 MVC&#xff08;Model-V…...

多维时序 | Matlab实现CNN-BiLSTM-Mutilhead-Attention卷积双向长短期记忆神经网络融合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现CNN-BiLSTM-Mutilhead-Attention卷积双向长短期记忆神经网络融合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现CNN-BiLSTM-Mutilhead-Attention卷积双向长短期记忆神经网络融合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计…...

np.argsort排序问题(关于位次)-含GitHub上在numpy项目下提问的回复-总结可行方案

np.argsort 与获取位相关问题 位次: 数组中的数据在其排序之后的另一个数组中的位置 [1,0,2,3] 中 0的位次是1 1的位次是2 2的位次是3 3的位次是4 这里先直接给出结论&#xff0c;np.argsort()返回的索引排序与实际位次在确实在某些情况下会出现一致&#xff0c;但后来numpy的开…...

Element中的el-input-number+SpringBoot+mysql

1、编写模板 <el-form ref"form" label-width"100px"><el-form-item label"商品id&#xff1a;"><el-input v-model"id" disabled></el-input></el-form-item><el-form-item label"商品名称&a…...