[Linux]文件系统

[Linux]文件系统

文件系统是操作系统的一部分,负责组织、存储和管理存储在外部设备上的文件和目录,也就是操作系统管理外设中的文件的策略。本文讲解的是Ext2文件系统。Linux操作系统使用的就是Ext系列的文件系统。

文章目录

  • [Linux]文件系统
    • 了解磁盘结构
      • 磁盘的物理结构
      • 磁盘存储结构
      • 磁盘逻辑结构
    • EXT2文件系统的存储方案
      • inode的具体应用
      • 补充细节
    • 软硬链接
      • 创建软硬链接
      • 软硬链接的区别
      • 软硬链接的使用场景
    • 文件的三个时间

了解磁盘结构

磁盘的物理结构

磁盘是计算机上的唯一的机械设备,作为外设用于存储大量的数据,磁盘内部的物理结构示意图如下:

image-20230714161627226

  • 磁盘(如上图的银色圆盘)-- 由多个盘片组成,每个盘片的每个面都能够存储数据
  • 磁头 – 每个盘片的每个面都有一个磁头,磁头能够在对应的盘面中读写数据

磁盘存储数据的原理: 计算机中的数据本质就是0和1的区别,因此磁盘只需要利用磁性来代表数据的0和1。

磁盘存储结构

image-20230905144406099

磁盘的每个盘片的盘面被划分成多个部分:

  • 磁道: 磁盘表面被分为许多同心圆,每个同心圆称为一个磁道,每个磁道都有一个编号,最外面的是0磁道。
  • 扇区: 每个磁道被划分成若干个扇区,每个扇区的存储容量为512字节,每个扇区都有一个编号。

磁盘以扇区为单位进行数据的存储,一个磁盘文件会占据一个或多个扇区的位置来存储,要想加载磁盘文件到内存中,需要定位到磁盘文件所在的一个或多个扇区。

image-20230714163115337

定位扇区的方法:

  • 定位数据所在的是哪一个盘面 – 也就是选择哪一个对应的磁头。
  • 定位数据在所在盘面的哪一个的磁道。
  • 定位数据在所在磁道中的哪一个扇区。

磁头(Heads)、柱面(Cylinder)(等价于磁道)、扇区(Sector)对应的编号。即可在磁盘上定位所要访问的扇区。这种磁盘数据定位方式叫做 CHS 。

磁盘逻辑结构

磁盘需要抽象成逻辑结构的原因:

  • OS是软件,磁盘是硬件,磁盘作为外设是可能被改变的,为了防止由于外设的改变而导致物理结构寻址方式的失败,OS采用逻辑地址,将逻辑与物理的转换交给中间软件层驱动程序,实现OS与外设的解耦
  • 磁盘存储的基本单位是512字节,OS为了减少IO次数,提高效率,一次IO操作的基本单位是4KB(可调整大小),OS将一次IO的基本单位看作为块,因此需要一套块级别地址进行访问

image-20230905154453166

磁盘的逻辑结构就类似于拉开的磁带,将一个盘片抽象成被拉开的磁带,一圈磁带就类似于一个磁道。逻辑结构示意图如下:

image-20230905194551006

扇区的大小是512字节,而OS一次IO操作的基本单位是4KB,因此OS将一次IO操作的数据抽象成数据块。逻辑结构示意图如下:

image-20230905194510903

OS将整个磁盘最终抽象成了多个连续的数据块,也就是将物理结构转换成了线性逻辑结构,因此OS能够将磁盘看作是有对应下标的数组结构,每个下标指向的是一个数据块,每一个下标也被称作逻辑块地址,简称LBA。OS将磁盘看作是数组结构后,每次IO操作就是找到数据块的首地址,然后从该地址开始读取对应个数的扇区。

EXT2文件系统的存储方案

OS将磁盘看作是由数组结构组织起来的数据块,由于数据块的数量众多,OS将该数组结构划分成多个分区。逻辑结构示意图如下:

image-20230905194607220

将磁盘进行分区后,OS为了更方便的管理,还将每个分区划分成多个分组。逻辑结构示意图如下:

image-20230905195029269

  • 磁盘众多分区中,一般第一个分区存在一个Boot Block区域,该区域存储着OS的开启相关信息,计算机进行开机操作时,会加载磁盘数据,并使用该区域的数据完成开机操作。

将磁盘划分为若干个分组后,OS将一个分组的管理策略运用到每个分组中,实现对整个磁盘的管理。OS的具体管理策略如下:

