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

【Linux】理解文件系统

文章目录

  • 理解文件系统
      • 了解磁盘结构
      • inode

理解文件系统

了解磁盘结构

磁盘是计算机中的一个 机械设备

image-20220703111602904


这个磁盘的盘片就像光盘一样,数据就在盘片上放着, 但是光盘是只读的,磁盘是可读可写的

机械硬盘的寻址的工作方式: 盘片不断旋转,磁头不断摆动,定位到特定的位置

我们可以把磁盘看成是 线性结构,站在OS的视角:我们就认为磁盘是线性结构,要访问某一个扇区,就要定位数组下标LBA,要写到物理磁盘上,就要把LBA地址转化成磁盘的三维地址(磁头,磁道,扇区)

image-20220703111619796


inode

文件在磁盘上是如何保存的?

1)首先我们知道,文件是在磁盘中的, 而现在我们把磁盘认为是一个线性结构

磁盘的空间很大,管理成本高!但是我们可以划分进行管理,比如我们的国家,把土地划分成每一块,并且给每一块土地配合合适的管理人员

因此我们对大磁盘:

1.分区: 大磁盘->划分为若干个小空间

2.格式化: 给每个分区 写入文件系统 (比如:向某某省写入领导班子)

下面我们以一个小区域作为例子,理论上,如果我们能把这个小区域管理好, 其余区域再复用这个管理方式即可.


例如:

image-20220703135438174

  • Block Group:ext2文件系统会根据分区的大小划分为数个Block Group.而每个Block Group都有着相同的结构组成 政府管理各区的例子
  • 超级块(Super Block):存放文件系统本身的结构信息.记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息.Super Block的信息被破坏,可以说整个文件系统结构就被破坏了
  • GDT,Group Descriptor Table:块组描述符,描述块组属性信息
  • 块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用
  • inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用
  • 节点表:存放文件属性 如 文件大小,所有者,最近修改时间等
  • 数据区:存放文件内容

每个分区最初都可以有Boot Block,是与启动相关的,供启动时查找分区, 我们再把剩下的空间继续拆解分组, Block group 0,Block group 1,…Block group n ,如果我们能管理好Block group 0,就能管理好1~n ,于是研究文件系统,就变成了研究一个Block group 0


文件 = 文件内容 + 文件属性 ,文件内容放在Data blocks中,属性放在inode Table中

其中文件内容就算就算当中存储的数据,文件属性就算文件的一些基本信息,如:文件名,文件大小,文件的创建时间等信息

image-20220703111901113

文件属性和文件内容分开存放,那他们是怎么关联的呢?

我们平常都是用文件名访问文件,但是在Linux下,在系统层面,文件名以及它的后缀是没有意义的,只是为了方便给用户使用. Linux真正标识一个文件,是通过文件的inode编号 ,一个文件对应一个inode,一个inode也有自己的编号

inode里面有什么

要创建文件,就要在inode Table中申请一个未被使用的inode,填入文件的属性, 在Data blocks中也要创建一个block,用于存放文件的内容, inode用数组存储了相关联的blocks块编号,

Linux真正标识一个文件,是通过文件的inode编号,一个文件一个inode

//包含所有的文件的属性
struct inode
{//数据int inode_num;int blocks[32];
};

inode和inode编号:

保存文件信息的结构称为inode,因为系统中存在大量的文件,我们需要给每个文件的属性集起一个唯一的编号标识它,即 inode编号

我们怎么在inode Table申请一个未被使用的inode 和 如何在 Data blocks中申请未被使用的数据块?

使用遍历的话效率太低, 于是我们有位图inode Bitmap 和 block Bitmap来标识

例子:

0000 1111

从右往左,每一个比特位位置的含义是: inode编号 比特位的内容含义:特定的inode是否被使用

于是创建文件,申请一个未被使用的inode,就遍历inode Bitmap,找到第一个比特位为0的位置, 申请block数据块也同理, 当我们遍历到若干个为0的数据块位置,填入到blocks数组中构造映射关系


