【Linux】文件系统

在这里插入图片描述

送给大家一句话:
你的任务,就是珍惜你自己的人生,而且还要比之前任何时候更加珍惜。
– 东野圭吾


文件系统

  • 1 前言
  • 2 物理磁盘
  • 3 磁盘的存储结构
  • 4 抽象理解磁盘储存
  • 5 引入文件系统 (如何管理磁盘文件)
    • 5.1 了解文件系统
    • 5.2 细节处理
      • 如何存储文件
      • 如何寻找指定文件
  • Thanks♪(・ω・)ノ谢谢阅读!!!
  • 下一篇文章见!!!

1 前言

之前我们学习了

  1. 操作系统中文件操作的系统调用接口
  2. 了解了文件描述符
  3. 重定向的使用与底层原理
  4. 了解什么是缓冲区

但是这些都是文件被进程打开后才有的操作,那么其余文件呢???在我们的系统中有非常多的文件(一切皆文件),被打开的文件只是一小部分。没有被打开的文件实际上是在磁盘上储存的,也就是磁盘文件。
在打开文件之前,我们需要找到文件 -> 就要从磁盘中找到对应文件 -> 通过文件路径与文件名。

今天我们来了解如何管理磁盘文件 — 文件系统。

2 物理磁盘

我们首先来了解物理磁盘是什么样子的:
通常由金属外壳、控制电路板和接口组成。硬盘内部有盘片、磁头和悬臂等部件,用于存储和读取数据。盘片表面涂有磁性介质,数据以磁道和扇区的形式存储。硬盘通过磁头在盘片上读写数据,而磁头则由悬臂支撑和定位。
简约来说,物理磁盘是计算机中用于存储数据的实体设备,具有特定的结构和外观
在这里插入图片描述
因为计算机只认识二进制,我们就需要一个结构可以通过记录二进制信息来储存文件。物理磁盘就是这样一个结构。
磁盘的碟片两面都可以进行存储,一个磁盘中有多个碟片(碟片越多,容量越大),读取写入的结构是磁头(悬浮在碟片上),每面都会有一个磁头来读写数据。磁盘中央是一个马达,使其可以旋转来使磁头读取到信息。

3 磁盘的存储结构

磁盘是一个机械结构,读写速率较慢。所以我们尽量减少读取次数,让其定期刷新,并让其一次可以读写入较多数据(缓冲区的作用)
在这里插入图片描述
磁盘上可以理解为是无数个磁铁(可以通过位置方向表示二进制信息)。我们来认识几个概念

  1. 以磁盘圆心为中心,每一圈都称为磁道(因为有多个碟片,所以磁道也可以加做柱面)
  2. 像切蛋糕一样分出的块称为扇区,扇区是磁盘读写的基本单位(每个扇区有对应容量)
  3. 一片磁片有 n 个磁道,每个磁道有 m 个扇区

那么我们如何找到指定位置的文件呢 —— CHS定址法

  • 第一步确定在那一面(确定磁头 Header)
  • 第二步确定在哪个磁道(柱面Cylinder)
  • 第三步盘片选择,确定在哪个扇区 Sector

文件 = 内容+属性,也就都是数据,而数据是二进制储存的,所以文件在磁盘中储存可以理解为文件在磁盘中占有多少个扇区

4 抽象理解磁盘储存

虽然CHS定址法很直接,但是操作系统并不使用该方法,因为该方法耦合度太高。为了方便实现内核进行磁盘管理,需要进行抽象管理。
磁盘可以整体抽象为一个线性结构:把所有的扇区连接在一起,形成一个线性结构。也就是我们可以通过数组(储存扇区)来管理磁盘。那么如何进行准确的定位磁盘位置呢(假设一个面有10个磁道,1000个扇区)???

  1. 因为磁盘每个碟片和扇区的储存容量是一定的,也就可以通过扇区的index值来确定其在哪个碟片。(H = index / 1000)
  2. 确定了在哪个碟片,我们就要确定其在该碟片哪个扇区(temp = index / 1000 )
  3. 确定扇区后,我们再来确定子啊那个磁道 ( C = temp / 100)

这样通过一个线性结构就可以管理磁盘。
文件就等于很多个扇区的下标

