Linux文件系统之inode

在这里插入图片描述

文章目录

    • 1. 磁盘
      • 1.1 认识磁盘
      • 1.2 磁盘物理构造
      • 1.3 磁盘逻辑结构
    • 2. 文件系统
    • 3. 如何理解目录

1. 磁盘

1.1 认识磁盘

文件 = 内容 + 属性,而文件是存储在磁盘上,那么可以理解为磁盘上存储的文件 = 存储的文件内容 + 存储的文件属性

文件的内容采用的是块式的存储——数据块

文件的属性用inode描述

在Linux中文件在磁盘上存储,是将内容和属性分开存储的

我们目前的电脑,搭载的基本上都是固态硬盘(ssd),而老式的电脑,搭载的基本上都是磁盘(机械盘)

固态硬盘IO效率高,但有使用寿命,成本也较大;

机械盘容量大、成本低,效率低于固态硬盘

磁盘是一个永久性存储介质,是计算机中唯一一个机械设备,也是一个外设。我们的计算机全程又叫高速计算的电子计算机器,它是电子的,电信号的传递和机械设备信号的传递,肯定不是一个量级的,这就是它效率相对低的一个原因。

我们小时候接触的光盘,其实就和磁盘有点类似,只不过光盘只有一面是光的,采用的光信息存储;而磁盘如果有一个盘片的话,这个盘片2面都是光的。

image-20231114172056347

盘面高速旋转,然后磁头来回摆动读取数据,这个磁头每面都会有一个磁头(虽然是一面一片,但都是整体移动的),磁头和盘面并不接触,悬浮在盘面。

为什么笔记本不用磁盘了呢?这就是原因之一,我们的笔记本是便携式,要来来回回移动电脑,如果搭载磁盘,那么势必会让磁头和盘面接触到,这样就可能会刮花盘面,而盘面是存储数据的,这样就会导致数据的丢失。

磁盘存储原理:

吸铁石有南北级,我们这里就可以把南北极理解为二进制01,然后通过某种特性,改变它的南北极,这样就相当于对01进行修改。

磁盘就可以理解为无数个小的吸铁石构成,磁头扫到磁盘某个位置时,通过电脉冲改变这个南北极,就相当于读数据进行写入。

1.2 磁盘物理构造

image-20231114174655573

磁盘被访问的最基本单位为扇区,一般一个扇区的大小为512byte,要把数据存到磁盘,就得定位一个扇区。

  1. 定义用哪个磁头
  2. 哪个一个磁道
  3. 哪一个扇区

在中这个定位过程中,磁头摆动的次数越多,就说明定位的时间越长。也就是运动的次数越多,效率越低;运动的次数越少,效率越高。

那么对于设计的角度来说,就尽量将有关联的数据放在一起,减少定位寻址的时间

1.3 磁盘逻辑结构

image-20231114185423534

在以前,我们买专辑或者是以前的英语课本,都是以磁带形式录制的,在物理上看,这些磁带是同心圆绕在一起,但如果我们将其全部抽出来,我们在逻辑上可以理解为是线性的。这就有了一个基于扇区的数组,每个扇区都有其对应的下标。

image-20231114191230419

这个28888叫LBA逻辑区块地址;转换过来物理地址就叫CHS

2. 文件系统

我们电脑里面会分多个盘(C盘、D盘、E盘…)来便于我们用户管理不同的数据。

但在系统层面的分区,其实就是将一整块的内容,定义头尾,这样来表示分区:

struct partion
{int start;int end;
}

分区之后,系统要管理这整块磁盘的内容就转变成了管理这一块区域,后面区域的管理直接CV就行。当然了我们分区一般都是按几十几百GB来分的,这几十几百GB也十分的大,系统会继续划分为各个block group,这个block group里面就包含了我们的文件系统。