问:inode不保存文件名, 文件名是怎么和inode做对应的?

首先,我们要知道, Linux下一切皆是文件, 目录也是文件!所以在磁盘上,目录也有自己的 inode,目录也有自己的数据, 目录的数据块存放什么? -> 目录下的文件名和其对应的inode编号

  • 那目录的inode中存放什么信息?

目录的大小,权限,链接数, 拥有者,所属组等

image-20220703141814911


  • 目录的数据块block放什么

首先我们要知道,我们所创建的所有文件,都放在特定的目录下,用户要用文件名,而系统用的是inode,因此 目录的数据块中存的是文件名和inode的映射关系


如何理解创建一个空文件

1.遍历inode Bitmap,找到比特位为0的位置,申请一个未被使用的inode

2.将inode表中找到对应的inode, 并将文件的属性信息填到inode结构当中

3.将该文件的文件名和inode指针添加到目录文件的数据块当中


如何理解对文件信息写入

1.通过文件的inode编号找到对应的inode结构

2.通过inode结构找到存储该文件内容的数据块,并将数据写入数据块

3.若不存在数据块或者申请的数据块已经写满了,就需要遍历block Bitmap找到一个空间的块号,并在数据区当中找到对应的空闲块,把数据写入到数据块当中,最后还需要建立数据块和inode结构的对应关系


描述下面的操作在系统层面都干了什么

image-20220703143459886

1)创建文件: 遍历inode Bitmap位图找到比特位为0的位置, 然后把该位置比特位置为1,申请一个未被使用的inode,填入属性信息,并把这个文件名和inode的映射关系写到目录的Data blocks中

2)查看目录:根据该目录数据块的内容,通过inode找到与其映射的文件名

3)向文件当中写入:遍历位图block map找到若干个未被使用的数据块,把该文件的inode和这些blocks建立映射关系,然后向blocks写入内容

4)查看文件内容: cat hello.c -> 查看当前Test目录的data Blocks的数据块->找到hello.c这个文件名和其inode编号的映射关系 -> 在inode Table中找到inode -> 在inode结构体中找到对应的blocks[] -> 打印文件内容


问:删除文件做了些什么?

删除一个文件,并不删除属性和数据,只是把它是否有效删除掉了

只需要在位图中把对应inode编号的比特位由1置为0,把使用的数据块也在位图中由1置为0,并不需要改动文件属性和数据,所以删除数据一般是很快的

当我们删除文件后短时间内是可以恢复的, 为什么说是短时间内呢,因为该文件对应的inode号和数据块号已经被置为了无效,因此后续创建其他文件或是对其他文件进行写入操作申请inode号和数据块号时,可能会将该置为无效了的inode号和数据块号分配出去,此时删除文件的数据就会被覆盖,也就无法恢复文件了


为什么拷贝文件的时候很慢,而删除文件的时候很快

因为拷贝文件需要先创建文件,然后再对该文件进行写入操作,该过程需要先申请inode号并填入文件的属性信息,之后还需要再申请数据块号,最后才能进行文件内容的数据拷贝,而删除文件只需将对应文件的inode号和数据块号置为无效即可,无需真正的删除文件,因此拷贝文件是很慢的,而删除文件是很快的

如何理解目录

1.都说在Linux下一切皆文件,目录当然也可以被看作为文件

2.目录有自己的属性信息,目录的inode结构当中存储的就是目录的属性信息,比如目录的大小、目录的拥有者等

3.目录也有自己的内容,目录的数据块当中存储的就是该目录下的文件名以及对应文件的inode指针

注意: 每个文件的文件名并没有存储在自己的inode结构当中,而是存储在该文件所处目录文件的文件内容当中.因为计算机并不关注文件的文件名,计算机只关注文件的inode号,而文件名和文件的inode指针存储在其目录文件的文件内容当中后,目录通过文件名和文件的inode指针即可将文件名和文件内容及其属性连接起来