一般操作系统与磁盘交互时不这样一个一个下标来确认。基本单位可能是 4KB ,也就是一次读取多个扇区。
4KB 假如是8 个连续的扇区,我们称之为数据块。
那么文件就是多个块来构成的。操作系统通过块来读取数据,通过每个块的起始位置就能确定块中的扇区的CHS(只要知道一个起始,和磁盘总大小,有多少块,每个块的编号,如何转换到CHS,就都知道了),称之为:LBA(逻辑区块地址)

5 引入文件系统 (如何管理磁盘文件)

5.1 了解文件系统

有了上面的线性大地址,我们就可以开始构建出文件系统了。
在这里插入图片描述
磁盘每个分区的容量是很大的(比如我们电脑的C盘 D盘 E盘),要直接管理好这个大空间是有点困难的,所以操作系统对磁盘分区进行一个分组,只要管理好这个分组就能管理好这个分区(分治思想!!!)。

首先:文件 = 文件内容 + 文件属性 。文件在磁盘中存储,本质是储存文件的内容与文件的属性数据。在每个分区内部分组,然后写入文件系统的管理数据,称之为格式化!!!

Linux 文件系统特定: 文件属性 与 文件内容 分开存储。接下来我们来研究文件系统:
在这里插入图片描述
每个组里有这些部分:

  1. Block Group(占据空间最大的一部分):每个Block Group都有着相同的结构组成。里面储存着非常多的数据块( 都有对应的块号),每个数据块只存储文件的内容。
  2. inode 表 : 存放文件属性 如 文件大小,所有者,最近修改时间等
    Linux中文件的属性是大小固定的集合体(一般固定128字节) 不包含文件名,但是都有inode_number,通过inode号来标识一个文件。
struct inode
{int size;mode_t mode;int creater;int time;...int inode_number;... int datablocks[N]
}
  其中的datablocks[N]用来储存使用了哪些数据块(通过块号来储存)。但是N一般是15,想要储存一个大文件是怎样储存的呢?
  1. GDT(Group Descriptor Table):块组描述符,描述块组属性信息:块多大,有多少个Datablock,使用了多少个… 其本质是管理字块的部分

  2. 超级块(Super Block):存放文件系统(分区)本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了,超级块不是每个分区都有的,但是超级块也会有多个,内容也保持一致,防止数据丢失,提高系统健壮性。

  3. 块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。通过010101的比特位来记录信息。

  4. inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。通过010101这样的比特位表示是否可用。

  5. 数据区:存放文件内容

5.2 细节处理

如何存储文件

我们找寻文件时,必须先得到文件的inode号。在我们的GDT中会记录下该组的inode编号的范围(start 与 end ),通过文件inode就可以确定其所属分区。 datablock 也是如此!!! 也有对应块号。这样就能找到文件的内容。

inode 表中的datablock[N]通常只有15容量,那是怎样储存大文件的呢?其实这里就比较类似指针数组了,一般【0 , 11】直接映射数据块,【12 , 15】 指向的数据块,这个数据块里面也类似一个datablock[N],来指向其他数据块!(存在一级映射,二级映射,三极映射。并且可以跨组访问,但是强烈不推荐这样,因为硬件的限制会导致访问较慢)

上述的寻找过程是以inode为索引搜索 ,为什么要不使用文件名呢???
这是因为目录本质也是一个文件,是文件就会有内容与属性。那目录的内容是什么呢?目录内容就是文件名与其inoded 映射关系。
这也可以解释一下我们平时的应用:

  1. 同一目录下不难创建同名文件
  2. 查找文件的顺序,先查找文件名->再找到映射的inode编号。
  3. 目录的 r 权限 :本质是 是否允许我们读取目录的内容(文件名与inode的映射关系)
  4. 目录的 w 权限 :新建文件,最后一定是向当前所处的目录内容中写入:文件名与inode的映射关系
  5. 如何理解文件的增删查改:
    • 增加:本质是先根据inode位图子所属分区申请一个新的inode,根据inode值确定分组,再通过block位图寻找未被使用的数据块,然后开始写入数据
    • 修改:根据文件名找到对应映射的inode,然后找到对应的文件内容,进行修改。
    • 删除:本质是在inode位图中设置为 0 ,这样就完成了删除。

