【Linux】理解文件系统

news2024/10/3 8:28:35

文章目录

  • 理解文件系统
      • 了解磁盘结构
      • 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


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

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

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

相关文章

代码随想录算法训练营day46 | 动态规划之背包问题 139.单词拆分

day46139.单词拆分1.确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp[i]139.单词拆分 题目链接 解题思路:单词就是物品,字符串s就是背包,单词能否组成字符串s,就是问物品能不能把背包装满。…

NJ+SCU42做Modbus RTU从站

NJSCU42做Modbus RTU从站实验时间:2023.2.28 硬件设备:NJ501-1300,CJ1W-SCU42 软件:Sysmac Studio,Commix串口调试助手 案例简介:发送Modbus RTU命令读取NJ里的数据 1. 系统概述 264 ​ 本次实验使用C…

「TCG 规范解读」PC 平台相关规范(4)

可信计算组织(Ttrusted Computing Group,TCG)是一个非盈利的工业标准组织,它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立,并采纳了由可信计算平台联盟(the Trusted Computing Platform Alli…

3种方法找回命令提示符删除的文件

“电脑D盘有个文件没有权限删除,后面我使用cmd命令去强制删除,结果确认删除后盘中的其他文件没了,其中有我重要word文档,有什么办法恢复吗?求助大神!”——来自某某小伙伴的咨询文件丢失是一个不可预测但又…

RK3288-android8-es7210-阵列麦克风

ES7210驱动包 应需求调试一个ES7210的阵列麦克风 首先移植 From 234647c69a57c32198c65836e7fc521dc22e444b Mon Sep 17 00:00:00 2001 From: LuoXiaoTan <lxt@rock-chips.com> Date: Tue, 10 Jul 2018 18:08:50 -0700 Subject: [PATCH] ASoC: codecs: add es7210 adc …

linux下多线程调试,以及一些常用工具总结(pstack/pstree/stress/perf)

一、多线程调试使用gdb查看线程信息。&#xff08;1&#xff09;获取主线程id&#xff1a;ps -aux | grep 进程名称&#xff0c;例如&#xff1a;&#xff08;2&#xff09;查看线程信息&#xff1a;gdb attach 线程id&#xff0c;例如1和3表示进程启动运行依赖的库的信息&…

2023王道考研数据结构笔记第二章线性表

第二章 线性表 2.1 线性表的定义 2.1.1 线性表的基本概念 线性表是具有相同数据类型的n(n>0)个数据元素的有限序列&#xff0c;其中n为表长&#xff0c;当n0时线性表是一个空表。若用L命名线性表&#xff0c;则其一般表示为&#xff1a; L(a1,a2,...,ai,ai1,...,an)L(a_1…

泛微e-cology9 <0.56 存在sql注入漏洞

漏洞描述 泛微e-cology9 是一个 OA 系统。 泛微e-cology9 10.56 之前版本存在 sql 注入漏洞&#xff0c;攻击者可利用该漏洞读取或修改数据库中的敏感信息&#xff0c;进而操控管理系统。 漏洞名称泛微e-cology9 <0.56 存在sql注入漏洞漏洞类型SQL注入发现时间2023/2/23漏…

论文阅读-DISTILLING KNOWLEDGE FROM READER TORETRIEVER FOR QUESTION ANSWERING

论文链接&#xff1a;https://arxiv.org/pdf/2012.04584.pdf 目录 方法 交叉注意机制 交叉注意力得分作为段落检索的相关性度量 用于段落检索的密集双编码器 将交叉注意力分数提取到双编码器 数据集 方法 我们的系统由两个模块组成&#xff0c;即检索器和阅读器&#xf…

文献阅读 Image-to-Image Translation with Conditional Adversarial Networks

前言 本文中所使用的cGAN模型为上篇论文的main idea&#xff0c;这里再进行一下相关介绍。 题目 Image-to-Image Translation with Conditional Adversarial Networks 使用条件对抗网络实现图片到图片的翻译 摘要 我们研究了条件对抗网络作为图像到图像翻译问题的通用方案。…

【C++】inline 内联函数

文章目录&#x1f4d5; 概念&#x1f4d5; 使用前的准备&#x1f4d5; 使用&#x1f4d5; 特性&#x1f4d5; 概念 在 C 中&#xff0c;为了解决一些频繁调用的小函数大量消耗栈空间&#xff08;栈内存&#xff09;的问题&#xff0c;特别的引入了 inline 修饰符&#xff0c;表…

你需要同款“Unreal项目自动化编译、打包和部署”方案吗?

在过往几期的UWA Pipeline最佳实践案例中&#xff0c;我们分享了如何通过Pipeline实现性能优化、性能管理、游戏内容验收和云真机系统的应用&#xff08;实现批量真机设备的自动化测试&#xff0c;以及针对特效性能优化的方式&#xff09;&#xff0c;其实这些高效的方法并不局…

改进 YOLO V5 的密集行人检测算法研究(论文研读)——目标检测

改进 YOLO V5 的密集行人检测算法研究&#xff08;2021.08&#xff09;摘 要&#xff1a;1 YOLO V52 SENet 通道注意力机制3 改进的 YOLO V5 模型3.1 训练数据处理改进3.2 YOLO V5 网络改进3.3 损失函数改进3.3.1 使用 CIoU3.3.2 非极大值抑制改进4 研究方案与结果分析4.1 实验…

碰撞高校智慧,凝聚青春力量 | 因“AI”而“深”-高校开源专场顺利举办!

为聚焦AI新发展&#xff0c;探寻开源新环境&#xff0c;聆听高校声音&#xff0c;2月25日上午&#xff0c;第四届OpenI/O启智开发者大会以“因AI而深”为主题在深圳人才研修院举办高校开源专场&#xff0c;共同交流高校优质开源项目的发展经验、社区优秀开发者的心路历程及高校…

ROS2功能包Hello world(python)

文章目录环境准备Python创建工作空间、功能包及节点方法编译使用环境准备 为了便于日后复现&#xff0c;相关环境已经打包到docker中。 拉取docker镜像 docker pull 1224425503/ros2_foxy_full:latest新建容器 docker run -dit --rm --privilegedtrue --network host -e NV…

cnpm adduser 报错 409 Conflict

今天遇到一个问题&#xff0c;cnpm adduser 一直失败&#xff0c;返回 409 Conflict。 我们先来看下报错信息 409 Conflict - PUT http://registry.cnpm.xxxx.com.cn/-/user/org.couchdb.user:mingyu6 - conflict第一步 分析 http 错误码 409 Conflict&#xff1a;请求与服务…

Java函数式编程

从JDK8开始java支持函数式编程&#xff0c;函数式编程是面向数学的抽象&#xff0c;将计算描述为一种表达式求值&#xff0c;函数式程序就是一个表达式。JDK也提供了几个常用的函数式接口。 java的函数式编程还没有例如js那样的规范和深奥&#xff0c; 在函数式编程中&#xf…

蓝桥杯每日一题:不同路径数(dfs深度优先)

给定一个 nm的二维矩阵&#xff0c;其中的每个元素都是一个 [1,9] 之间的正整数。 从矩阵中的任意位置出发&#xff0c;每次可以沿上下左右四个方向前进一步&#xff0c;走过的位置可以重复走。 走了 k 次后&#xff0c;经过的元素会构成一个 (k1) 位数。 请求出一共可以走出…

浅谈功能测试和性能测试的区别

刚刚入门软件测试的宝子&#xff0c;可能经常会看到&#xff1a;功能测试、性能测试&#xff0c;这些到底是什么呀&#xff1f;那我就带大家了解一下~ 一、定义 功能测试 功能测试就是对产品的各功能进行验证&#xff0c;根据功能测试用例&#xff0c;逐项测试&#xff0…

操作指南:如何高效使用Facebook Messenger销售(二)

上一篇文章我们介绍了使用Facebook Messenger作为销售渠道的定义、好处及注意事项&#xff0c;本节我们将详细介绍怎么将Facebook Messenger销售与SaleSmartly&#xff08;ss客服&#xff09;结合&#xff0c;实现一站式管理多主页配图来源&#xff1a;SaleSmartly&#xff08;…