image-20230905195437760

  • Super Block: 记录该分区文件系统的重要信息,使得操作系统能够正确地使用和管理文件系统。

    • Linux系统采用Ext系列的文件系统。
    • Super Block在各个分组都可能存在,并且统一更新,是为了防止其损坏后,导致整个文件系统无法使用。
  • Group Descriptor Table: 记录改组的详细属性信息。

  • Block Bitmap: 每个bit表示一个Data Blocks中的数据块是否空闲可用,每个bit对应中的一个Data Blocks中的数据块。

  • inode Bitmap: 每个bit表示一个inode是否空闲可用,每个bit对应inode table中的一个inode。

  • inode Table: 记录该组所有文件的索引节点。

    • inode内部的记录的是对应的一个文件的所有属性,由于文件属性的可预见性,一个inode大小为128字节。
    • 每一个inode都有自己的inode编号,inode编号也数据对应文件的属性编号。
    • inode内部记录了对应文件内容存储的数据块编号。
  • Data blocks: 记录了文件的内容。

    • Data blocks区域内部被划分成了若干个大小为4KB的数据块。
    • 一个的文件的内容会根据大小使用若干个数据块。

分组中的以上每个区域都可能会使用若干个数据块。

inode的具体应用

  • Linux操作系统是通过文件的inode编号来区分文件的,inode节点中不记录文件名。

  • 目录作为文件也有自己的inode节点。

  • 目录文件中记录的是该目录下的文件的inode编号和文件名的映射关系。

  • Linux操作系统查询文件的过程:

    1. 在文件的对应目录下,找到对应文件的inode编号。
    2. 在对应目录所在的分区下找到对应inode编号所在的分组,结合inode table,找到文件的inode节点。
    3. 通过inode节点找到对应的数据块。
  • Linux操作系统删除文件的过程:

    1. 在文件的对应目录下,找到对应文件的inode编号。
    2. 在对应目录所在的分区下找到对应inode编号所在的分组,结合inode table,找到文件的inode节点。
    3. 将inode节点中记录的数据块对应在Block Bitmap中的位图置为0。
    4. 将inode节点对应在inode Bitmap中位图置为0。
  • Linux操作系统添加文件的过程:

    1. 在要创建文件所在的目录所在的分组中查询inode bitmap,找到未被使用inode。
    2. 将文件的属性写入新创建的inode。
    3. 将文件名和inode编号的映射关系追加到所处目录的文件数据块中。
  • Linux操作系统修改文件的过程:

    1. 在文件的对应目录下,找到对应文件的inode编号。
    2. 在对应目录所在的分区下找到对应inode编号所在的分组,结合inode table,找到文件的inode节点。如果是空文件会根据写入数据的大小分配相应的数据块,并将数据块对应位图置为1,将数据块信息写入inode。
    3. 将修改后的数据刷新写入到对应的数据块中。
  • Linux使用ls指令时带-i选项就可以查看到文件对应的inode编号:

image-20230906185210904

补充细节

文件的恢复

如果文件被误删后,首先要避免文件操作,以防被删除的文件数据被覆盖,然后通过日志记录等技术,找到被删除的文件对应的inode编号将inode编号对应位图置为1,对应数据块置为1,从而完成文件的恢复。

inode编号寻找对应分组的策略

在一个分区中,每个分组所使用的inode编号是有范围的,通过inode编号所在范围能够快速确定inode所在的分组。

分区和分组的完成

在安装操作系统时,会根据用户指定的各分区大小进行分区的设置,然后对会对每个分区进行格式化,格式化就是操作系统向分区写入文件系统管理信息的。

inode记录对应数据块的策略

inode节点中采用数组记录对应数据块,以至于inode节点的大小得以确定,但是如果数组中的一个数据只能对应一个数据块那么,一个inode节点能指向的数据块是有限的,因此inode节点采用三级索引的策略来映射对应的数据块,将该数组划分成三个部分,每个部分采用不同的索引方式。

  • 直接索引: 数组记录的数据块编号对应的数据块中就是文件内容。

image-20230906194729795

  • 二级索引: 数组记录的编号对应的数据块中记录的是其他数据块的编号,这些被记录在数据块中的数据块编号对应的数据块中存储的是文件内容。

image-20230906200755543

  • 三级索引: 数组记录的编号对应的数据块中记录的是其他数据块的编号,这些被记录在数据块中的数据块编号对应的数据块中存储的也是其他数据块的编号并且这些编号指向存储文件内容的数据块。

image-20230906200729829

inode映射的存在的问题

EXT2存储方案存在一个分组,数据块用完、inode没用完或者inode用完、数据块没用完的问题并且如果出现这种情况是无法解决的。

软硬链接

