Linux -- 文件系统(文件在磁盘中的存储)

news2024/11/25 20:29:11

目录

前言:

了解机械磁盘

初始盘片与磁头

盘片是怎么存数据的呢?

详解盘片

如何访问磁盘中的一个扇区呢? -- CHS 定位法

磁盘的逻辑存储

LBA(Logical Block Addressing --- 逻辑块寻址)

如何将 LBA 地址转换为 CHS 地址?

如何管理扇区?

什么是 inode ?

inode 怎么管理文件内容?

什么是数据块?

位图

理解新建/删除文件 

理解文件名 


前言:

进程运行时会把需要用到的文件从磁盘加载到内存中,那么系统是如何在磁盘中快速找到进程想要的文件的呢?

了解机械磁盘

初始盘片与磁头

从下图中我们可以简单地了解一下机械磁盘:

盘片文件的数据都存储在盘片中,一个磁盘中不止一块盘片,多个盘片是摞在一起的。当磁盘开始运作时,盘片中间的马达会带动盘片旋转。

磁头磁头用于读取盘片中的内容。当磁盘运行时,磁头会旋转到盘片的上方读取盘片的数据。一个盘片有上下两面,两面各有磁头。

当磁盘开始运作时,盘片顺时针(或者逆时针)旋转,磁头绕着轴左右摆动,在盘片中进行寻址,找到想要的位置进行读写。

因为磁头和盘片都是金属做的,两个金属相互摩擦,会把盘片刮花,那么盘片的数据都被刮没了,所以磁头不是紧紧挨着盘片的,而是有一定的距离。除此之外,磁盘内部是无尘的,也是为了防止把盘片刮花!

盘片是怎么存数据的呢?

首先需要明确:计算机在底层硬件层面主要使用二进制数系统进行数据处理和运算,这是因为二进制系统非常适合电子电路的工作方式。二进制只有两个数字:0 和 1,这可以很容易地通过电子信号的两种状态来表示,例如电压的高低、电流的通断等。 

但是 0 和 1 只是一种二元状态,盘片中并不是真实地存储着 0 和 1 这两个数字

盘片可以想象成由无数个磁铁构成,磁铁具有南北极,南北极也是一种二元状态,在盘片上修改数据,实际上也是在修改盘片上磁铁南北极的朝向

由于磁铁的磁性保持的时间长,所以磁盘可以长时间保存数据,即使断电了数据也不会丢失,因为它们采用的是磁性、电荷捕获或其他物理性质来持久化地存储信息;而内存无论是DRAM还是SRAM,它们都是易失性存储器,它们都需要电力来维持内部电子元件的状态,意味着在断电情况下不能保留信息。所以说磁盘是永久存储介质!

详解盘片

磁道是指磁盘表面用来存储数据的一系列同心圆每个磁道是磁盘上可以读取或写入数据的一个环形区域。磁盘的每一个面都被划分成许多这样的磁道。

  • 柱面是由所有盘片上的同一半径位置组成的虚拟圆柱体,指在硬盘上多个盘片相同位置的一组同心圆磁道。想象一下,如果你将硬盘垂直切割,并且沿着这个切割面看去,你会看到一组圆形的磁道,这些磁道位于不同盘片的相同径向距离处,这一组磁道就构成了一个柱面。

  • 当提到一个柱面时,实际上指的是该柱面上所有磁头所覆盖的所有磁道

磁道由多个扇区组成(磁道被划分成多个扇区),每个扇区通常是固定大小的数据块常见的大小为512字节或4096字节(随着技术的发展,更大容量的硬盘可能会采用更大的扇区)。当硬盘读写头移动到特定磁道上方时,它可以访问该磁道上的所有扇区。 

磁道被划分成扇区后,扇区的面积大小可能不一样,但是扇区的内存大小都是一样的!

如何访问磁盘中的一个扇区呢? -- CHS 定位法

每个盘面、磁头都有唯一的编号,在一个盘面里,每一个磁道也有唯一的编号,每一个扇区也有唯一的编号。