image-20231114195101333

  • Date blocks:存文件内容的区域,以块的形式呈现。常见的是4kb大小 —— 文件系统的块大小

    这里的意思就是,如果我们创建了一个文件,我们只往里面写一个字节的内容,在文件系统中,都要在分区里面找一个块组申请一个块,这个块的大小是4kb。所以访问文件的最小单位就是4kb

  • inode table

    inode:单个文件的所有属性,一般而言大小是128byte,一个文件一个inode,每个inode的编号是唯一的。在Linux用inode来标识文件,文件属性中,不包含文件名称。

    #define NUM
    struct inode
    {文件类型权限引用计数拥有者所属组ACM时间inode number;int block[NUM];
    }
    

  • inode Bitmap:比特位的位置和inode编号映射起来,比特位的内容表示inode是否有效

  • Block Bitmap:比特位的位置和块号映射,比特位的内容表示该块有没有被使用

    我们删一个文件的时候,就不用把块内容清空了,直接将这个块号比特位置空即可(这就是为什么拷贝大文件会相对慢,而删除一个文件相对快)。

  • Group Descriptor Tableinode bitmapblock bitmap用来描述inode编号和块号是否有效,无法描述这些组里面使用情况,而GDT就能用来这个组的基本使用情况(用了多少、还剩多少…)

  • Super Block:整个分区的基本使用情况,一共多少个组,

    每组的大小

    每组的inode数量

    每组的block数量

    每组的起始inode

    文件系统类型与名称…

    这个Super block会在block group里面存在多份,这样是为了防止Super bolck出现异常导致每个组的边界不清楚,从而导致整个分区全部混乱。

每一个分区在使用之前,都必须提前将部分文件系统的属性信息提前设置进对应的分区中,方便后续使用整个分区或者分组。

  • 在新建一个文件的时候,先确定在哪个分区(路径),根据inode bitmap分配inode,然后内容由block bitmap检查分配块号,然后再将内容填入这个块里面
  • 删除一个文件的时候,根据inode找到属性,先将block bitmap置空,再将inode bitmap置空,不需要就块里面的内容清空
  • 查找文件就是根据这个文件的inode找到该文件的属性,再从属性里面找到对应的块

3. 如何理解目录

在Linux下,一切皆文件,我们的目录,也属于文件,也有自己的inode,也要有自己的属性,他的属性我们可以查看,但是内容又是什么呢?

image-20231114215026371

目录数据块里面放的是该目录的文件和对应文件的inode映射关系,这个映射是一对一的,是一个kv结构。

所以这就是为什么同一个目录下不能由同名的文件,因为这个映射是一对一的;

如果我们在这个目录没有w写权限,那么就不能创建文件或目录,因为这个文件的名和inode的映射关系无法写到这个数据块里面;

如果没有r读权限,我们无法查看这个文件,因为得不到文件的文件名和inode的映射关系;

我们要找到这个目录,就得由这个目录的目录inode,所有目录往上走,最后都是根目录\,所有会一直往上找,找到根目录,然后再往下传inode。所有访问然后文件,都得有这个文件的路径。

我们有时候访问文件,都是直接访问的,这是因为系统有环境变量,进程也有自己工作的当前目录,所以系统访问文件,一定是要带上路径的。

当然,这样递归访问,效率是比较底下的,Linux中会将常访问的路径进行缓存,这样就能提高效率了

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

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

相关文章

GPT 学习法:恐怖算力 + 精确算法,实现复杂文献轻松的完美理解、在庞大的不确性中找到确定性

GPT 学习法:恐怖算力 精确算法,实现复杂文献轻松的完美理解、在庞大的不确性中找到确定性 复杂文献 - 恐怖算力 精确算法,复杂文献轻松的完美理解GPT 理解法 - 举例子、归纳、逻辑链推导本质、图示、概念放大器实战案例:学习高精…

力扣每日一题-K个元素的最大和-2023.11.15

力扣每日一题:K个元素的最大和 题目链接:2656.K个元素的最大和 题目描述 代码思路 题目看完直接笑嘻了,还有这么容易的题。由题可知,第一次要找出最大值m,那由于把m1放回去,那第二次找的就是m1,以此类推…