创建软硬链接

  • 创建软链接: 在Linux系统下ln -s 被链接的文件名 软链接名字指令能够创建软连接。

image-20230906204649180

  • 创建硬链接: 在Linux系统下ln 被链接的文件名 硬链接名字指令能够创建硬连接。

image-20230906204755632

软硬链接的区别

  • 软链接:

    • 软链接有自己的inode编号,是一个独立的文件
    • 软链接中存储的是链接文件的路径信息

    image-20230906205521110

  • 硬链接:

    • 硬链接和链接的文件共用同一个inode编号,硬链接和链接文件使用同一个inode
    • 硬链接创建的本质是在目录下添加一组inode编号和文件名的映射,并且在对应的inode中的引用计数进行+1操作
    • 当inode中引用计数为0代表该文件没有文件名和其inode编号映射,将删除该文件

image-20230906205541812

软硬链接的使用场景

  • 软链接适用于某一文件所在路径比较繁琐,可以不用进入路径或打出路径就可以访问文件,功能类似于Windows系统中的快捷方式。

image-20230906210227330

  • 硬链接使得Linux系统能够使用相对路径进行操作。

image-20230907101923784

实际上每个目录中的.就是一个硬链接,链接是当前目录,.硬链接实现了以相对路径访问当前目录文件的功能。

image-20230907102632778

在目录下创建一个新目录后,Linux系统会为新目录创建一个..硬链接,链接的就是上级目录,..硬链接实现了以相对路径访问上级目录文件的功能。

可以看出一个目录的硬链接数(目录中的..) = 目录下的目录数量 + 2(目录本身和目录中的.):

image-20230907103328715

注意: 用户不能给目录创建硬链接,避免出现路径环路问题,系统自己维护目录硬链接。

文件的三个时间

  • Access 最后访问时间
  • Modify 文件内容最后修改时间
  • Change 属性最后修改时间

stat 文件名查看文件信息,其中就有文件的这三个时间:

image-20230907104607935

访问文件时 ,Access时间就会进行更新:

image-20230907104658713

注意: 在最新的Linux版本中,为了节省IO操作造成的时间浪费,如果只是单纯的查看数据不一定会立刻修改Access时间。

修改文件内容时 ,Modify和Change时间都会进行更新:

image-20230907105102128

修改文件属性时 ,Change时间会进行更新:

image-20230907105256043

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

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

相关文章

如何选择合适的HTTP代理服务器

HTTP代理服务器是一种常见的网络代理方式,它可以帮助用户隐藏自己的IP地址,保护个人隐私和安全。然而,选择合适的HTTP代理服务器并不容易,需要考虑多个因素。本文将介绍如何选择合适的HTTP代理服务器。 了解代理服务器的类型 HTT…

Web Components详解-Shadow DOM插槽

前言 插槽实际上也属于组件通信的一种方式,但是由于其强大的api和实用性,我将其单独拆开来介绍。 定义 Slot(插槽)是Web Components中一个重要的特性,它允许在组件内部定义占位符,以便父组件可以向其中插…

【Java并发】聊聊ReentrantReadWriteLock锁降级和StampedLock邮戳锁

面试题 1.你说你用过读写锁,锁饥饿问题是什么? 2.有没有比读写锁更快的锁? 3.StampedLock知道吗?(邮戳锁/票据锁) 4.ReentrantReadWriteLock有锁降级机制策略你知道吗? 在并发编程领域,有多线程进行提升整体性能&…

流程图 and/or/xor 讲解

and表示后续2个活动同时触发, or表示后续2个活动可触发其中的1个或2个,无排他性,也就是每个活动的触发不影响其他活动; xor表示后续2个活动只触发一个,有排他性,也就是只能触发其中一个。 示例演示“OR”…

云原生Kubernetes:Yaml文件编写

目录 一、理论 1.Kubernetes与yaml文件 二、实验 1.Kubernetes与yaml文件 三、问题 1.kubectl create 和 kubectl apply区别 四、总结 一、理论 1.Kubernetes与yaml文件 (1)Kubernetes支持管理资源对象的文件格式 Kubernetes支持YAML 和JSON 格…

基于微信小程序的智能垃圾分类回收系统,附源码、教程

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 1 简介 视频演示地址: 基于微信小程序的智能垃圾分类回收系统,可作为毕业设计 小…

PDF文件太大怎么办?三招教会你PDF文件压缩

PDF文件太大怎么办?这是许多人在处理PDF文件时遇到的问题。为了帮助大家解决这个问题,下面总结了三个可以解决PDF文件过大问题的方法,需要的朋友抓紧来看看吧~ 方法一:使用嗨格式压缩大师 嗨格式压缩大师是一款功能强大的PDF压缩…