如果想访问磁盘中的一个扇区,通过磁头定位,先确定扇区在哪一个磁道(cylinder)上,接着确定要使用哪一个磁头(head)(上面还是下面),最后确认在磁道上的哪个扇区(sector),这种定位方法称为 CHS 定位法。

我们就可以理解,选择哪个磁头,就相当于选择了哪个盘面,磁头的来回摆动是为了定位盘面的磁道,而盘片的旋转是为了寻找磁道上的扇区。

盘片的旋转和磁头的摆动都属于机械运动,机械运动导致磁盘的访问速度是比较慢的,所以需要操作系统把磁盘的数据预加载到内存中,提高效率!

磁盘的逻辑存储

逻辑存储主要涉及文件系统如何管理和访问磁盘上的数据。

LBA(Logical Block Addressing --- 逻辑块寻址)

如果把盘片的所有磁道拉直,磁盘就可以看成非常长的线性空间。

假设有4个盘面(2个盘片),每个盘面有200G,总共800G,每个盘面的基本单元(扇区)为512字节,所以一共有1 677 721 600 个扇区,每一个扇区都有对应的下标,对磁盘的管理,就变成对数组的增删查改

LBA的主要优点包括:

  1. 简化了寻址:不需要考虑物理结构如柱面、磁头和扇区。
  2. 提高了性能:减少了硬件和软件处理复杂寻址逻辑的需求。
  3. 支持更大的磁盘容量:由于LBA是基于数字的线性地址,它不受传统CHS寻址中柱面数、磁头数和扇区数限制的影响。

如何将 LBA 地址转换为 CHS 地址?

  • LBA:逻辑块地址
  • SPT:每磁道的扇区数(Sectors Per Track)
  • HPC:每个柱面的磁头数(Heads Per Cylinder)
  • HPC * SPT : 一个柱面总共有多少个扇区

计算柱面号(C)

C = LBA / ( HPC * SPT )

计算磁头号(H)

H = ( LBA % ( HPC * SPT ))/ SPT

计算扇区号(S)

S = ( LBA % ( HPC * SPT ))% SPT +1

( +1 是因为扇区号是从1开始计数的,而LBA是从0开始计数的。)

如何管理扇区?

假设磁盘中共有 800G,如何管理这 800G 呢?

我们可以对 800G 进行分区,假设分成5个区:100G、100G、150G、150G、300G,假设每个区内部是没有差异的,那么把这 5 个区管理好,不就相当于把 800G 管理好了吗。在我们的电脑中,把磁盘分为 C盘、D盘,就是所说的分区。

同样的道理,假设我们把 100G 进行分组,平均分成 10 组,每组 10G,把这 10G 管理好,100G 也就管理好了。这样把大问题划分成小问题的思想就是分治思想

那么如何管理好这 10G 呢?

首先,文件 = 内容 + 属性,文件的内容大小是不固定的,但是文件的属性的大小是固定的,Linux 将文件的内容和属性分开存储,inode 可以将文件的内容和属性进行管理!

在每个分组中,都有 Block Bitmap、inode Bitmap、inode Table、Data Blocks。其中,Data Blocks 是用来存储文件的内容。

什么是 inode ?

inode 其实是一个结构体,结构体的内容与文件有关,通常包括:

  • 文件类型:表示这是一个普通文件、还是目录、符号链接等。
  • 权限:文件的所有者、组和其他用户的读、写、执行权限。
  • 所有者ID 和 组ID:标识文件所有者和所属用户组的数字ID。
  • 文件大小:以字节为单位的文件大小。
  • 时间戳:包括最后访问时间(atime)、最后修改时间(mtime)和状态改变时间(ctime)。
  • 指向数据块的指针:这些指针指向实际存储文件数据的数据块。对于小文件,可能直接在inode中存储一些数据;对于大文件,则指向一系列的数据块。

注意文件的 inode 中不包含文件名!!!此外,一个 inode 结构体大小为 128 字节,大小是固定的。

一个文件一个 inode,每个文件都有 inode 编号,inode编号 是在整个分区内唯一有效的数字!所以对文件的管理,就变成了对 inode 的管理