如何寻找指定文件

要找到指定文件 -> 首先要找到所在目录 ->找到文件的inode编号 -> 打开文件

找到所在目录的过程与找指定文件过程一样,因为目录本质也是文件 !就这样进行逆向的路径解析。
而Linux系统会进行路径的缓存,来方便我们的寻找工作。
我们一般使用的云服务器会有一个虚拟磁盘vda,系统中会有许多分区。我们访问一个分区会对我们使用的分区进行挂载,挂载实质是将一个磁盘分区与目录进行关联,这样就可以在该分区进行文件操作。
在这里插入图片描述

Thanks♪(・ω・)ノ谢谢阅读!!!

下一篇文章见!!!

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

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

相关文章

基于 SpringCloud 的在线交易平台乐优商城的设计与实现(六)

目录 第六章 系统测试 6.1 功能性测试 6.1.1 商家后台功能测试 6.1.2 前台功能测试 6.2 非功能性测试 6.3 本章小结 结束语 参考文献 前面内容请移步 基于 SpringCloud 的在线交易平台乐优商城的设计与实现(五) 相关免费源码资源 乐优商城…

SpringBoot JPA使用

SpringBoot JPA使用 简介 Spring Data JPA 是 Spring 框架提供的一个模块,用于简化与关系型数据库的交互和数据访问。它基于JPA(Java Persistence API)标准,并提供了一组易于使用的API和工具,帮助开发人员更轻松地进…

深入理解分布式事务① ---->分布式事务基础(四大特性、五大类型、本地事务、MySQL并发事务问题、MySQL事务隔离级别命令设置)详解