如何理解把一个文件移动到另一个目录下

实际上是把文件名和inode的映射关系到另一个目录下


在命令行输入ls -l可以查看各个文件的属性信息

image-20220704151317395

其中每一列代表的内容都不一样:

image-20220704151725126


注意:无论是文件内容还是文件属性,他们都是存储在磁盘当中的

相关文章:

【Linux】理解文件系统

文章目录理解文件系统了解磁盘结构inode理解文件系统 了解磁盘结构 磁盘是计算机中的一个 机械设备 这个磁盘的盘片就像光盘一样,数据就在盘片上放着, 但是光盘是只读的,磁盘是可读可写的 机械硬盘的寻址的工作方式: 盘片不断旋转,磁头不断摆动,定位到特定的位置 我们可以把…...

Java如何String字符串带括号转成List

问题现象 今天在做一个需求:将存入数据库中的数据读到后解析成list遍历分析 数据格式: "[1677660600000, 1677660900000, 1677661200000]" "[5, 4, 4,3,2,0,0]" 我一开始想到的就是使用逗号分割即可 结果变成了这样的…...

react 使用 mqtt

也许很多人都好奇这个mqtt是什么东西,其实在互联网上可能不会使用到它,它是物联网上的东西,也是一种通信协议跟websocket。但它也能在浏览器跟服务器上跑,它的底层实现也是封装了websocket。 MQTT MQTT是一个客户端服务端架构的发…...

W25Q256被写保护如何修改

W25Q256被写保护如何修改1、 W25Q256数据读不到1.1 打印的寄存器的值1.2 可能原因1.3 解决办法1.4 用到的函数1、 W25Q256数据读不到 能够正确的读到ID,但是读到的数据不正确 1.1 打印的寄存器的值 0x2 BUSY :只读, 指令正在执行 WEL (1) &…...

论文投稿指南——中文核心期刊推荐(中国文学作品)

【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…...

MySQL 问题总结

什么是MVCC? 说说MySQL实现MVCC的原理? MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问。 对于「读已提交」和…...

62. 不同路径

62. 不同路径 一个机器人位于一个 m∗nm * nm∗n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路…...

在windows安装python3.11同时进行一个数据的练习

安装包百度网盘如下: 链接:https://pan.baidu.com/s/1l9H1GWP64LOxLaXXLie2uA?pwd6666 提取码:6666 1.我们选择自定义安装 2.当我们点了自定义安装后就直接next 3.修改路径,之后点击安装(install) 4.安装完成,进行…...

Java接口专题