inode 怎么管理文件内容?

什么是数据块?

每个分组中,都有一个 Data Blocks,也就是数据块。

在EXT2文件系统中,数据块并不是数组。数据块是存储文件内容的最小单位,它们是磁盘上的固定大小的连续空间。EXT2文件系统将磁盘划分为多个相同大小的数据块,每个数据块可以用来存放文件的数据或元数据(如inode信息)。尽管数据块不是数组,但是文件的内容可以通过类似数组的方式来访问。一个数据块只能存放 4KB 大小的数据。

而 inode 定义了数组  block[ 15 ] ,数组中存放着指向数据块的指针,一个数组只能记 15 个数据块的位置,那一个文件最大只有 60KB 吗?

  • 数组下标从 0 到 11 是直接映射,指针指向的数据块直接存放文件的内容;
  • 下标从 12 到 13 指针指向的数据块存放的是其他数据块的内容,文件的内容存储在这些其他数据块中(一次间接);
  • 下标 14 存储的是其他数据块的位置,指针指向的数据块存放的是其他数据块的内容,这些其他数据块中存储的还是其他数据块的内容,此时的数据块的内容为文件的内容(二次间接)。

位图

在Data Blocks 中,有的数据块已经使用了,有的还没有使用,  Block Bitmap 可以更快的分辨出哪些已经使用了,哪些还没有使用!

同样的,inode Table 中有的 inode 已经使用了,有的没有,inode Bitmap 的作用和  Block Bitmap 相同!

从下面这张图可以看出,每一个分组都有一张位图,一个分区就会有很多张位图,而 inode编号是在分组中唯一的,那么怎么确定 inode 在哪张位图中呢?

每个分组都会记录自己组的 inode 的起始编号和组内 inode 的个数,假设分组内的起始编号如下:

 

假设 inode 编号为 1500,通过比较每个分组的 inode 的起始编号,我们就可以确定 inode 在 Block group 1 中。

根据偏移量 500(500 = 1500 - 1000),就可以在 Block group 1 的位图中查询该文件是否存在

理解新建/删除文件 

新建文件,先查 inode bitmap,找到最小的为 0 的位置,把这个位置改为 1,然后去 inode table 找到对应的位置,把文件的属性填好,把文件的内容填写到数据区中,并把填写的数据区的位置填入到 inode 的block 中。


删除文件,找文件的 inode 编号,把 inode bitmap 改为 0,把 inode 结构体中的 block 数组对应的 block bitmap 改为 0,只是把位图清掉,并不会把inode 和数据区里面的内容清除掉!!


可见,删除文件比新建文件快很多。

理解文件名 

作为用户,我们知道的是文件名,并不知道 inode 编号,在不知道文件 inode 编号的情况下,如何找到这个文件呢?

首先我们需要了解目录,目录也是一个文件,文件都有自己的属性+内容,那目录的内容是什么呢?

因为任何一个普通文件,一定在一个目录中,目录的内容是目录中的文件的文件名和 inode 编号之间的映射关系,找文件,只需要找到文件所处的目录,就可以字符串匹配到文件名,进而找到文件名和 inode 的映射关系,找到文件对应的 inode 编号。


目录这个文件的数据块存的就是文件名和 inode 编号之间的映射关系。

新建文件,假设在组 0 里面新建文件,在 inode 位图中找到一个最小的还没有用过的编号,然后把文件的属性都写到对应的 inode 中,有文件内容的话就把文件内容写入到数据块中,然后向上层返回 inode 编号,接着建立文件名和 inode 编号的映射关系,把这个关系写入到文件目录的数据块中


  • 目录没有权限时,我们没办法在该目录下创建新文件,因为我们新建文件,会修改目录的内容,没有写权限就不能修改目录内容
  • 没有权限就不能读取inode 和文件名的映射关系

    删除文件,拿着文件名,就可以知道与 inode 的映射关系,找到映射关系,知道 inode 编号后,清掉位图,然后在目录的内容中去掉文件名和 inode 的映射关系没有目录的写权限也是没办法删除目录下的文件的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2187727.html

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