目录 深入理解分布式事务① ---->分布式事务基础(四大特性、五大类型、本地事务、MySQL并发事务问题、MySQL事务隔离级别命令设置)详解事务的基本概念1、什么是事务?2、事务的四大特性2-1:原子性(Atomic&#xff09…

(学习日记)2024.04.30:UCOSIII第五十四节:User文件夹函数概览(uCOS-III->Ports文件夹)

之前的章节都是针对某个或某些知识点进行的专项讲解,重点在功能和代码解释。 回到最初开始学μC/OS-III系统时,当时就定下了一个目标,不仅要读懂,还要读透,改造成更适合中国宝宝体质的使用方式。在学完野火的教程后,经过几经思考,最后决定自己锦上添花,再续上几章。 这…

Linux深入学习 - 进程

目录 进程描述符 标识一个进程 进程组织 进程之间的关系 如何组织进程 等待队列 进程资源限制 进程切换 硬件上下文 switch_to宏 创建进程 do_fork 内核进程 撤销有一个进程 do_group_exit do_exit函数 Reference 下面开始讨论一个非常重要的抽象:…

黑烟车智能电子抓拍系统大幅度节约人力物力

黑烟车智能电子抓拍系统大幅度节约人力物力,之前黑烟车监测通过执勤交警人工现场监测会耗费大量人力物力,效率较低,现在通过黑烟车智能电子抓拍系统可以大辅导提升监测效率,遗漏少,效率高,值得大力推广。 黑…

【Python数据库】MongoDB

文章目录 [toc]数据插入数据查询数据更新数据删除 个人主页:丷从心 系列专栏:Python数据库 学习指南:Python学习指南 数据插入 from pymongo import MongoClientdef insert_data():mongo_client MongoClient(hostlocalhost, port27017)co…

红米A2/A2+/POCO C51手机秒解BL+快速获取root权限+解谷歌锁刷机救砖教程

红米A2/A2/POCO C51手机是目前小米公司针对于国外用户的1个独立的品牌,或者和国内的红米手机都非常相似,几款手机由于硬件非常接近,我们这里将其放在一起和大家介绍而从他们的代号中我们可以得知,目前A2/POCO的代号为water&#x…

从零学算法1017

1017. 负二进制转换 给你一个整数 n ,以二进制字符串的形式返回该整数的 负二进制(base -2)表示。 注意,除非字符串就是 “0”,否则返回的字符串中不能含有前导零。 示例 1: 输入:n 2 输出&…

ORAN每个端点和每个C平面消息的限制

O-RU每个端点的处理限制 当O-RU的处理粒度是基于端点的,即,在O-RU中处理C/U平面消息的处理资源被分配给每个端点时,O-RU可以对每个端点施加特定限制,例如,endpoint-section-capacity、endpoint-beam-capacity、endpoi…

ctfshow web78 获取flag

第一种:利用input伪协议 ,获取到flag 第二种:利用flter协议,获取到flag https://21d9e58a-c0fd-47ea-a9c4-d875100f2fdb.challenge.ctf.show/?filephp://filter/readconvert.base64-encode/resourceflag.php 得到的结果PD9waHANCg0KLyoNCiMgLSotIGNvZG…

代码随想录算法训练营第12天:滑动窗口和前缀和

代码随想录算法训练营第12天:滑动窗口和前缀和 这里我参考了西法的博客, 467. 环绕字符串中唯一的子字符串(中等)795. 区间子数组个数(中等)904. 水果成篮(中等)992. K 个不同整数的子数组(困难)1109. 航班预订统计(中等) 前四…

C++ map自定义比较函数遵守严格弱序

问题背景及定位 背景:这个问题是在将tablesaw(一个Java的数据处理项目)迁移到C时出现的。 问题位置:SplitOn()函数,在数据流水线中的aggregate阶段。 问题描述:使用google/benchmark进行了批量化的性能测…

机器学习周报第36周 AT-LSTM

文章目录 week36 AT-LSTM摘要Abstract一、文献阅读1. 题目2. abstract3. 网络架构3.1 LSTM3.2 注意力机制概述3.3 AT-LSTM3.4 数据预处理 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程4.3.1 训练参数4.3.2 数据集4.3.3 实验设置4.3.4 实验结果 5. 基于pytorch的transfor…

asp.net表单上传文件

asp.net表单上传文件 可以用自己的主机搭建服务器环境测试 1.借鉴文章&#xff1a; 原文链接&#xff1a;http://www.cnblogs.com/gxwang/p/4883902.html 2.html端示例代码&#xff0c; 文件名为index.aspx <% Page Language"C#" AutoEventWireup"true…

IDEA那些牛X的插件

activate-power-mode&#xff1a;代码震动效果 Easy JavaDoc&#xff1a;帮你写注释 EASY Code&#xff1a;帮你生成mapper之类的代码 Generate O2O&#xff1a;帮你生成两个类之间复制的代码 GitToolBox&#xff1a;Git工具 IDE Eval Reset&#xff1a;懂得都懂 Java Be…

使用Cesium ion将 Sketchfab 3D 模型添加到您的GIS应用中

您现在可以将 Sketchfab 中的 3D 模型导入 Cesium ion 中以创建 3D 块&#xff0c;从而更轻松地为地理空间体验创建上下文和内容。 Sketchfab 是 Epic Games 的一部分&#xff0c;也是使用最广泛的 3D 资产市场之一。自 2012 年推出以来&#xff0c;已有超过 1000 万用户使用 …

【数据结构】最小生成树(Prim算法、Kruskal算法)解析+完整代码

5.1 最小生成树 定义 对一个带权连通无向图 G ( V , E ) G(V,E) G(V,E)&#xff0c;生成树不同&#xff0c;每棵树的权&#xff08;即树中所有边上的权值之和&#xff09;也可能不同。 设R为G的所有生成树的集合&#xff0c;若T为R中边的权值之和最小的生成树&#xff0c;则T称…

3. uniapp开发工具的一些事

前言 新的一天&#xff0c;又要开始卷起来了&#xff0c;开发程序开发当前离不开开发工具&#xff0c;一个好的开发工具办事起来那必然是事倍功半的...本文主要分享了关于uniapp里开发工具的一些事~ 概述 阅读时间&#xff1a;约5&#xff5e;7分钟&#xff1b; 本文重点&am…

ssh基本功能

SSH&#xff08;Secure Shell&#xff09;是一种安全协议&#xff0c;用于在不安全的网络中为网络服务提供安全的传输。SSH利用公钥加密技术为远程登录会话和其他网络服务提供安全性的协议。可以有效防止远程管理过程中的信息泄露问题。 SSH的主要功能有&#xff1a; 远程登录…