2.4G射频收发芯片XL2400P,收发一体,性能优异

XL2400P 系列芯片是工作在 2.400~2.483GHz 世界通用 ISM 频段的单片无线收发芯片。该芯片集成射频收发机、频率收生器、晶体振荡器、调制解调器等功能模块,并且支持一对多组网和带 ACK 的通信模式。发射输出功率、工作频道以及通信数据率均可配置。芯片已将多颗外围…

Apache Airflow (七) :DAG调度周期设置

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹…

HTML+CSS+JavaScript实战(一个简易的视频播放器)

效果如下&#xff1a; 思路很常规&#xff0c;无需注释即可看懂&#xff08;其实是懒得敲 bushi&#xff09; 没有注释也能跑&#xff0c;so直接上源码~ 感谢 夏柔站长 提供的免费API index.html <!DOCTYPE html> <html lang"en"> <head><meta …

Linux上C++通过LDAP协议使用kerberos认证AES加密连接到AD服务器

一.前言 记录自己在实现这个流程遇到的各种问题&#xff0c;因为我也是看了许多优质的文章以及组内大佬的帮助下才弄成的&#xff0c;这里推荐一个大佬的文章&#xff0c;写的非常优秀&#xff0c;比我这篇文章写得好得很多&#xff0c;最后我也是看这个大佬的代码最终才实现的…

【前端开发】JS Vue React中的通用递归函数

目录 前言 一、递归函数的由来 二、功能实现 1.后台数据 2.处理数据 3.整体代码 总结 &#x1f642;博主&#xff1a;冰海恋雨. &#x1f642;文章核心&#xff1a;【前端开发】JS Vue React中的通用递归函数 前言 大家好&#xff0c;今天和大家分享一下在前端开发中j…

Python语言:文件的操作与使用

Python语言可以对电脑中的文件进行一系列操作&#xff0c;包括文件的打开与关闭&#xff0c;文件内容的读取和追加等。 打开文件 语法&#xff1a;使用open函数 使用python语言的内置open函数打开一个文件&#xff0c;里面有三个参数可以指定文件的路径&#xff0c;操作方式&a…

【嵌入式设计】Main Memory:SPM 便签存储器 | 缓存锁定 | 读取 DRAM 内存 | DREM 猝发(Brust)

目录 0x00 便签存储器&#xff08;Scratchpad memory&#xff09; 0x01 缓存锁定&#xff08;Cache lockdown&#xff09; 0x02 读取 DRAM 内存 0x03 DREM Banking 0x04 DRAM 猝发&#xff08;DRAM Burst&#xff09; 0x00 便签存储器&#xff08;Scratchpad memory&#…

8.GC基本原理

目录 概述垃圾回收引用计数法 (Reference Counting)根可达分析算法 (GCRooting Tracing)对象引用类型强引用软引用弱引用 清除垃圾1.标记-清除算法 (Mark-Sweep)2.复制算法 (Copying)3.标记-整理算法 (Mark-Compact)分代回收 (Generational Collection) 垃圾回收器GC-串行收集器…

C# +.Net检验科信息管理系统源码 LIS系统源码

检验科信息管理系统&#xff08;LIS&#xff09; LIS系统集申请、采样、核收、计费、检验、审核、发布、质控、查询、耗材控制等检验科工作为一体的网络管理系统。它的开发和应用将加快检验科管理的统一化、网络化、标准化的进程。 主要包括以下功能&#xff1a; 1、数据采集…

面试:容器技术

目录 为什么需要 DevOpsDocker 是什么&#xff1f;Docker 与虚拟机有何不同&#xff1f;什么是 Docker 镜像&#xff1f;什么是 Docker 容器&#xff1f;Docker 容器有几种状态&#xff1f;解释一下 Dockerfile 的 ONBUILD 指令&#xff1f;什么是 Docker Swarm&#xff1f;如何…