相关文章

C++ | Leetcode C++题解之第455题分发饼干

题目&#xff1a; 题解&#xff1a; class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(), g.end());sort(s.begin(), s.end());int m g.size(), n s.size();int count 0;for (int i 0, j 0; i < …

js中各种时间日期格式之间的转换

前言&#xff1a;近几天在做百度地图时,需要转换时间格式并做显示,下面这篇文章主要给大家介绍了关于js中各种时间格式的转换方法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下 &#x1f308;&#x1f308;文章目录 先来认识 js 的时间格式有哪些&#xf…

CSS3旋转、平移、缩放、倾斜

CSS3平移、缩放、倾斜、旋转 前言 下面代码用到了盒子如下&#xff1a; 使用 一、平移translate() 语法&#xff1a;translate(x轴平移距离, y轴平移距离) 使用方式如下&#xff1a; /* x轴平移200px&#xff0c;y轴平移100px */ transform: translate(200px, 100px);二、…

JavaWeb——Vue组件库Element(5/6):案例:组件实现(概述、Form表单、Table表格、Pagination 分页、效果展示、完整代码)

目录 概述 Form表单 Table表格 Pagination 分页 效果展示 完整代码 概述 在刚才制作出来的页面当中&#xff0c;上面项目的名称已制作好&#xff0c;左侧的菜单栏也已配置好。 接下来主要处理的是右侧主展示区域当中的组件编写。 在右侧的主展示区域&#xff0c;主要有…

【C++】多肽

目录 一 多肽定义 1. 多肽的构成条件 1 例一 2 例二 2. 虚函数 3. 虚函数重写的两个意外 1 协变 2 析构函数的重写 二 关键字override 和 final 1. final 2.override 三 三重对比 1. 练习 四 多肽的原理 1. 多肽调用和普通调用 2.虚函数表 3. 分析 4. 原理 …

【web安全】——文件包含漏洞

1. 文件包含基础 和SQL注入等攻击方式一样&#xff0c;文件包含漏洞也是一种注入型漏洞&#xff0c;其本质就是输入一段用户能够控制的脚本或者代码&#xff0c;并让服务端执行。 1.1. 文件包含简介 什么叫包含呢&#xff1f;以PHP为例&#xff0c;我们常常把可重复使用的函…

【CKA】十二、持久化存储卷PersistentVolume

12、持久化存储卷PersistentVolume 1. 考题内容&#xff1a; 2. 答题思路&#xff1a; 按题目要求检查各个参数&#xff0c;我就是第一次没看清楚&#xff0c;把ReadWriteOnce写成ReadWriteMany了&#xff0c;幸亏做完检查了一遍 这个参数可有可无&#xff0c;加上也不影响 …

【Go语言】Ergo:构建分布式系统的现代化 Erlang 框架

Ergo 是一个基于 Go 语言的开源框架&#xff0c;专门用于构建分布式系统。它为开发人员提供了与 Erlang/OTP 类似的编程模型和功能。Ergo 通过将 Erlang 的强大分布式并发编程模型带入 Go 语言的生态中&#xff0c;使得开发者能够轻松创建高度可靠、可扩展的分布式应用程序。 …

NumPy 第三课 -- Ndarray 对象

NumPy 最重要的一个特点是其 N 维数组对象 ndarray&#xff0c;它是一系列同类型数据的集合&#xff0c;以 0 下标为开始进行集合中元素的索引。 ndarray 对象是用于存放同类型元素的多维数组。 ndarray 中的每个元素在内存中都有相同存储大小的区域。 ndarray 内部由以下内…

CMU 10423 Generative AI:lec15(Scaling Laws 大规模语言模型的扩展法则)

文章目录 一 概述1. **扩展规律的背景**2. **两种主要的扩展规律**3. **模型容量扩展规律**4. **信息论下界**5. **计算扩展规律**6. **训练高效性**7. **结论与启示** 二 2bit/parameter 概念&#xff08;模型的存储能力分析&#xff09;**1. 概念解释****2. 图表解读****3. 量…