无涯教程-JavaScript - IMSECH函数

描述 IMSECH函数以x yi或x yj文本格式返回复数的双曲正割。复数的双曲正割被定义为双曲余弦的倒数,即 六(z) 1/cosh(z) 语法 IMSECH (inumber)争论 Argument描述Required/OptionalInumberA complex number for which you want the hyperbolic secant.Required Notes Ex…

手机usb连接电脑上网怎么做?掌握2个方法即可!

“我的电脑不知道怎么就连不上网络了,之前好像听说可以使用手机usb连接网络上网,但是不知道具体应该怎么操作。有没有知道详细操作步骤的朋友可以分享一下呀!” 在需要临时共享手机网络连接或电脑无法连接Wi-Fi的情况下,将手机通过…

【C++基础】实现日期类

​👻内容专栏: C/C编程 🐨本文概括: C实现日期类。 🐼本文作者: 阿四啊 🐸发布时间:2023.9.7 对于类的成员函数的声明和定义,我们在类和对象上讲到过,需要进行…

c++通过tensorRT调用模型进行推理

模型来源: 算法工程师训练得到的onnx模型 c对模型的转换: 拿到onnx模型后,通过tensorRT将onnx模型转换为对应的engine模型,注意:训练用的tensorRT版本和c调用的tensorRT版本必须一致。 如何转换: 算法工…

2020年12月 C/C++(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:数组指定部分逆序重放 将一个数组中的前k项按逆序重新存放。例如,将数组8,6,5,4,1前3项逆序重放得到5,6,8,4,1。 时间限制:1000 内存限制:65536 输入 输入为两行: 第一行两个整数,以空格分隔,分别为数组元素的个数n(1 < n…

在Qt5中SQLite3的使用

一、SQLite简要介绍 什么是SQLite SQLite是一个进程内的库&#xff0c;实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库&#xff0c;这意味着与其他数据库不一样&#xff0c;您不需要在系统中配置。 就像其他数据库&#xff0c;S…

基于javaweb的CT图像管理系统(servlet+jsp)

系统简介 本项目采用eclipse工具开发&#xff0c;jspservletjquery技术编写&#xff0c;数据库采用的是mysql&#xff0c;navicat开发工具。 三个角色&#xff1a;管理员&#xff0c;普通用户&#xff0c;医生 模块简介 管理员&#xff1a; 1、登录 2、用户管理 3、医生管…

ARM DIY(十)LRADC 按键

前言 ARM SOC 有别于单片机 MCU 的一点就是&#xff0c;ARM SOC 的 GPIO 比较少&#xff0c;基本上引脚都有专用的功能&#xff0c;因为它很少去接矩阵键盘、众多继电器、众多 LED。 但有时 ARM SOC 又需要三五个按键&#xff0c;这时候 LRADC 就是一个不错的选择&#xff0c;…

C# OpenVino Yolov8 Detect 目标检测

效果 项目 代码 using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using static System.Net.Mime.MediaT…

python趣味编程-数独游戏

数独游戏是一个用Python编程语言编写的应用程序。该项目包含可以显示实际应用程序的基本功能。该项目可以让修读 IT 相关课程并希望开发简单应用程序的学生受益。这个Python 数独游戏是一个简单的项目,可用于学习tkinter库的实践。这个数独游戏可以提供Python编程的基本编码技…

黑马JVM总结(三)

&#xff08;1&#xff09;栈内存溢出 方法的递归调用&#xff0c;没有设置正确的结束条件&#xff0c;栈会有用完的一天&#xff0c;导致栈内存溢出 可以修改栈的大小&#xff1a; 再次运行&#xff1a;减少了次数 案例二&#xff1a; 两个类的循环应用问题&#xff0c;导致Js…

linux-进程-execl族函数

exec函数的作用&#xff1a; 我们用fork函数创建新进程后&#xff0c;经常会在新进程中调用exec函数去执行另外一个程序。当进程调用exec函数时&#xff0c;该进程被完全替换为新程序。因为调用exec函数并不创建新进程&#xff0c;所以前后进程的ID并没有改变。 简单来说就是&…

如何使用聊天GPT自定义说明

推荐&#xff1a;使用 NSDT场景编辑器 快速搭建3D应用场景 OpenAI ChatGPT正在席卷全球。一周又一周&#xff0c;更新不断提高您可以使用这种最先进的语言模型做什么的标准。 在这里&#xff0c;我们深入研究了OpenAI最近在ChatGPT自定义指令上发布的公告。此功能最初以测试版…