基本介绍 接口给出一些没有实现的方法,封装到一起,到某个类使用时再根据具体情况把这些方法写出来。 注意:在jdk7之前,接口里所有的方法都是抽象方法。在jdk8之后接口中可以有静态方法,默认方法 interface 接口名{/…...

6招优化WordPress打开速度-让你的网站飞起来

为什么我们的WordPress网站比你的快? 我们的官网是使用WordPress框架搭建的,有没有发现我们的网站非常快,而你的WordPress网站比较慢呢?那是因为我们的网站经过了优化。 WordPress 很慢? 为什么很多人都会觉得 Word…...

春天到了,来一场 VoxEdit 创作大赛吧!

春天的气息扑面而来,这是让你尽情绽放创造力的最佳时机!我们将以「春天」为主题来一场 VoxEdit 大赛。在这里,你可以展示你的才华并赢得 $SAND 奖励! 无论你是专业的设计师,还是仅仅喜欢创造美丽的艺术,这场…...

异步Buck和同步Buck的特点

1 介绍 随着时代的发展,工业,车载,通信,消费类等产品都提出了小型化,智能化的需求。相应的,对于这些系统中的电源模块提出了小型化的要求。目前,市场上依然存在很多异步Buck电源管理芯片使用的场…...

基于轻量级YOLO开发构建中国象棋目标检测识别分析系统

关于棋类相关的项目在我之前的博文里面都有做过,如下:《yolov5s融合SPD-Conv用于提升小目标和低分辨率图像检测性能实践五子棋检测识别》《YOLOV5融合SE注意力机制和SwinTransformer模块开发实践的中国象棋检测识别分析系统》《基于yolov5s实践国际象棋目…...

机器学习100天(三十五):035 贝叶斯公式

《机器学习100天》完整目录:目录 机器学习100天,今天讲的是:贝叶斯公式! 好了,上一节介绍完先验概率、后验概率、联合概率、全概率后,我们来看这样一个问题:如果我现在挑到了一个瓜蒂脱落的瓜,则该瓜是好瓜的概率多大? 显然,这是一个计算后验概率的问题,根据我们之…...

大话数据结构-栈

1 概述 栈(Stack)是限定仅在表尾进行插入和删除操作的线性表。 允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈,栈又称为后进…...

javaFx实现放大镜效果——圆形、矩形、三角形放大镜,拖动调整放大镜大小,设置放大倍数

系列文章专栏:javafx图形绘制、桌面录屏录音源码合集 目录 一、实现的效果 二、实现思路 三、程序实现...

什么是客户忠诚度?建立忠诚文化的 5 种方法

客户忠诚度影响企业的各个方面,例如收入、品牌形象、预算分配和产品路线图。拥有忠实的客户群对于建立成功的企业至关重要,因为您的客户是您的主要拥护者,有助于为您的企业营造积极的氛围。 什么是客户忠诚度? 客户忠诚度衡量客户…...

【ROS2知识】关于colcon编译和ament指定

一、说明 这里说说编译和包生成的操作要点,以python包为例。对于初学者来说,colcon和ament需要概念上搞清楚,与此同时,工作空间、包、节点在一个工程中需要熟练掌握。本文以humble版的ROS2,进行python编程的实现。 二、…...

数据结构: 最小栈

最小栈的特色是保持栈后进先出的特性,同时能够以O(1)复杂度获得当前栈的最小值。 栈是比较好实现的,直接搞个链表,从头部删除和添加即可。 最小栈的核心逻辑是: 因为栈是后进先出的,因此栈顶元素之下的数字永远在栈…...

STM32之PWM

PWMPWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

32位寻址与64位寻址

32位寻址与64位寻址 32位寻址是什么&#xff1f; 32位寻址是指计算机的CPU、内存或总线系统使用32位二进制数来标识和访问内存中的存储单元&#xff08;地址&#xff09;&#xff0c;其核心含义与能力如下&#xff1a; 1. 核心定义 地址位宽&#xff1a;CPU或内存控制器用32位…...

【版本控制】GitHub Desktop 入门教程与开源协作全流程解析

目录 0 引言1 GitHub Desktop 入门教程1.1 安装与基础配置1.2 核心功能使用指南仓库管理日常开发流程分支管理 2 GitHub 开源协作流程详解2.1 Fork & Pull Request 模型2.2 完整协作流程步骤步骤 1: Fork&#xff08;创建个人副本&#xff09;步骤 2: Clone&#xff08;克隆…...

react更新页面数据,操作页面,双向数据绑定

// 路由不是组件的直接跳转use client&#xff0c;useEffect&#xff0c;useRouter&#xff0c;需3个结合&#xff0c; use client表示客户端 use client; import { Button,Card, Space,Tag,Table,message,Input } from antd; import { useEffect,useState } from react; impor…...

Shell 解释器​​ bash 和 dash 区别

bash 和 dash 都是 Unix/Linux 系统中的 ​​Shell 解释器​​&#xff0c;但它们在功能、语法和性能上有显著区别。以下是它们的详细对比&#xff1a; ​​1. 基本区别​​ ​​特性​​​​bash (Bourne-Again SHell)​​​​dash (Debian Almquist SHell)​​​​来源​​G…...