基于SpringBoot+Vue+MySQL的校园招聘管理系统

系统展示 用户前台界面 管理员后台界面 公司后台界面 系统背景 随着高等教育的普及和就业市场的竞争加剧&#xff0c;校园招聘成为了连接学生与企业的关键桥梁。然而&#xff0c;传统的校园招聘流程繁琐、效率低下&#xff0c;且信息更新不及时&#xff0c;给企业和求职者带来了…

Leetcode: 0041-0050题速览

Leetcode: 0041-0050题速览 本文材料来自于LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer&#xff08;第 2 版&#xff09;》、《程序员面试金典&#xff08;第 6 版&#xff09;》题解 遵从开源协议为知识共享 版权归属-相同方式…

CycleGAN图像风格迁移互换

tutorials/application/source_zh_cn/generative/cyclegan.ipynb MindSpore/docs - Gitee.com 本案例运行需要较大内存&#xff0c;建议在Ascend/GPU上运行。 模型介绍 模型简介 CycleGAN(Cycle Generative Adversarial Network) 即循环对抗生成网络&#xff0c;来自论文 U…

【Java】—— 集合框架:Collection子接口:Set不同实现类的对比及使用(HashSet、LinkedHashSet、TreeSet)

目录 5. Collection子接口2&#xff1a;Set 5.1 Set接口概述 5.2 Set主要实现类&#xff1a;HashSet 5.2.1 HashSet概述 5.2.2 HashSet中添加元素的过程&#xff1a; 5.2.3 重写 hashCode() 方法的基本原则 5.2.4 重写equals()方法的基本原则 5.2.5 练习 5.3 Set实现类…

map部分重点

1.map的方括号 给key,返回value的引用&#xff0c;如果没有key&#xff0c;就插入一个key,无参构造的value的pair<> 适用&#xff1a;没有就插入&#xff0c;有就拿找到的值 insert返回pair<iterator,bool>,[]返回值 #include<iostream> #include<map&…

更美观的HTTP性能监测工具:httpstat

reorx/httpstat是一个旨在提供更美观和详细HTTP请求统计信息的cURL命令行工具&#xff0c;它能够帮助开发者和运维人员深入理解HTTP请求的性能和状态。 1. 基本概述 项目地址&#xff1a;https://github.com/reorx/httpstat语言&#xff1a;该工具主要是以Python编写&#xff…

偏标记学习+图像分类(论文复现)

偏标记学习图像分类&#xff08;论文复现&#xff09; 本文所涉及所有资源均在传知代码平台可获取 文章目录 偏标记学习图像分类&#xff08;论文复现&#xff09;概述算法原理核心逻辑效果演示使用方式 概述 本文复现论文提出的偏标记学习方法&#xff0c;随着深度神经网络的发…

异常场景分析

优质博文&#xff1a;IT-BLOG-CN 为了防止黑客从前台异常信息&#xff0c;对系统进行攻击。同时&#xff0c;为了提高用户体验&#xff0c;我们都会都抛出的异常进行拦截处理。 一、异常处理类 Java把异常当做是破坏正常流程的一个事件&#xff0c;当事件发生后&#xff0c;…

CMU 10423 Generative AI:lec16(Mixture of Experts 混合专家模型)

关于MoE推荐博客&#xff1a; https://huggingface.co/blog/zh/moehttps://www.paddlepaddle.org.cn/documentation/docs/zh/guides/06_distributed_training/moe_cn.html 1 概述 这个文档是关于Mixture of Experts (MoE) 的介绍和实现&#xff0c;主要内容如下&#xff1a;…

virtualbox配置为NAT模式后物理机和虚拟机互通

virtualbox配置为 NAT模式后&#xff0c;虚拟机分配到的 IP地址一般是 10.xx网段的&#xff0c;虚拟机可以通过网络地址转换访问物理机所在的网络&#xff0c;但若不做任何配置&#xff0c;则物理机无法直接访问虚拟机。 virtualbox在提供 NAT配置模式时&#xff0c;也提供了端…